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

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自定义标签通常由两部分组成:标签处理类(Tag Handler)和标签库描述文件(TLD, Tag Library Descriptor)。标签处理类实现了自定义逻辑,而TLD文件则定义了标签的属性、行为以及与处理类的关联。在公司内部,...

    自定义jsp标签jar

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

    jeecgUI标签文档

    其UI标签库是一套在JSP页面中使用的自定义标签集合,极大地简化了前端界面的开发工作。 1. BaseTag(样式表和JS引入标签) BaseTag标签用于引入JEECG开发平台需要的CSS样式表和JavaScript文件,是构建UI界面的基础...

    Struts2 自定义下拉框Tag标签

    -- 从数据字典检出一个option列表 --&gt; &lt;name&gt;OptionDictionary &lt;tag-class&gt;com.itmyhome.DictionaryOptionTag&lt;/tag-class&gt; &lt;body-content&gt;empty &lt;name&gt;index &lt;!-- 字段索引名 --&gt; &lt;required&gt;true &lt;!-- 是否...

    毕业论文jsp1601培训教育网站ssh.doc

    JSP的核心概念包括JSP指令、脚本元素、JSP表达式、JSP动作和自定义标签。在本文中,JSP被用来创建用户界面,处理用户请求并返回响应。 2. **MYSQL数据库**:MySQL是一种开源、关系型数据库管理系统,广泛应用于web...

    毕业论文jsp1062自行车租赁sqlserver.doc

    JSP提供了模板文本、脚本元素、指令标签和自定义标签等功能,方便网页的创建和维护。 3. **SQL Server 2005数据库**:SQL Server是由微软开发的关系型数据库管理系统,2005版本提供了一套完整的数据管理和分析工具...

    frameworkset开发手册

    - **自定义标签库**:提供了一系列强大的JSP标签,用于展示页面树型结构数据、分页列表数据、详细信息等,还包括字典标签、抽屉标签、右键菜单标签等。这些标签与系统的安全控制框架紧密结合,便于开发者在标签接口...

    jspCHM 帮助文档*3

    - **自定义标签**:允许开发者创建自己的标签库,提高代码复用和可读性。 - **Servlet与JSP的关系**:JSP最终会被编译成Servlet,两者都是Java Web应用的重要组成部分。 - **MVC设计模式**:在JSP应用中,JSP通常...

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

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

    基于SSM+jsp的二手交易平台源码数据库文档.zip

    5. **数据库文档**:数据库文档通常包括数据库设计(ER图、表结构、字段说明)、SQL脚本以及数据字典。这部分内容对于理解系统的数据存储和业务逻辑至关重要。 6. **毕业设计**:此项目可能包含需求分析、系统设计...

    java学籍管理系统毕业设计答辩PPT

    - JSP标签(Tag Libraries)允许自定义扩展,如JSTL(JavaServer Pages Standard Tag Library)用于控制流程和数据处理。 3. **系统开发流程**: - 可行性分析:评估项目的必要性、技术可行性、经济性和法律合规...

    3.内置组件的应用1

    在Java或JSP中,可以方便地使用这些方法获取并显示字典数据,如`DictUtils.getDictLabel()`和`DictUtils.getDictValue()`。 5. **功能权限控制**: 功能权限控制确保了对系统功能的访问和操作符合权限策略。使用`@...

    J2EE软件工程师全部培训课程总结

    - **JSP高级特性**:学习自定义标签、EL表达式、JSTL标签库等高级功能,提升Web开发效率。 #### 六、MVC框架:Struts与JSF - **Struts框架**:理解Struts的工作原理,掌握其标签库、国际化和异常处理机制。 - **...

    J2EE开发全程实录

    Web开发章节讲解了标记语言的基础知识,以及自定义标记库的开发,如Tag接口的生命周期,以及开发自定义的hello和flash标记,帮助开发者更好地理解JSP和自定义标签库的应用。 案例系统需求部分,作者设计了一个基础...

    jeesite内置组件的应用

    DictUtils类提供了一系列操作字典数据的方法,这些方法可以帮助开发者快速地在Java代码或者JSP页面中获取系统字典的相关信息。 ##### 根据类型和值获取字典标签 - Java文件中获取:`DictUtils.getDictLabel(String...

    基于JAVA的火车票售票系统毕业论文(20210809104649).pdf

    在这一过程中,系统的需求分析包括了数据流图、数据字典、实体-关系(ER)图和数据库逻辑结构、层次图、系统流程图以及程序流程图的使用。这些分析帮助研究者清晰地理解了系统需求、数据库设计、系统软件架构和系统...

    跟我学shiro

    - **Web 层标签库**:自定义的 JSP 标签库。 - **异常处理器**:处理异常情况。 - **配置文件**:配置 Spring 和 Shiro 的设置。 - **JSP 页面**:用户界面展示。 - **系统截图**:展示系统界面。 - **相关...

Global site tag (gtag.js) - Google Analytics