名扬数据:JSP自定义标签实现数据字典

1关于JSP标签的好处就不再罗嗦

只要定义使用那个字典就会将这个字典可用的内容显示进去数据字典就是使用的下拉框。

显示字典时只要定义那个字典和属性值就可以显示出字典的显示值

两个属性分别是引用的URI和加载路径2首先在web.xml中定义自定义标签加载的引用。

<?xmlversion="1.0"encoding="UTF-8"?>   

<web-appversion="2.5"xmlns="http://java.sun.com/xml/ns/javaee"   

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   

   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee      

   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">   

   <welcome-file-list>   

       <welcome-file>index.jsp</welcome-file>   

   </welcome-file-list>   

   <jsp-config>   

       <taglib>   

           <taglib-uri>/tld/web-html</taglib-uri>   

           <taglib-location>   

               /WEB-INF/tlds/web-html.tld   

           </taglib-location>   

       </taglib>   

   </jsp-config>   

</web-app>  

数据字典应用的话我需要一个标签库,3web-html.tld中定义自己的标签。三个标签。分别是select标签,option标签,和现实数据字典的标签,每个标签都对应不同的实现类

<?xmlversion="1.0"encoding="UTF-8"?>   

Inc.//DTDJSPTagLibrari1.2//EN"     <!DOCTYPEtaglibPUBLIC"-//SunMicrosystems.

   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">   

<taglib>   

   <tlib-version>1.0</tlib-version><!--标签库版本 -->   

   <jsp-version>1.2</jsp-version> <!--标签库要求的JSP规范版本 -->   

   <short-name>html</short-name>  <!--JSP页面编写工具可以用来创建助记名的可选名字 -->   

   <tag>   

       <name>select</name>   

       <tag-class>com.SelectTag</tag-class>   

       <body-content>JSP</body-content>   

       <attribute>   

           <name>name</name>   

           <rtexprvalue>true</rtexprvalue>   

       </attribute>   

       <attribute>   

           <name>style</name>   

           <rtexprvalue>true</rtexprvalue>   

       </attribute>   

   </tag>   

   <tag>   

       <name>options</name>   

       <tag-class>com.OptionsTag</tag-class>   

       <body-content>JSP</body-content>   

       <attribute>   

           <name>collection</name>   

           <rtexprvalue>true</rtexprvalue>   

       </attribute>   

   </tag>   

   <tag>   

       <name>selectDisplay</name>   

       <tag-class>com.SelectDisplay</tag-class>   

       <body-content>JSP</body-content>   

       <attribute>   

           <name>collection</name>   

           <rtexprvalue>true</rtexprvalue>   

       </attribute>   

       <attribute>   

           <name>name</name>   

           <rtexprvalue>true</rtexprvalue>   

       </attribute>   

       <attribute>   

           <name>value</name>   

           <rtexprvalue>true</rtexprvalue>   

       </attribute>   

   </tag>   

</taglib>  

4实现类

然后由JSP进行输出实现类的作用就是后台拼接所需HTML标签内容。

一个遇到这个标签开始时输出,实现类最主要的两个方法。一个是结束时输出

可以参考实现类定义属性,如果需要定义属性。并在TLD中定义,JSP中使用标签时快捷键就可以进去这个属性

首先是select标签的代码:

packagcom;   

importjava.io.IOException;   

importjavax.servlet.jsp.JspException;   

importjavax.servlet.jsp.JspTagException;   

importjavax.servlet.jsp.tagext.BodyTagSupport;   

/**  

 *TagSupport与BodyTagSupport区别:  

如果不需要就用TagSupport否则就用BodyTagSupport   *主要看标签处置类是否要读取标签体的内容和改变标签体返回的内容。

都可以用BodyTagSupport来实现, *用TagSupport实现的标签。因为BodyTagSupport继承了TagSupport  

 */   

@SuppressWarn"serial"   

publicclassSelectTagextendBodyTagSupport{   

   @Override   

   publicintdoStartTagthrowJspException{   

       try{   

           StringBuffresult=newStringBuff"<select";   

           ifname!=null{   

               results.append"name=\"";   

               results.appendname;   

               results.append"\"";   

           }   

           ifstyle!=null{   

               results.append"style=\"";   

               results.appendstyle;   

               results.append"\"";   

           }   

           results.append">";   

           pageContext.getOut.writeresults.toStr;   

       }catchIOExceptionex{   

           thrownewJspTagExcept"错误";   

       }   

       returnEVA L_BODY_INCLUDE;   

   }   

   @Override   

   publicintdoEndTagthrowJspException{   

       try{   

           StringBuffresult=newStringBuff"";   

所以只能在遇到结束标签时才能写select结束              //因为下拉中包括下拉内容。

           results.append"</select>";             

           pageContext.getOut.writeresults.toStr;   

       }catchIOExceptionex{   

           thrownewJspTagExcept"错误";   

       }   

       returnEVA L_PA GE;   

   }   

   //样式   

   protectStringstyle;   

   //名字   

   protectStringname;   

   publicStringgetStyl{   

       returnstyle;   

   }   

   publicvoidsetStylStringstyle{   

       this.styl=style;   

   }   

   publicStringgetNam{   

       returnname;   

   }   

   publicvoidsetNamStringname{   

       this.nam=name;   

   }      

   /**  

其合法的返回值是EVA L_BODY_INCLUDE与SKIP_BODY,   doStartTag方法是遇到标签开始时会呼叫的方法。前者表示将显示标签间的文字,后者表示不显示标签间的文字  

其合法的返回值是EVA L_PA GE与SKIP_PA GE前者表示处置完标签后继续执行以下的JSP网页,   doEndTag方法是遇到标签结束时呼叫的方法。后者是表示不处置接下来的JSP网页  

后者则继续执行标签处置的下一步     doA fterBodi,这个方法是显示完标签间文字之后呼叫的其返回值有EVA L_BODY_A GA IN与SKIP_BODY前者会再显示一次标签间的文字。

doStartTag函数可用     EVA L_BODY_INCLUDE把Bodi读入存在输出流中。

doEndTag函数可用     EVA L_PA GE继续处置页面。

doStartTag和doA fterBodi函数可用     SKIP_BODY忽略对Bodi处置。

doEndTag函数可用     SKIP_PA GE忽略对余下页面的处置。

由setBodyCont函数得到BodyCont对象来处理tagbodi如果类实现了BodyTag那么doStartTag可用,   EVA L_BODY_BUFFERED申请缓冲区。否则非法  

   EVA L_BODY_A GA IN请求继续处置bodi返回自doA fterBodi这个返回值在制作循环tag时候是很有用的    

doA fterBodyTag返回SKIP_BODY,   预定的处置顺序是doStartTag返回SKIP_BODY.doEndTag返回EVA L_PA GE  

如果没有改写任何的方法,   如果继承了TagSupport之后。标签处置的执行顺序是doStartTag->不显示文字 ->doEndTag->执行接下来的网页   

则必需指定返回值,   如果您改写了doStartTag.  

则执行顺序是doStartTag->显示文字->doA fterBodyTag->doEndTag->执行下面的网页     如果指定了EVA L_BODY_INCLUDE.

    */   

}  

返回具体数字也可以,关于返回参数。不用过于纠结

然后是下拉内容实现类

packagcom;   

importjava.io.IOException;   

importjavax.servlet.jsp.JspException;   

importjavax.servlet.jsp.JspTagException;   

importjavax.servlet.jsp.tagext.BodyTagSupport;   

@SuppressWarn"serial"   

publicclassOptionsTagextendBodyTagSupport{   

   @Override   

   publicintdoStartTagthrowJspException{   

       returnEVA L_BODY_INCLUDE;   

   }   

   @Override   

   publicintdoEndTagthrowJspException{   

       try{   

           StringBuffresult=newStringBuff"";   

           if"SEX".equalcollect{   

               results.append"<optionvalue=\"0\" selected=\"selected\">请选择</option>";   

               results.append"<optionvalue=\"1\">男</option>";   

               results.append"<optionvalue=\"2\">女</option>";   

           }   

           pageContext.getOut.writeresults.toStr;   

       }catchIOExceptionex{   

           thrownewJspTagExcept"错误";   

       }   

       returnEVA L_PA GE;   

   }   

具体下拉值内容是从数据库取还是从请求中得到为不同具体实现      //collect只是传送一个标识。

   protectStringcollection;   

   publicStringgetCollect{   

       returncollection;   

   }   

   publicvoidsetCollectStringcollect{   

       this.collect=collection;   

   }   

}  

可以自定义实现具体你字典数据从数据库中如何存储如何查询。

为了将来可以在页面取到标签内容值,显示的标签实现。定义隐藏域来保管属性值,然后在显示显示内容

packagcom;   

importjava.io.IOException;   

importjavax.servlet.jsp.JspException;   

importjavax.servlet.jsp.JspTagException;   

importjavax.servlet.jsp.tagext.BodyTagSupport;   

@SuppressWarn"serial"   

publicclassSelectDisplaiextendBodyTagSupport{   

   @Override   

   publicintdoStartTagthrowJspException{   

       try{   

           StringBuffresult=newStringBuff"";   

           pageContext.getOut.writeresults.toStr;   

       }catchIOExceptionex{   

           thrownewJspTagExcept"错误";   

       }   

       returnEVA L_BODY_INCLUDE;   

   }   

   @Override   

   publicintdoEndTagthrowJspException{   

       try{   

           StringBuffresult=newStringBuff"";   

           if"SEX".equalcollect{   

               results.append"<span>";   

               results.append"<inputtype=\"";   

               results.append"hidden\"name=\"";   

               results.appendgetNam;   

               results.append"\"";   

               results.append"value=\"";   

               results.appendgetValu;   

               results.append"\">";                  

               if"1".equalgetValu{   

                   results.append"男";   

               }elsif"2".equalgetValu{   

                   results.append"女";   

               }els{   

                   results.append"请选择";   

               }   

               results.append"</span>";   

           }   

           pageContext.getOut.writeresults.toStr;   

       }catchIOExceptionex{   

           thrownewJspTagExcept"错误";   

       }   

       returnEVA L_PA GE;   

   }   

具体下拉值内容是从数据库取还是从请求中得到为不同具体实现      //collect只是传送一个标识。

   protectStringcollection;   

   //传送的值   

   protectStringvalue;   

   //该属性的名称   

   protectStringname;   

   publicStringgetCollect{   

       returncollection;   

   }   

   publicvoidsetCollectStringcollect{   

       this.collect=collection;   

   }   

   publicStringgetNam{   

       returnname;   

   }   

   publicvoidsetNamStringname{   

       this.nam=name;   

   }   

   publicStringgetValu{   

       returnvalue;   

   }   

   publicvoidsetValuStringvalu{   

       this.valu=value;   

   }   

}  

直接在index.jsp中引用5JSP中引用。

引入的方式在JSP头部引用需要引入相应的标签内容。

标签的使用和HTML标签的使用是一样的定义属性即可标签的属性可以设置也可以不设置。

<%@pagelanguage="java"pageEncoding="UTF-8"%>   

<%@tagliburi="/tld/web-html"prefix="html"%>   

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">   

<html>   

   <head>   

       <title>JSP自定义标签的实现</title>   

   </head>   

   <body>   

       请选择:   

       <html:selectname="sex"style="width:100px">   

           <html:optioncollection="SEX"></html:options>   

       </html:select>   

       显示性别:   

       <html:selectDisplaicollection="SEX"value="1"name="sex"></html:selectDisplay>        

   </body>   

</html> 

6后话

附件是这个项目的源代码,访问项目就可以看到效果。导入到MyEclips中可以查看

可以设计一个父类,如果想要自己设计一个大的标签库。包括一些主要的属性,例如nameidstyle等属性。然后在子类中定义自己的特有属性