全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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

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

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

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



<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="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> 

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

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"  
  "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.实现类

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

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

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

首先是select标签的代码:

package com; 
import java.io.IOException; 
import javax.servlet.jsp.JspException; 
import javax.servlet.jsp.JspTagException; 
import javax.servlet.jsp.tagext.BodyTagSupport; 
/** 
 * TagSupport与BodyTagSupport的区别: 
 * 主要看标签处理类是否要读取标签体的内容和改变标签体返回的内容,如果不需要就用TagSupport,否则就用BodyTagSupport 
 * 用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport 
 */ 
@SuppressWarnings("serial") 
public class SelectTag extends BodyTagSupport { 
  @Override 
  public int doStartTag() throws JspException { 
    try { 
      StringBuffer results = new StringBuffer("<select"); 
      if(name != null){ 
        results.append(" name=\""); 
        results.append(name); 
        results.append("\""); 
      } 
      if(style != null){ 
        results.append(" style=\""); 
        results.append(style); 
        results.append("\""); 
      } 
      results.append(">"); 
      pageContext.getOut().write(results.toString()); 
    } catch (IOException ex) { 
      throw new JspTagException("错误"); 
    } 
    return EVAL_BODY_INCLUDE; 
  } 
  @Override 
  public int doEndTag() throws JspException { 
    try { 
      StringBuffer results = new StringBuffer(""); 
      // 因为下拉中包含下拉内容,所以只能在遇到结束标签时才能写select结束 
      results.append("</select>");      
      pageContext.getOut().write(results.toString()); 
    } catch (IOException ex) { 
      throw new JspTagException("错误"); 
    } 
    return EVAL_PAGE; 
  } 
  // 样式 
  protected String style; 
  // 名字 
  protected String name; 
  public String getStyle() { 
    return style; 
  } 
  public void setStyle(String style) { 
    this.style = style; 
  } 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  }   
  /** 
  doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字 
  doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页 
  doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步 
  EVAL_BODY_INCLUDE:把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_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE 
  如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是:doStartTag() ->不显示文字 ->doEndTag()->执行接下来的网页 
  如果您改写了doStartTag(),则必须指定返回值, 
  如果指定了EVAL_BODY_INCLUDE,则执行顺序是:doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页 
   */ 
} 

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

然后是下拉内容实现类

package com; 
import java.io.IOException; 
import javax.servlet.jsp.JspException; 
import javax.servlet.jsp.JspTagException; 
import javax.servlet.jsp.tagext.BodyTagSupport; 
@SuppressWarnings("serial") 
public class OptionsTag extends BodyTagSupport { 
  @Override 
  public int doStartTag() throws JspException { 
    return EVAL_BODY_INCLUDE; 
  } 
  @Override 
  public int doEndTag() throws JspException { 
    try { 
      StringBuffer results = new StringBuffer(""); 
      if ("SEX".equals(collection)) { 
        results.append("<option value=\"0\" selected=\"selected\">请选择</option>"); 
        results.append("<option value=\"1\">男</option>"); 
        results.append("<option value=\"2\">女</option>"); 
      } 
      pageContext.getOut().write(results.toString()); 
    } catch (IOException ex) { 
      throw new JspTagException("错误"); 
    } 
    return EVAL_PAGE; 
  } 
  // collection只是传递一个标识,具体下拉值内容是从数据库取还是从请求中得到为不同具体实现 
  protected String collection; 
  public String getCollection() { 
    return collection; 
  } 
  public void setCollection(String collection) { 
    this.collection = collection; 
  } 
} 

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

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


package com; 
import java.io.IOException; 
import javax.servlet.jsp.JspException; 
import javax.servlet.jsp.JspTagException; 
import javax.servlet.jsp.tagext.BodyTagSupport; 
@SuppressWarnings("serial") 
public class SelectDisplay extends BodyTagSupport { 
  @Override 
  public int doStartTag() throws JspException { 
    try { 
      StringBuffer results = new StringBuffer(""); 
      pageContext.getOut().write(results.toString()); 
    } catch (IOException ex) { 
      throw new JspTagException("错误"); 
    } 
    return EVAL_BODY_INCLUDE; 
  } 
  @Override 
  public int doEndTag() throws JspException { 
    try { 
      StringBuffer results = new StringBuffer(""); 
      if ("SEX".equals(collection)) { 
        results.append("<span>"); 
        results.append("<input type=\""); 
        results.append("hidden\" name=\""); 
        results.append(getName()); 
        results.append("\""); 
        results.append(" value=\""); 
        results.append(getValue()); 
        results.append("\">");         
        if ("1".equals(getValue())) { 
          results.append("男"); 
        } else if ("2".equals(getValue())) { 
          results.append("女"); 
        } else { 
          results.append("请选择"); 
        } 
        results.append("</span>"); 
      } 
      pageContext.getOut().write(results.toString()); 
    } catch (IOException ex) { 
      throw new JspTagException("错误"); 
    } 
    return EVAL_PAGE; 
  } 
  // collection只是传递一个标识,具体下拉值内容是从数据库取还是从请求中得到为不同具体实现 
  protected String collection; 
  // 传递的值 
  protected String value; 
  // 该属性的名称 
  protected String name; 
  public String getCollection() { 
    return collection; 
  } 
  public void setCollection(String collection) { 
    this.collection = collection; 
  } 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
  public String getValue() { 
    return value; 
  } 
  public void setValue(String value) { 
    this.value = value; 
  } 
} 
 
 
 

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

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

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

<%@ page language="java" pageEncoding="UTF-8"%> 
<%@ taglib uri="/tld/web-html" prefix="html"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <title>JSP 自定义标签的实现</title> 
  </head> 
  <body> 
    请选择: 
    <html:select name="sex" style="width:100px"> 
      <html:options collection="SEX"></html:options> 
    </html:select> 
    显示性别: 
    <html:selectDisplay collection="SEX" value="1" name="sex"></html:selectDisplay>    
  </body> 
</html> 
 

 6.后话

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

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

这个实现只是学习一下JSP自定义标签使用的HelloWorld程序,然后包含了字典应用的实际例子,程序简单,仅供参考

 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# JSP  # 自定义标签实现数据字典  # 实现数据字典的方法  # SpringMVC 向jsp页面传递数据库读取到的值方法  # jsp实现textarea中的文字保存换行空格存到数据库的方法  # jsp 使用request为页面添加静态数据的实例  # Struts2.5 利用Ajax将json数据传值到JSP的实例  # 读取数据库的数据并整合成3D饼图在jsp中显示详解  # springMVC如何将controller中数据传递到jsp页面  # jsp中EL表达式获取数据  # JSP数据交互实现过程解析  # 自定义  # 是从  # 返回值  # 自己的  # 请选择  # 是在  # 就可以  # 就用  # 结束时  # 加载  # 如果您  # 不需要  # 如有  # 可以用  # 继承了  # 并在  # 所需  # 希望能  # 如果没有  # 写了 


相关文章: 如何在Ubuntu系统下快速搭建WordPress个人网站?  测试制作网站有哪些,测试性取向的权威测试或者网站?  如何通过虚拟主机空间快速建站?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  建站之星安装后如何自定义网站颜色与字体?  建站VPS推荐:2025年高性能服务器配置指南  如何选择网络建站服务器?高效建站必看指南  岳西云建站教程与模板下载_一站式快速建站系统操作指南  如何彻底删除建站之星生成的Banner?  建站之星如何开启自定义404页面避免用户流失?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  Swift中switch语句区间和元组模式匹配  PHP 500报错的快速解决方法  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何制作算命网站,怎么注册算命网站?  内网网站制作软件,内网的网站如何发布到外网?  公司网站设计制作厂家,怎么创建自己的一个网站?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  如何批量查询域名的建站时间记录?  平台云上自助建站如何快速打造专业网站?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  如何通过二级域名建站提升品牌影响力?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  网站制作服务平台,有什么网站可以发布本地服务信息?  高防服务器租用如何选择配置与防御等级?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  制作电商网页,电商供应链怎么做?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  香港服务器网站推广:SEO优化与外贸独立站搭建策略  个人网站制作流程图片大全,个人网站如何注销?  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  制作网站外包平台,自动化接单网站有哪些?  建站之星代理平台如何选择最佳方案?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  建站之星如何实现五合一智能建站与营销推广?  建站之星价格显示格式升级,你的预算足够吗?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  ,网页ppt怎么弄成自己的ppt?  建站VPS配置与SEO优化指南:关键词排名提升策略  深入理解Android中的xmlns:tools属性  建站OpenVZ教程与优化策略:配置指南与性能提升  高性能网站服务器部署指南:稳定运行与安全配置优化方案 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。