中国古建筑网站,如何快速网络推广,把wordpress装进app,苏州建站公司兴田德润简介呢带body的自定义标签#xff0c;尝试写一个标签#xff0c;这个标签可以迭代显示标签主体里面的内容#xff0c;迭代的次数由标签的属性指定. 首先#xff0c;要说明的是#xff0c;其实标签也是一个java类#xff0c;它是运行一个或两个接口的javabean,然后再配合标签描述…带body的自定义标签尝试写一个标签这个标签可以迭代显示标签主体里面的内容迭代的次数由标签的属性指定. 首先要说明的是其实标签也是一个java类它是运行一个或两个接口的javabean,然后再配合标签描述文件(以.tld为扩展名)两者结合就可以作出自己的自定义标签库了.呵呵是不是觉得有点眉目了 那么下面我们开始写一个自己的java标签类作为有body的标签这个类必须实现javax.servlet.jsp.tagext.BodyTag接口. 下面我们看一下BodyTag这个接口中定义了那些方法来支持tag public void doInitBody();
public void setBodyContent(javax.servlet.jsp.tagext.BodyContent);
public int doAfterBody();
public void release();
public javax.servlet.jsp.tagext.Tag getParent();
public void setParent(javax.servlet.jsp.tagext.Tag);
public int doEndTag();
public int doStartTag();
public void setPageContext(javax.servlet.jsp.PageContext); 说了这么多方法是不是有点头晕了呵呵那么究竟BodyTag的处理过程是怎么样的呢下面我们就来说一下它的处理流程 1.当容器创建一个新的标签实例后通过setPageContext来设置标签的页面上下文. 2.使用setParent方法设置这个标签的上一级标签如果没有上一级嵌套设置为null. 3.设置标签的属性这个属性在标签库描述文件中定义如果没有定义属性就不调用此类方法. 4.调用doStartTag方法这个方法可以返回EVAL_BODY_INCLUDE和SKIP_BODY当返回EVAL_BODY_INCLUDE时就计算标签的body如果返回SKIP_BODY就不再计算标签的body. 5.调用setBodyContent设置当前的BodyContent. 6.调用doInitBody如果计算BodyContent时需要进行一些初始化就在这个方法中进行. 7.每次计算完Body后调用doAfterBody如果返回EVAL_BODY_TAG表示继续计算一次Body直到返回SKIP_BODY才继续往下执行. 8.调用doEndTag方法这个方法可以返回EVAL_PAGE或者SKIP_PAGE当返回EVAL_PAGE时容器将在标签结束时继续计算JSP页面其他的部分如果返回SKIP_PAGE容器将在标签结束时停止计算JSP页面其他的部分. 9.调用release()方法释放标签程序占用的任何资源。 知道了标签处理的流程了那么下面我们就开始写一个自己的java类了 我的标签类的源码
package cn.com.wavenet.hydro.module.tag;import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;import org.apache.struts.util.RequestUtils;
import org.apache.struts.util.ResponseUtils;public class MydemoTag extends BodyTagSupport{private int counts;public MydemoTag() {super();}public void setCounts(int counts){this.counts counts;}public int doStartTag() throws JspTagException{System.out.println(doStartTag...);if (counts 0){return EVAL_BODY_TAG;//显示标签间的文字}else{return SKIP_BODY;//不显示标签间的文字}}public void setBodyContent(BodyContent bodyContent){System.out.println(setBodyContent...);this.bodyContent bodyContent;}public void doInitBody() throws JspTagException{System.out.println(doInitBody....);}public int doAfterBody() throws JspTagException{System.out.println(do After body... counts);if (counts 1){counts--;return EVAL_BODY_TAG;}else{return SKIP_BODY;}}public int doEndTag() throws JspTagException{System.out.println(do end Tag...);try{if (bodyContent ! null){bodyContent.writeOut(bodyContent.getEnclosingWriter());}}catch (java.io.IOException e) { throw new JspTagException(IO Error: e.getMessage()); } return SKIP_PAGE; //SKIP_PAGE EVAL_PAGE} }dtl文件
?xml version1.0 encodingUTF-8?
!DOCTYPE taglib PUBLIC -//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd
taglib
tlibversion1.0/tlibversion
jspversion1.1/jspversion
shortnameApplication Tag Library/shortname
urihttp://jakarta.apache.org/taglibs/struts-example-1.0/uri
infotag loop/info
tag
nameloop/name
tagclasscn.com.wavenet.hydro.module.tag.MydemoTag/tagclass
bodycontentJSP/bodycontent
attribute
namecounts/name
requiredtrue/required
rtexprvaluetrue/rtexprvalue
/attribute
/tag
/taglib 我们对这个文件进行一个小小的说明 最重要的是上面的黑体字部分其他的部分我们可以拷贝粘贴就可以了。 tag中的name属性定义了我们的tag名称在后面会用到。 tag中的tagclass属性指定了我们这个tag的实现类。 tage中的bodycontent属性指定我们的页面内容是什么性质的。(注意在jsp开发中这里必须写JSP) tage中的attribute属性定义了我们的这个tag可能有的属性。 attribute中的name属性指定了属性的名称。它和我们类中定义的“int counts;”必须一样并且在类中还必须包含一个setCounts(int counts)方法否则这个属性就不能设置。 attribute中的required属性表示这个属性是否是必须的。 attribute中的rtexprvalue属性表示这个属性是否可以用JSP的程序段的结果输出。 现在我们的tag就写完了下面就是我们怎么在页面中用了。 首先我们要在web.xml中声明这个tag 我的web.xml源码 span stylewhite-space:pre /spantaglib taglib-uridemotag/taglib-uri taglib-location/WEB-INF/tld/struts-mydemo.tld/taglib-location /taglib jsp页面 % page languagejava importjava.util.* contentTypetext/html; charsetUTF-8%% taglib uridemotag prefixdemo % html
%include file/hydro/jsp/plugin/util.jsp %% taglib prefixlogic uri/WEB-INF/struts-logic.tld%% taglib prefixbean uri/WEB-INF/struts-bean.tld%% taglib prefixhtml uri/WEB-INF/struts-html.tld%% taglib prefixextend uri/WEB-INF/struts-extend.tld%
head
meta http-equivContent-Type contenttext/html; charsetISO-8859-1
titleInsert title here/title
/head
body
hello world
br/
br/
demo:loop counts4
现在时间是%new java.util.Date().toString()%br/
/demo:loop
br/
hahabr/
哈哈哈/body
/html 页面会出现显示结果 hello world hahaha 现在时间是Fri Apr 22 16:00:34 CST 2016 现在时间是Fri Apr 22 16:00:34 CST 2016 现在时间是Fri Apr 22 16:00:34 CST 2016 现在时间是Fri Apr 22 16:00:34 CST 2016 ----下面说下TagSupport与BodyTagSupport的区别大家也就会明白为什么没显示哈哈哈了
1、 TagSupport与BodyTagSupport的区别 TagSupport与BodyTagSupport的区别主要是标签处理类是否需要与标签体交互如果不需要交互的就用TagSupport否则如果需要交互就用BodyTagSupport。 交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。 用TagSupport实现的标签都可以用BodyTagSupport来实现因为BodyTagSupport继承了TagSupport。 2 、doStartTag(),doEndTag()doAfterBody(), doStartTag()方法是遇到标签开始时会呼叫的方法其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字后者表示不显示标签间的文字 doEndTag()方法是在遇到标签结束时呼叫的方法其合法的返回值是EVAL_PAGE与 SKIP_PAGE前者表示处理完标签后继续执行以下的JSP网页后者是表示不处理接下来的JSP网页 doAfterBody()这个方法是在显示完标签间文字之后呼叫的其返回值有EVAL_BODY_AGAIN与SKIP_BODY前者会再显示一次标签间的文字后者则继续执行标签处理的下一步。 EVAL_BODY_INCLUDE把Body读入存在的输出流中doStartTag()函数可用 EVAL_PAGE继续处理页面doEndTag()函数可用 SKIP_BODY忽略对Body的处理doStartTag()和doAfterBody()函数可用 SKIP_PAGE忽略对余下页面的处理doEndTag()函数可用 EVAL_BODY_TAG已经废止由EVAL_BODY_BUFFERED取代 EVAL_BODY_BUFFERED申请缓冲区由setBodyContent()函数得到的BodyContent对象来处理tag的body如果类实现了BodyTag那么doStartTag()可用否则非法