`
cuisuqiang
  • 浏览: 3937330 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3651644
社区版块
存档分类
最新评论

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

    博客分类:
  • J2EE
阅读更多

 

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程序,然后包含了字典应用的实际例子,程序简单,仅供参考

 

请您到ITEYE看我的原创:http://cuisuqiang.iteye.com

或支持我的个人博客,地址:http://www.javacui.com

 

7
2
分享到:
评论
8 楼 zfrfisherman 2015-12-17  
参考代码实践了一个,很实用,对于字典项不多而且确定内容都可以使用,减少数据库的访问。
7 楼 slience_mo 2014-03-10  
 
6 楼 cuisuqiang 2012-02-02  
GZQ0821 写道
cuisuqiang 写道
GZQ0821 写道
web-html是个什么文件?

是自己定义标签的名字,你可以自己起名字,有问题再交流

我说的是这个文件中的web-html   <taglib-uri>/tld/web-html</taglib-uri> ,我在页面引用时出错了,你标签只写了tlds/web-html.tld 没写tld/web-html文件?

你可以下载我的工程代码看一下,可能是你那里写错了
5 楼 GZQ0821 2012-02-02  
cuisuqiang 写道
GZQ0821 写道
web-html是个什么文件?

是自己定义标签的名字,你可以自己起名字,有问题再交流

我说的是这个文件中的web-html   <taglib-uri>/tld/web-html</taglib-uri> ,我在页面引用时出错了,你标签只写了tlds/web-html.tld 没写tld/web-html文件?
4 楼 cuisuqiang 2012-02-01  
GZQ0821 写道
web-html是个什么文件?

是自己定义标签的名字,你可以自己起名字,有问题再交流
3 楼 GZQ0821 2012-02-01  
web-html是个什么文件?
2 楼 cuisuqiang 2012-01-30  
jackra 写道
用标签真的好吗?

至少不同写那么多东西了,比如要是有个树的标签,你只要传递数据和要显示的方式就可以了,难道我们再去关心用什么实现的?
1 楼 jackra 2012-01-30  
用标签真的好吗?

相关推荐

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

    JSP 自定义标签实现数据字典的实例  1.关于JSP标签的好处就不再罗嗦 数据字典就是使用的下拉框,只要定义使用那个字典就会将这个字典可用的内容显示出来 显示字典时只要定义那个字典和属性值就可以显示出字典的...

    自定义jsp标签jar

    spring-webmvc-3.0.5.RELEASE.jar jsp-api-2.1.jar 教程:http://blog.csdn.net/yjqyyjw/article/details/51840751

    快速开发框架完整版J2EE代码

    内容管理:多站点管理,文章发布等,自带一套完整的JSP自定义标签。 消息推送:平台集成极光推送api、邮件发送、短信发送。 web通信:集成websocket,前端自带一个聊天室。 导出功能:excel导出与word导出。 统计...

    Java开发技术大全 电子版

    11.4.4字典(Dictionary)简介370 11.4.5哈希表(Hashtable)简介371 11.5本章小结371 第12章类型包装器、自动装箱和元数据(注释)372 12.1类型包装器372 12.1.1字符类型包装器372 12.1.2布尔类型包装器373 ...

    Google Android SDK开发范例大全(第3版) 1/5

    余志龙、陈昱勋、郑名杰、陈小风,分别来自手机制造业、电视媒体业、网络、电信产业、软件开发等领域,擅长嵌入式系统软件设计、J2ME游戏开发、Android开发,以及12EE、JSP、Servlet、Java Bean、PHP、C#等程序语言...

    Google Android SDK开发范例大全(第3版) 4/5

    余志龙、陈昱勋、郑名杰、陈小风,分别来自手机制造业、电视媒体业、网络、电信产业、软件开发等领域,擅长嵌入式系统软件设计、J2ME游戏开发、Android开发,以及12EE、JSP、Servlet、Java Bean、PHP、C#等程序语言...

    Google Android SDK开发范例大全(第3版) 3/5

    余志龙、陈昱勋、郑名杰、陈小风,分别来自手机制造业、电视媒体业、网络、电信产业、软件开发等领域,擅长嵌入式系统软件设计、J2ME游戏开发、Android开发,以及12EE、JSP、Servlet、Java Bean、PHP、C#等程序语言...

    Google Android SDK开发范例大全(第3版) 5/5

    余志龙、陈昱勋、郑名杰、陈小风,分别来自手机制造业、电视媒体业、网络、电信产业、软件开发等领域,擅长嵌入式系统软件设计、J2ME游戏开发、Android开发,以及12EE、JSP、Servlet、Java Bean、PHP、C#等程序语言...

    Javashop开发规范V2.2

    1.如果是在jsp 中: &lt;html:regionselect&gt;&lt;/html:regionselect&gt; 2.如果是在Freemarker的html中: RegionSelect= "com.enation.app.base.component.widget.regions.RegionSelectDirective"?new()&gt; ...

    Java/JavaEE 学习笔记

    第十章 Oracle Data Dictionary(数据字典表)........................138 第十一章 Manipulating Data(对表的操作)140 第十二章 Altering Tables and Constraints..142 第十三章 Creating Sequences..........145 第...

    J2EE学习笔记(J2ee初学者必备手册)

    第十章 Oracle Data Dictionary(数据字典表)........................138 第十一章 Manipulating Data(对表的操作)140 第十二章 Altering Tables and Constraints..142 第十三章 Creating Sequences..........145 第...

Global site tag (gtag.js) - Google Analytics