JSP 2.x 自定义标签

n672 6年前

JSP 1.x的标签,虽然使用起来非常灵活,但是比较复杂,JSP 2.x提供了一组简化的标签写法


SimpleTagSupport是SimpleTag接口的子类,同时支持参数和标签体,最核心的方法时doTage

public AddTag extends SimpleTagSupport{        private int num1;        private int num2;           public void doTag() throws JspException,IOException{               this.getJspContext.getOut().write("两数相加等于:"+(num1+num2));        }        //省略setter、getter方法  }
 


同样是实现了计算两数之和的功能,配置与JSP1.x 一样

JSP 1.x的标签体是通过setBodyContent注入到BodyTag,通过getBodyContent取出来的。而SimpleTag是通过一种叫jspFragment的对象实例实现的

//此标签用于将字符转换成大写  public void doTag() throws JspException,IOException{                             StringWriter writer = newStringWriter();               JspFragment jspFragment = this.getJspBody();     //通过invoke输出到指定的writer中,如果参数为空,则输出到默认的writer, //即getJspContext().getOut()                  jspFragment.invoke(writer);               String content =writer.getBuffer().toString();               this.getJspContext().getOut().print(content.toUpperCase());        }

 


配置如下


<tag>        <name>tagname</name>        <tagclass>com.chen.tags.TagTest</tagclass>        <bodycontent>tagdependent</bodycontent >        <info>tag information</info>  </tag>


这里的<bodycontent>只能是tagdependent,而不能是JSP或者bodycontent

与JSP 1.x不同的是,JSP 2.x标签可以有多个标签体,并且可以按照不同顺序,不同的次数分别调用标签体,多个标签体需要借助JSP的<jsp:attribute>,而且在tld配置的时候,必须配合为fragment类型


<attribute>               <name>body1</name>               <required>false</ required>               <fragment>true</fragment >  </attribute>