jsp自定义嵌套标签

来源:互联网 发布:mysql 触发器 可靠性 编辑:程序博客网 时间:2024/05/21 09:58

 1.定义标签实现类

ParentTag.java

[java] view plaincopy
  1. import java.io.IOException;  
  2. import java.util.HashMap;  
  3. import java.util.Iterator;  
  4. import java.util.Map;  
  5. import java.util.Set;  
  6. import javax.servlet.jsp.JspException;  
  7. import javax.servlet.jsp.JspWriter;  
  8. import javax.servlet.jsp.tagext.TagSupport;  
  9. public class ParentTag extends TagSupport {  
  10.     private static final long serialVersionUID = 1L;  
  11.       
  12.     private Map<String,String> map = new HashMap<String,String>();  
  13.     //标签属性id  
  14.     private String id ;  
  15.     public String getId(){  
  16.         return id;  
  17.     }  
  18.     public void setId(String id){  
  19.         this.id = id;  
  20.     }  
  21.     //该方法在子标签中调用,给父标签中的map赋值  
  22.     public void addValue(String key,String value){  
  23.         map.put(key,value);  
  24.     }  
  25.     /** 
  26.      *  doStartTag()方法返回一个整数值,用来决定程序的后续流程。  
  27.      * A.Tag.SKIP_BODY:表示标签之间的内容被忽略  
  28.      * B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行  
  29.      */  
  30.     public int doStartTag() throws JspException {  
  31.         JspWriter out = pageContext.getOut();  
  32.         try {  
  33.             Set<String> keySet = map.keySet();  
  34.             Iterator<String> it = keySet.iterator();  
  35.             while(it.hasNext()){  
  36.                 String key = it.next();  
  37.                 String value = map.get(key);  
  38.                 out.write(key +": <input type='text' name="+key+" value="+value+" /><br>");  
  39.             }  
  40.         } catch (IOException e) {  
  41.             e.printStackTrace();  
  42.         }  
  43.         return EVAL_BODY_INCLUDE;  
  44.     }  
  45.     /**  
  46.      *  doEndTag:当JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag()方法也返回一个整数值,用来决定程序后续流程。  
  47.      *  A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。  
  48.      *  B.Tag.EVAL_PAGE:表示按照正常的流程继续执行JSP网页  
  49.      */  
  50.     public int doEndTag() throws JspException {  
  51.         return EVAL_PAGE;  
  52.     }  
  53. }  

 

ChildTag.java

[java] view plaincopy
  1. import javax.servlet.jsp.JspException;  
  2. import javax.servlet.jsp.tagext.TagSupport;  
  3. public class ChildTag extends TagSupport {  
  4.       
  5.     private static final long serialVersionUID = 1L;  
  6.     //定义标签属性key,value  
  7.     private String key;  
  8.     private String value;  
  9.     public String getKey(){  
  10.         return key;  
  11.     }  
  12.     public void setKey(String key){  
  13.         this.key = key;  
  14.     }  
  15.     public String getValue(){  
  16.         return value;  
  17.     }  
  18.     public void setValue(String value){  
  19.         this.value = value;  
  20.     }  
  21.       
  22.     public int doStartTag() throws JspException {  
  23.         ParentTag pTag = (ParentTag) this.getParent();  
  24.         //调用父标签的addValue方法,给父标签中的map赋值  
  25.         pTag.addValue(key,value);  
  26.         return EVAL_BODY_INCLUDE;  
  27.     }  
  28.     public int doEndTag() throws JspException {  
  29.         return EVAL_PAGE;  
  30.     }  
  31. }  

2.编写nested.tld文件

[xhtml] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE taglib  
  3.   PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"  
  4.   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">  
  5. <taglib>  
  6.     <tlib-version>1.0</tlib-version>  
  7.     <jsp-version>2.0</jsp-version>  
  8.     <short-name>nest</short-name>  
  9.     <uri>/nests/nested.tld</uri>  
  10.     <!-- 父标签 -->  
  11.     <tag>  
  12.         <name>parent</name>  
  13.         <tag-class>tag.nested.ParentTag</tag-class>  
  14.         <!-- scriptless 主体可以有内容, 而jsp容器会去处理里面的jsp元素, 换句话就是可以是文本, EL表达式,   
  15.         标准动作甚至另一个自定义标记. -->  
  16.         <body-content>scriptless</body-content>  
  17.         <attribute>  
  18.             <name>id</name>  
  19.             <required>true</required>  
  20.             <!-- rtexprvalue 是否允许表达式 不允许时${1+1}出错 -->  
  21.             <rtexprvalue>false</rtexprvalue>  
  22.         </attribute>  
  23.     </tag>  
  24.     <!-- 子标签 -->  
  25.     <tag>  
  26.         <name>child</name>  
  27.         <tag-class>tag.nested.ChildTag</tag-class>  
  28.         <body-content>empty</body-content>  
  29.         <attribute>  
  30.             <name>key</name>  
  31.             <required>true</required>  
  32.             <!-- rtexprvalue 是否允许表达式 不允许时${1+1}出错 -->  
  33.             <rtexprvalue>true</rtexprvalue>  
  34.         </attribute>  
  35.         <attribute>  
  36.             <name>value</name>  
  37.             <required>true</required>  
  38.             <!-- rtexprvalue 是否允许表达式 不允许时${1+1}出错 -->  
  39.             <rtexprvalue>true</rtexprvalue>  
  40.         </attribute>  
  41.     </tag>  
  42. </taglib>  

3.配置web.xml

[xhtml] view plaincopy
  1. <jsp-config>  
  2.         <taglib>  
  3.             <taglib-uri>/nest-tag</taglib-uri>  
  4.             <taglib-location>/WEB-INF/tlds/nested.tld</taglib-location>  
  5.         </taglib>  
  6.     </jsp-config>  

4.编写测试网页

nested.jsp

[xhtml] view plaincopy
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <%@ taglib prefix="nest" uri="/WEB-INF/tlds/nested.tld" %>  
  4. <%@ taglib prefix="n" uri="/nests/nested.tld" %>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  6. <html>  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  9. <title>Insert title here</title>  
  10. </head>  
  11. <body>  
  12.     <nest:parent id="1">  
  13.         <nest:child key="key1" value="value1"/>  
  14.         <nest:child key="key2" value="value2"/>  
  15.     </nest:parent>  
  16.       
  17.     <n:parent id="2">  
  18.         <n:child key="key3" value="value3"/>  
  19.         <n:child key="key4" value="value4"/>  
  20.     </n:parent>   
  21. </body>  
  22. </html>  

 

至此完成嵌套标签的编写

部署应用,访问nested.jsp就能看到效果了

原创粉丝点击