jsp

位置:IT落伍者 >> jsp >> 浏览文章

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


发布日期:2021年06月06日
 
JSP自定义标签实现数据字典

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

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

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

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

  1. <?xmlversion=""encoding="UTF"?>
  2. <webappversion=""xmlns="
  3. xmlns:xsi="
  4. xsi:schemaLocation="
  5. <welcomefilelist>
  6. <welcomefile>indexjsp</welcomefile>
  7. </welcomefilelist>
  8. <jspconfig>
  9. <taglib>
  10. <tagliburi>/tld/webhtml</tagliburi>
  11. <tagliblocation>
  12. /WEBINF/tlds/webhtmltld
  13. </tagliblocation>
  14. </taglib>
  15. </jspconfig>
  16. </webapp>

在webhtmltld中定义自己的标签数据字典应用的话我们需要一个标签库三个标签分别是select标签options标签和现实数据字典的标签每个标签都对应不同的实现类

  1. <?xmlversion=""encoding="UTF"?>
  2. <!DOCTYPEtaglibPUBLIC"//SunMicrosystemsInc//DTDJSPTagLibrary//EN"
  3. "
  4. <taglib>
  5. <tlibversion></tlibversion><!标签库版本>
  6. <jspversion></jspversion><!标签库要求的JSP规范版本>
  7. &


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

  • <tag>
  • <name>select</name>
  • <tagclass>comSelectTag</tagclass>
  • <bodycontent>JSP</bodycontent>
  • <attribute>
  • <name>name</name>
  • <rtexprvalue>true</rtexprvalue>
  • </attribute>
  • <attribute>
  • <name>style</name>
  • <rtexprvalue>true</rtexprvalue>
  • </attribute>
  • </tag>
  • <tag>
  • <name>options</name>
  • <tagclass>comOptionsTag</tagclass>
  • <bodycontent>JSP</bodycontent>
  • <attribute>
  • <name>collection</name>
  • <rtexprvalue>true</rtexprvalue>
  • </attribute>
  • </tag>
  • <tag>
  • <name>selectDisplay</name>
  • <tagclass>comSelectDisplay</tagclass>
  • <


;bodycontent>JSP</bodycontent>

  • <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>

实现类

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

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

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

首先是select标签的代码

  1. packagecom;
  2. importjavaioIOException;
  3. importjavaxservletjspJspException;
  4. importjavaxservletjspJspTagException;
  5. importjavaxservletjsptagextBodyTagSupport;
  6. /**
  7. *TagSupport与BodyTagSupport的区别:
  8. *主要看标签处理类是否要读取标签体的内容和改变标签体返回的内容如果不需要就用TagSupport否则就用BodyTagSupport
  9. *用TagSupport实现的标签都可以用BodyTagSupport来实现因为BodyTagSupport继承了TagSupport
  10. */
  11. @SuppressWarnings("serial")
  12. publicclassSelectTagextendsBodyTagSupport{
  13. @Override
  14. publicintdoStartTag()throwsJspException{
  15. &nb


sp;try{

  • StringBufferresults=newStringBuffer("<select");
  • if(name!=null){
  • resultsappend("name=\"");
  • resultsappend(name);
  • resultsappend("\"");
  • }
  • if(style!=null){
  • resultsappend("style=\"");
  • resultsappend(style);
  • resultsappend("\"");
  • }
  • resultsappend(">");
  • pageContextgetOut()write(resultstoString());
  • }catch(IOExceptionex){
  • thrownewJspTagException("错误");
  • }
  • returnEVAL_BODY_INCLUDE;
  • }
  • @Override
  • publicintdoEndTag()throwsJspException{
  • try{
  • StringBufferresults=newStringBuffer(""); &nbs


p;

  • //因为下拉中包含下拉内容所以只能在遇到结束标签时才能写select结束
  • resultsappend("</select>");
  • pageContextgetOut()write(resultstoString());
  • }catch(IOExceptionex){
  • thrownewJspTagException("错误");
  • }
  • returnEVAL_PAGE;
  • }
  • //样式
  • protectedStringstyle;
  • //名字
  • protectedStringname;
  • publicStringgetStyle(){
  • returnstyle;
  • }
  • publicvoidsetStyle(Stringstyle){
  • thisstyle=style;
  • }
  • publicStringgetName(){
  • returnname;
  • }
  • publicvoidsetName(Stringname){
  • thisname=name;
  • }
  • /**
  • doStartTag()方法是遇到标签开始时会呼叫的方法其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY前者表示将显示标签间的文字后者表示不显示标签间的文字
  • doEndTag()方法是在遇到标签结束时呼叫的方法其合法的返回值是EVAL_PAGE与SKIP_PAGE前者表示处理完标签后继续执行以下的JSP网页后者是表示不处理接下来的JSP网页
  • doAfterBody()这个方法是在显示完标签间文字之后呼叫的其返回值有EVAL_BODY_AGAIN与SKIP_BODY前者会再显示一次标签间的文字后者则继续执行标签处理的下一步
  • EVAL_BODY_INCLU


DE把Body读入存在的输出流中doStartTag()函数可用

  • EVAL_PAGE继续处理页面doEndTag()函数可用
  • SKIP_BODY忽略对Body的处理doStartTag()和doAfterBody()函数可用
  • SKIP_PAGE忽略对余下页面的处理doEndTag()函数可用
  • EVAL_BODY_BUFFERED申请缓沖区由setBodyContent()函数得到的BodyContent对象来处理tag的body如果类实现了BodyTag那么doStartTag()可用否则非法
  • EVAL_BODY_AGAIN请求继续处理body返回自doAfterBody()这个返回值在你制作循环tag的时候是很有用的
  • 预定的处理顺序是doStartTag()返回SKIP_BODYdoAfterBodyTag()返回SKIP_BODYdoEndTag()返回EVAL_PAGE
  • 如果继承了TagSupport之后如果没有改写任何的方法标签处理的执行顺序是doStartTag()>不显示文字>doEndTag()>执行接下来的网页
  • 如果您改写了doStartTag()则必须指定返回值
  • 如果指定了EVAL_BODY_INCLUDE则执行顺序是doStartTag()>显示文字>doAfterBodyTag()>doEndTag()>执行下面的网页
  • */
  • }

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

然后是下拉内容实现类

  1. packagecom;
  2. importjavaioIOException;
  3. importjavaxservletjspJspException;
  4. importjavaxservletjspJspTagException;
  5. importjavaxservletjsptagextBodyTagSupport;
  6. @SuppressWarnings("serial")
  7. publicclassOptionsTagextendsBodyTagSupport{
  8. @Override
  9. publicintdoStartTag()throwsJspException{
  10. returnEVAL_BODY_INCLUDE;
  11. }
  12. @Override
  13. publicintdoEndTag()throwsJspException{
  14. try{
  15. StringBufferresults=newStringBuffer("");
  16. if("SEX"equals(collection)){
  17. resultsappend("<optio


nvalue=\"\"selected=\"selected\">请选择</option>");

  • resultsappend("<optionvalue=\"\">男</option>");
  • resultsappend("<optionvalue=\"\">女</option>");
  • }
  • pageContextgetOut()write(resultstoString());
  • }catch(IOExceptionex){
  • thrownewJspTagException("错误");
  • }
  • returnEVAL_PAGE;
  • }
  • //collection只是传递一个标识具体下拉值内容是从数据库取还是从请求中得到为不同具体实现
  • protectedStringcollection;
  • publicStringgetCollection(){
  • returncollection;
  • }
  • publicvoidsetCollection(Stringcollection){
  • thiscollection=collection;
  • }
  • }

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

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

  1. packagecom;
  2. importjavaioIOException;
  3. importjavaxservletjspJspException;
  4. importjavaxservletjspJspTagException;
  5. importjavaxservletjsptagextBodyTagSupport;
  6. @SuppressWarnings("serial")
  7. publicclassSelectDisplayextendsBodyTagSupport{
  8. @Override
  9. publicintdoStartTag()throwsJspExce


ption{

  • try{
  • StringBufferresults=newStringBuffer("");
  • pageContextgetOut()write(resultstoString());
  • }catch(IOExceptionex){
  • thrownewJspTagException("错误");
  • }
  • returnEVAL_BODY_INCLUDE;
  • }
  • @Override
  • publicintdoEndTag()throwsJspException{
  • try{
  • StringBufferresults=newStringBuffer("");
  • if("SEX"equals(collection)){
  • resultsappend("<span>");
  • resultsappend("<inputtype=\"");
  • resultsappend("hidden\"name=\"");
  • resultsappend(getName());
  • resultsappend("\"");
  • resultsappend("value=\"");
  • resultsappend(getValue());
  • resultsappend("\">");&nb


sp;

  • if(""equals(getValue())){
  • resultsappend("男");
  • }elseif(""equals(getValue())){
  • resultsappend("女");
  • }else{
  • resultsappend("请选择");
  • }
  • resultsappend("</span>");
  • }
  • pageContextgetOut()write(resultstoString());
  • }catch(IOExceptionex){
  • thrownewJspTagException("错误");
  • }
  • returnEVAL_PAGE;
  • }
  • //collection只是传递一个标识具体下拉值内容是从数据库取还是从请求中得到为不同具体实现
  • protectedStringcollection;
  • //传递的值
  • protectedStringvalue;
  • //该属性的名称
  • protectedStringname;
  • publicStringgetCollection(){
  • returncollection;

  • }

  • publicvoidsetCollection(Stringcollection){
  • thiscollection=collection;
  • }
  • publicStringgetName(){
  • returnname;
  • }
  • publicvoidsetName(Stringname){
  • thisname=name;
  • }
  • publicStringgetValue(){
  • returnvalue;
  • }
  • publicvoidsetValue(Stringvalue){
  • thisvalue=value;
  • }
  • }
  • JSP中引用直接在indexjsp中引用

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

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

    1. <%@pagelanguage="java"pageEncoding="UTF"%>
    2. <%@tagliburi="/tld/webhtml"prefix="html"%>
    3. <!DOCTYPEHTMLPUBLIC"//WC//DTDHTMLTransitional//EN">
    4. <html>
    5. <head>
    6. <title>JSP自定义标签的实现</title>
    7. </head>
    8. <body>
    9. 请选择
    10. <html:selectname="sex"style="width:px">
    11. <html:optionscollection="SEX"></html:options>
    12. </html:select>
    13. 显示性别&nb

    sp;

上一篇:JSP网站发布的一种方式

下一篇:如何使用JSP来发送邮件