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

发布时间 - 2026-01-11 02:53:51    点击率:

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数据交互实现过程解析  # 自定义  # 是从  # 返回值  # 自己的  # 请选择  # 是在  # 就可以  # 就用  # 结束时  # 加载  # 如果您  # 不需要  # 如有  # 可以用  # 继承了  # 并在  # 所需  # 希望能  # 如果没有  # 写了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  简单实现Android验证码  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  如何彻底删除建站之星生成的Banner?  Android滚轮选择时间控件使用详解  JS碰撞运动实现方法详解  javascript中闭包概念与用法深入理解  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  如何撰写建站申请书?关键要点有哪些?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  Laravel如何创建自定义Artisan命令?(代码示例)  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  如何用5美元大硬盘VPS安全高效搭建个人网站?  如何注册花生壳免费域名并搭建个人网站?  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Laravel distinct去重查询_Laravel Eloquent去重方法  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  C++用Dijkstra(迪杰斯特拉)算法求最短路径  如何快速搭建高效WAP手机网站吸引移动用户?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  如何快速生成可下载的建站源码工具?  Laravel如何生成URL和重定向?(路由助手函数)  JavaScript实现Fly Bird小游戏  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  浅析上传头像示例及其注意事项  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  如何在服务器上配置二级域名建站?  太平洋网站制作公司,网络用语太平洋是什么意思?  如何生成腾讯云建站专用兑换码?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  香港服务器租用每月最低只需15元?  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  网站页面设计需要考虑到这些问题  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  EditPlus中的正则表达式 实战(1)  如何基于云服务器快速搭建网站及云盘系统?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】