热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

这篇文章主要介绍了JSP自定义标签实现数据字典的实例的相关资料,这里实现这样的功能,希望能帮助到大家,需要的朋友可以参考下

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

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

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

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

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



<&#63;xml version="1.0" encoding="UTF-8"&#63;> 
 
   
    index.jsp 
   
   
     
      /tld/web-html 
       
        /WEB-INF/tlds/web-html.tld 
       
     
   
 

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

<&#63;xml version="1.0" encoding="UTF-8"&#63;> 
 
 
  1.0 
  1.2  
  html   
   
    select 
    com.SelectTag 
    JSP 
     
      name 
      true 
     
     
      style 
      true 
     
   
   
    options 
    com.OptionsTag 
    JSP 
     
      collection 
      true 
     
   
   
    selectDisplay 
    com.SelectDisplay 
    JSP 
     
      collection 
      true 
     
     
      name 
      true 
     
     
      value 
      true 
     
   
 
 
 
 

 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(""); 
      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("");      
      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(""); 
        results.append(""); 
        results.append(""); 
      } 
      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(""); 
        results.append("");         
        if ("1".equals(getValue())) { 
          results.append("男"); 
        } else if ("2".equals(getValue())) { 
          results.append("女"); 
        } else { 
          results.append("请选择"); 
        } 
        results.append(""); 
      } 
      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"%> 
 
 
   
     
   
   
    请选择: 
     
       
     
    显示性别: 
        
   
 
 

 6.后话

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

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

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

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


推荐阅读
  • Java EE CDI:解决依赖关系冲突的实例
    在本教程中,我们将探讨如何在Java EE的CDI(上下文和依赖注入)框架中有效解决依赖关系的冲突问题。通过学习如何使用限定符,您将能够为应用程序的不同客户端提供多种接口实现,并确保每个客户端都能正确调用其所需的实现。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 创建项目:Visual Studio Online 入门指南
    本文介绍如何使用微软的 Visual Studio Online(VSO)创建和管理开发项目。作为一款基于云计算的开发平台,VSO 提供了丰富的工具和服务,简化了项目的配置和部署流程。 ... [详细]
  • 本文详细介绍超文本标记语言(HTML)的基本概念与语法结构。HTML是构建网页的核心语言,通过标记标签描述页面内容,帮助开发者创建结构化、语义化的Web页面。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
  • Eclipse 中 JSP 开发环境配置指南
    本文详细介绍了如何在 Eclipse 集成开发环境中配置 JSP 运行环境,包括必要的软件下载、Tomcat 服务器的配置以及常见问题的解决方法。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • 本文详细介绍如何在IntelliJ IDEA 14中打包Android应用APK文件,并提供查询SHA1值的具体步骤。 ... [详细]
  • 本文介绍了Java语言开发的远程教学系统,包括源代码、MySQL数据库配置以及相关文档,适用于计算机专业的毕业设计。系统支持远程调试,采用B/S架构,适合现代教育需求。 ... [详细]
author-avatar
xiaoge
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有