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

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

专注于为中小企业提供网站设计制作、网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业阳新免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了千余家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

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

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

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

 
 
 
  1.     
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  3.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee       
  4.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">    
  5.         
  6.         index.jsp    
  7.         
  8.         
  9.             
  10.             /tld/web-html    
  11.                 
  12.                 /WEB-INF/tlds/web-html.tld    
  13.                 
  14.             
  15.         
  16.    

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

 
 
 
  1.     
  2.     "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">    
  3.     
  4.     1.0    
  5.     1.2      
  6.     html       
  7.         
  8.         select    
  9.         com.SelectTag    
  10.         JSP    
  11.             
  12.             name    
  13.             true    
  14.             
  15.             
  16.             style    
  17.             true    
  18.             
  19.         
  20.         
  21.         options    
  22.         com.OptionsTag    
  23.         JSP    
  24.             
  25.             collection    
  26.             true    
  27.             
  28.         
  29.         
  30.         selectDisplay    
  31.         com.SelectDisplay    
  32.         JSP    
  33.             
  34.             collection    
  35.             true    
  36.             
  37.             
  38.             name    
  39.             true    
  40.             
  41.             
  42.             value    
  43.             true    
  44.             
  45.         
  46.    

4、实现类

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

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

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

首先是select标签的代码:

 
 
 
  1. package com;    
  2. import java.io.IOException;    
  3. import javax.servlet.jsp.JspException;    
  4. import javax.servlet.jsp.JspTagException;    
  5. import javax.servlet.jsp.tagext.BodyTagSupport;    
  6. /**   
  7.  * TagSupport与BodyTagSupport的区别:   
  8.  * 主要看标签处理类是否要读取标签体的内容和改变标签体返回的内容,如果不需要就用TagSupport,否则就用BodyTagSupport   
  9.  * 用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport   
  10.  */    
  11. @SuppressWarnings("serial")    
  12. public class SelectTag extends BodyTagSupport {    
  13.     @Override    
  14.     public int doStartTag() throws JspException {    
  15.         try {    
  16.             StringBuffer results = new StringBuffer("
  17.             if(name != null){    
  18.                 results.append(" name=\"");    
  19.                 results.append(name);    
  20.                 results.append("\"");    
  21.             }    
  22.             if(style != null){    
  23.                 results.append(" style=\"");    
  24.                 results.append(style);    
  25.                 results.append("\"");    
  26.             }    
  27.             results.append(">");    
  28.             pageContext.getOut().write(results.toString());    
  29.         } catch (IOException ex) {    
  30.             throw new JspTagException("错误");    
  31.         }    
  32.         return EVAL_BODY_INCLUDE;    
  33.     }    
  34.     @Override    
  35.     public int doEndTag() throws JspException {    
  36.         try {    
  37.             StringBuffer results = new StringBuffer("");    
  38.             // 因为下拉中包含下拉内容,所以只能在遇到结束标签时才能写select结束    
  39.             results.append("");              
  40.             pageContext.getOut().write(results.toString());    
  41.         } catch (IOException ex) {    
  42.             throw new JspTagException("错误");    
  43.         }    
  44.         return EVAL_PAGE;    
  45.     }    
  46.     // 样式    
  47.     protected String style;    
  48.     // 名字    
  49.     protected String name;    
  50.     public String getStyle() {    
  51.         return style;    
  52.     }    
  53.     public void setStyle(String style) {    
  54.         this.style = style;    
  55.     }    
  56.     public String getName() {    
  57.         return name;    
  58.     }    
  59.     public void setName(String name) {    
  60.         this.name = name;    
  61.     }       
  62.     /**   
  63.     doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字   
  64.     doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页   
  65.     doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步   
  66.     EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用   
  67.     EVAL_PAGE:继续处理页面,doEndTag()函数可用   
  68.     SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用   
  69.     SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用   
  70.     EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法   
  71.     EVAL_BODY_AGAIN:请求继续处理body,返回自doAfterBody(),这个返回值在你制作循环tag的时候是很有用的     
  72.     预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE   
  73.     如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是:doStartTag() ->不显示文字 ->doEndTag()->执行接下来的网页    
  74.     如果您改写了doStartTag(),则必须指定返回值,   
  75.     如果指定了EVAL_BODY_INCLUDE,则执行顺序是:doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页   
  76.      */    
  77. }   

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

然后是下拉内容实现类

 
 
 
  1. package com;    
  2. import java.io.IOException;    
  3. import javax.servlet.jsp.JspException;    
  4. import javax.servlet.jsp.JspTagException;    
  5. import javax.servlet.jsp.tagext.BodyTagSupport;    
  6. @SuppressWarnings("serial")    
  7. public class OptionsTag extends BodyTagSupport {    
  8.     @Override    
  9.     public int doStartTag() throws JspException {    
  10.         return EVAL_BODY_INCLUDE;    
  11.     }    
  12.     @Override    
  13.     public int doEndTag() throws JspException {    
  14.         try {    
  15.             StringBuffer results = new StringBuffer("");    
  16.             if ("SEX".equals(collection)) {    
  17.                 results.append("请选择");    
  18.                 results.append("男");    
  19.                 results.append("女");    
  20.             }    
  21.             pageContext.getOut().write(results.toString());    
  22.         } catch (IOException ex) {    
  23.             throw new JspTagException("错误");    
  24.         }    
  25.         return EVAL_PAGE;    
  26.     }    
  27.     // collection只是传递一个标识,具体下拉值内容是从数据库取还是从请求中得到为不同具体实现    
  28.     protected String collection;    
  29.     public String getCollection() {    
  30.         return collection;    
  31.     }    
  32.     public void setCollection(String collection) {    
  33.         this.collection = collection;    
  34.     }    
  35. }   

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

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

 
 
 
  1. package com;    
  2. import java.io.IOException;    
  3. import javax.servlet.jsp.JspException;    
  4. import javax.servlet.jsp.JspTagException;    
  5. import javax.servlet.jsp.tagext.BodyTagSupport;    
  6. @SuppressWarnings("serial")    
  7. public class SelectDisplay extends BodyTagSupport {    
  8.     @Override    
  9.     public int doStartTag() throws JspException {    
  10.         try {    
  11.             StringBuffer results = new StringBuffer("");    
  12.             pageContext.getOut().write(results.toString());    
  13.         } catch (IOException ex) {    
  14.             throw new JspTagException("错误");    
  15.         }    
  16.         return EVAL_BODY_INCLUDE;    
  17.     }    
  18.     @Override    
  19.     public int doEndTag() throws JspException {    
  20.         try {    
  21.             StringBuffer results = new StringBuffer("");    
  22.             if ("SEX".equals(collection)) {    
  23.                 results.append("");    
  24.                 results.append("
  25.                 results.append("hidden\" name=\"");    
  26.                 results.append(getName());    
  27.                 results.append("\"");    
  28.                 results.append(" value=\"");    
  29.                 results.append(getValue());    
  30.                 results.append("\">");                   
  31.                 if ("1".equals(getValue())) {    
  32.                     results.append("男");    
  33.                 } else if ("2".equals(getValue())) {    
  34.                     results.append("女");    
  35.                 } else {    
  36.                     results.append("请选择");    
  37.                 }    
  38.                 results.append("");    
  39.             }    
  40.             pageContext.getOut().write(results.toString());    
  41.         } catch (IOException ex) {    
  42.             throw new JspTagException("错误");    
  43.         }    
  44.         return EVAL_PAGE;    
  45.     }    
  46.     // collection只是传递一个标识,具体下拉值内容是从数据库取还是从请求中得到为不同具体实现    
  47.     protected String collection;    
  48.     // 传递的值    
  49.     protected String value;    
  50.     // 该属性的名称    
  51.     protected String name;    
  52.     public String getCollection() {    
  53.         return collection;    
  54.     }    
  55.     public void setCollection(String collection) {    
  56.         this.collection = collection;    
  57.     }    
  58.     public String getName() {    
  59.         return name;    
  60.     }    
  61.     public void setName(String name) {    
  62.         this.name = name;    
  63.     }    
  64.     public String getValue() {    
  65.         return value;    
  66.     }    
  67.     public void setValue(String value) {    
  68.         this.value = value;    
  69.     }    
  70. }   

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

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

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

 
 
 
  1. <%@ page language="java" pageEncoding="UTF-8"%>    
  2. <%@ taglib uri="/tld/web-html" prefix="html"%>    
  3.     
  4.     
  5.         
  6.         JSP 自定义标签的实现    
  7.         
  8.         
  9.         请选择:    
  10.             
  11.                 
  12.             
  13.         显示性别:    
  14.                  
  15.         
  16.   

6、后话

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

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

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

源代码:jsptag.rar

原文链接:http://www.blogjava.net/todayx-org/archive/2012/01/30/369041.html

【编辑推荐】

  1. JSP自定义标签开发入门
  2. JSP速度优化七种方法
  3. 详细介绍Jsp中的Cookies
  4. 分享JSP学习经验总结
  5. 详细介绍jsp中action的功能

名称栏目:JSP自定义标签实现数据字典
链接分享:http://www.shufengxianlan.com/qtweb/news39/162539.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联