jsp中自定义Taglib详解(3)

A.name:属性名称;
B.required:属性是否必需的,默认为false;
C.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式。

八、在Web应用中使用标签

1、如果Web应用中用到了自定义JSP标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库

/sometaglib
/WEB-INF/someTLD.tld

2、设定Tag Library的惟一标示符,在Web应用中将根据它来引用Tag Libray;

3、指定和Tag Library对应的TLD文件的位置;

4、在JSP文件中需要加入<!-- taglib% >指令来声明对标签库的引用。

5、prefix表示在JSP网页中引用这个标签库的标签时的前缀,uri用来指定Tag Library的标识符,它必须和web.xml中的属性保持一致。

九、案例:

4.1.创建标签描述符文件

在WEB-INF文件下创建*.tld标签描述符文件:如

<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>eRedLab JSPTag Library</shortname>
<uri>/testTag</uri>
<info>自定义标签测试</info>
<tag>
 <name>hello</name>
 <tagclass>com.eredlab.taglib.test.TestTld</tagclass>
 <bodycontent>empty</bodycontent>
 <info>自定义标签测试</info>
 <attribute>
 <name>begin</name>
 <required>true</required>
 </attribute>
 <attribute>
 <name>end</name>
 <required>true</required>
 </attribute>
</tag>
</taglib>

4.2.创建标签处理器
/**
* @desc 自定义标签测试类 实现一个简单的Hello World标签
* @author  夏中伟
* @version eRedLab 2007-9-10
*/
public class TestTld extends TagSupport{
//标签属性begin
private String begin = null;
//标签属性end
private String end = null;
//构造函数
public TestTld(){

}

/* 标签初始方法 */
public int doStartTag() throws JspTagException{
 return super.EVAL_BODY_INCLUDE;
}

/* 标签结束方法 */
public int doEndTag() throws JspTagException{
 JspWriter out = pageContext.getOut();
 String sum = begin + end;
 try{
 //标签的返回值
out.println(sum);
 }catch(IOException e){
 e.printStackTrace();
 }
 return super.SKIP_BODY;
}

/* 释放资源 */
public void release(){
 super.release();
}
/********************************************
属性get()、set()方法
*******************************************/
}

在Web.XML中加载标签描述符文件.
<!-- 加载标签描述符文件 -->
<taglib>
 <taglib-uri>/WEB-INF/test.tld</taglib-uri>
 <taglib-location>/WEB-INF/test.tld</taglib-location>
</taglib>

5.2.在JSP中使用此标签
<%@ taglib uri="/testTag" prefix="mytag"%>
<mytag:hello end="夏中伟!" begin="自定义标签输出流:Hello,"/>
<mytag:hello end="World!" begin="Hi,"/>
WEB页面输出结果如下:
自定义标签输出流:Hello,夏中伟! Hi,World!

循环标签体类:ForEach.java  1import java.util.Collection;  2import java.util.Iterator;  3  4import javax.servlet.jsp.JspException;  5import javax.servlet.jsp.tagext.BodyContent;  6import javax.servlet.jsp.tagext.BodyTagSupport;  7  8public class ForEach  extends BodyTagSupport  9{ 10  private String id; 11  private String collection; 12  private Iterator iter; 13  14  public void setCollection(String collection) 15  { 16    this.collection = collection; 17  } 18  public void setId(String id) 19  { 20    this.id = id; 21  } 22  23  //遇到开始标签执行 24  public int doStartTag() throws JspException 25  { 26    Collection coll = (Collection) pageContext.findAttribute(collection); 27    // 表示如果未找到指定集合,则不用处理标签体,直接调用doEndTag()方法。 28    if(coll==null||coll.isEmpty()) return SKIP_BODY; 29    30    iter = coll.iterator(); 31    pageContext.setAttribute(id, iter.next()); 32    // 表示在现有的输出流对象中处理标签体,但绕过setBodyContent()和doInitBody()方法 33    // 这里一定要返回EVAL_BODY_INCLUDE,否则标签体的内容不会在网页上输出显示 34    return EVAL_BODY_INCLUDE; 35  } 36  37  //在doInitBody方法之前执行,在这里被绕过不执行 38  @Override 39  public void setBodyContent(BodyContent arg0) 40  { 41    System.out.println("setBodyContent"); 42    super.setBodyContent(arg0); 43  } 44  //此方法被绕过不会被执行 45  @Override 46  public void doInitBody() throws JspException 47  { 48    System.out.println("doInitBody"); 49    super.doInitBody(); 50  } 51  52  //遇到标签体执行 53  public int doAfterBody() throws JspException 54  { 55    if(iter.hasNext()) 56    { 57      pageContext.setAttribute(id, iter.next()); 58      return EVAL_BODY_AGAIN;// 如果集合中还有对像,则循环执行标签体 59    } 60    return SKIP_BODY;//迭代完集合后,跳过标签体,调用doEndTag()方法。 61  } 62  63  //遇到结束标签执行 64  public int doEndTag() throws JspException 65  { 66    System.out.println("doEndTag"); 67    return EVAL_PAGE; 68  } 69 70}  获取VO属性类:GetProperty.java  1import java.lang.reflect.Method;  2  3import javax.servlet.jsp.JspException;  4import javax.servlet.jsp.tagext.BodyTagSupport;  5  6public class GetProperty extends BodyTagSupport  7{  8  9  private String name; 10  private String property; 11 12  public void setName(String name) 13  { 14    this.name = name; 15  } 16 17  public void setProperty(String property) 18  { 19    this.property = property; 20  } 21 22  @SuppressWarnings("unchecked") 23  public int doStartTag() throws JspException 24  { 25    try 26    { 27      Object obj = pageContext.findAttribute(name); 28      29      if (obj == null) return SKIP_BODY; 30      31      Class c = obj.getClass(); 32      //构造GET方法名字 get+属性名(属性名第一个字母大写) 33      String getMethodName = "get" + property.substring(0, 1).toUpperCase() 34                              + property.substring(1, property.length()); 35      Method getMethod = c.getMethod(getMethodName, new Class[]{}); 36      37      pageContext.getOut().print(getMethod.invoke(obj)); 38      System.out.print(property + ":" + getMethod.invoke(obj) + "t"); 39    } catch (Exception e) 40    { 41      e.printStackTrace(); 42    } 43    return SKIP_BODY; 44  } 45 46  public int doEndTag() throws JspException 47  { 48    return EVAL_PAGE; 49  } 50} 51 52表达式直接访问此类中静态的方法:ELFunction.java 53public class ELFunction 54{ 55 public static int add( int i,int j ) 56 { 57  return i+j; 58 } 59}   写一个测试用的VO类:UserVo.java  1public class UserVo  2{  3  private String name;  4  private String password;  5   6  public String getName()  7  {  8    return name;  9  } 10  public void setName(String name) 11  { 12    this.name = name; 13  } 14  public String getPassword() 15  { 16    return password; 17  } 18  public void setPassword(String password) 19  { 20    this.password = password; 21  } 22}   建好TLD文件tag.tld,放在WEB-INF目录下  1<?xml version="1.0" encoding="utf-8"?>  2<taglib version="2.0"  3 xmlns="http://java.sun.com/xml/ns/j2ee"  4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  5 xmlns:shcemalocation="http://java.sun.com/xml/ns/j2ee  6 ">  7  8 <description>自定义标签</description>  9 <display-name>JSTL core</display-name> 10 <tlib-version>1.1</tlib-version> 11 <short-name>firstLabel</short-name> 12 <uri></uri> 13 14 <!-- 创建自定义 迭代标签 --> 15 <tag> 16  <name>forEach</name> 17  <tag-class>exercise.taglib.ForEach</tag-class> 18  <!-- 如果没有标签体,设置empty , 如果有标签休必须设置JSP--> 19  <body-content>JSP</body-content> 20  <attribute> 21   <name>id</name> 22   <required>true</required><!-- 标识属性是否是必须的 --> 23   <rtexprvalue>true</rtexprvalue><!-- 标识属性值是否可以用表达式语言 --> 24  </attribute> 25  <attribute> 26   <name>collection</name> 27   <required>true</required> 28   <rtexprvalue>true</rtexprvalue> 29  </attribute> 30 </tag> 31 32 <!-- 创建自定义获得属性标签 --> 33 <tag> 34  <name>getProperty</name> 35  <tag-class>exercise.taglib.GetProperty</tag-class> 36  <body-content>empty</body-content> 37  <attribute> 38   <name>name</name> 39   <required>true</required> 40   <rtexprvalue>true</rtexprvalue> 41  </attribute> 42  <attribute> 43   <name>property</name> 44   <required>true</required> 45   <rtexprvalue>true</rtexprvalue> 46  </attribute> 47 </tag> 48 49 <!-- 配置一个表达式调用 的函数 --> 50    <function> 51     <name>add</name><!-- 配置一个标签,在JSP页面通过引用前缀调用 --> 52     <function-class>exercise.taglib.ELFunction</function-class><!-- 实现类 --> 53     <function-signature>int add(int,int)</function-signature><!-- 静态的方法:包括返回类型,方法名,入参的类型 --> 54    </function> 55</taglib>

在web.xml文件中配置自定义标签

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzjpwf.html