1、实现自定义标签按如下步骤进行:
(1)开发自定义标签处理类:
(2)建立一个*.tld 文件,每个*.tld 文件对应一个标签库,每个标签库对应多个标签:
(3)在web.xml文件中增加自定义标签的定义:
(4)在JSP 文件中使用自定义标签。
2、开发自定义标签:
自定义标签类都必须继承一个父类: java.Servlet.jsp.tagext.TagSupport 或者 BodyTagSupport。除此之外,自定义标签类还有如下要求。
·如果标签类包含属性,每个属性都有对应的getter 和setter 方法。
·重写doStartTag()或doEndTag()方法,这两个方法生成页面内容。
·如果需要在销毁标签之前完成资源回收,则重写re1ease()方法。
下面就以编写一个select下拉框的自定义标签为例:
步骤1.编写tld文件。在项目的WEB-INF文件夹中创建一个tld文件。如jttag.tld。文件内容如下。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>jttag</shortname> <tag> <name>jtselect</name> <tagclass>cn.com.hnisi.egs.util.jsptool.jttaglib.JtGenerateSelectTag</tagclass> <bodycontent>empty</bodycontent> <attribute> <name>id</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>whereCls</name> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>nameColumnName</name> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>cusStyle</name> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>sourceTable</name> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>valueColumnName</name> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>selectValue</name> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>name</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
其中的: <tagclass>cn.com.hnisi.egs.util.jsptool.jttaglib.JtGenerateSelectTag</tagclass>
中的类就是标签处理类。
步骤2.编写标签处理类。
代码如下:
package cn.com.hnisi.egs.util.jsptool.jttaglib; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import cn.com.hnisi.egs.framework.util.DebugUtil; import cn.com.hnisi.egs.framework.util.SysUtil; /** * *************************************************************** * <p> * @CLASS : JtGenerateSelectTag * @DESCRIPTION :创建自定义标签:jtselect,可自动填充相应的下拉框,设置默认选择等操作 * @AUTHOR :hill * @VERSION : v1.0 * @DATE : Mar 5, 2013 8:58:33 AM * </p> **************************************************************** */ public class JtGenerateSelectTag extends TagSupport{ private static final long serialVersionUID = 1L; /** * id 元素id 同时也是下拉框id */ private String id; /** * name 元素name 同时也是下拉框name */ private String name; /** * whereCls where条件 */ private String whereCls; /** * nameColumnName 名称所在的列的名称 */ private String nameColumnName; /** * valueColumnName 值所在的列的名称 */ private String valueColumnName; /** * selectValue 默认选择的值 */ private String selectValue; /** * cusStyle 用户自定义样式 */ private String cusStyle; /** * sourceTable 数据来源表 默认为AA10 */ private String sourceTable; public JtGenerateSelectTag() { id = ""; whereCls = ""; nameColumnName = ""; valueColumnName=""; selectValue=""; cusStyle = ""; sourceTable = ""; } public int doEndTag() throws JspException { Connection conn=null; ResultSet rs=null; PreparedStatement ps=null; StringBuffer sqlbfr=new StringBuffer(); StringBuffer sqlbfr2=new StringBuffer(); String sql=""; String falg="1";//标志用于区分使用哪个StringBuffer HttpServletRequest req = (HttpServletRequest)pageContext.getRequest(); JspWriter out = pageContext.getOut(); try { if(name==null||name.equals("")) { throw new JspException("所取的下拉框的名称为空!"); }else { sqlbfr.append("SELECT AAA102,AAA103 FROM AA10 "); //如果传入的value的名称不为空,sourceTable 也不为空 if(nameColumnName!=null&&!nameColumnName.trim().equals("")&&valueColumnName!=null&&!valueColumnName.trim().equals("")&&sourceTable!=null&&!sourceTable.trim().equals("")) { falg="2"; sqlbfr2.append("SELECT "+valueColumnName+","+nameColumnName+" FROM "+sourceTable+" WHERE 1=1 "); }else { sqlbfr.append(" WHERE AAA100= '"+name+"' "); } if(whereCls!=null&&!whereCls.trim().equals("")) { sqlbfr.append(" and "+whereCls); sqlbfr2.append(" and "+whereCls); } if(falg.equals("1")) { sql=sqlbfr.toString(); }else sql=sqlbfr2.toString(); conn=SysUtil.getConnection(); ps = conn.prepareStatement(sql); ps.execute(); rs = ps.getResultSet(); int rows = 0; String toActId = ""; String actName = ""; StringBuffer postTranssStr = new StringBuffer(); while (rs.next()) { toActId = rs.getString(1); actName = rs.getString(2); if(selectValue!=null&&!selectValue.trim().equals("")&&selectValue.trim().equals(toActId)) { postTranssStr.append("<option value=\"" + toActId + "\" selected >" + actName + "</option>"); } else { postTranssStr.append("<option value=\"" + toActId + "\">" + actName + "</option>"); } rows++; } StringBuffer sb = new StringBuffer(); if (rows > 0) { sb.append(""); if(cusStyle!=null&&!cusStyle.equals("")) { }else { cusStyle=""; } sb.append("<select class=solidselect id=\""+id+"\" name=\""+name+"\" "+cusStyle+">\n"); sb.append("<option value=\"\" selected>请选择</option>"); sb.append(postTranssStr); sb.append("</select>"); sb.append(""); } String _html = sb.toString(); out.println(_html); out.flush(); } } catch (Exception e) { DebugUtil.println("------引用下拉框标签jtselect时发生错误!"); e.printStackTrace(); throw new JspException(e); } finally { try { SysUtil.release(rs, ps, conn); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return 6; } public void release() { id = ""; whereCls = ""; nameColumnName = ""; valueColumnName=""; selectValue=""; cusStyle = ""; sourceTable = ""; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getWhereCls() { return whereCls; } public void setWhereCls(String whereCls) { this.whereCls = whereCls; } public String getSourceTable() { return sourceTable; } public void setSourceTable(String sourceTable) { this.sourceTable = sourceTable; } public String getNameColumnName() { return nameColumnName; } public void setNameColumnName(String nameColumnName) { this.nameColumnName = nameColumnName; } public String getValueColumnName() { return valueColumnName; } public void setValueColumnName(String valueColumnName) { this.valueColumnName = valueColumnName; } public String getSelectValue() { return selectValue; } public void setSelectValue(String selectValue) { this.selectValue = selectValue; } public String getCusStyle() { return cusStyle; } public void setCusStyle(String cusStyle) { this.cusStyle = cusStyle; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
注意:
doStartTag()和doEndTag()返回值是在Tag Interface里定义的静态int
SKIP_BODY隐含0 Skip body evaluation. Valid return value for doStartTag and doAfterBody. 跳过对body的处理。 就是跳过了开始和结束标签之间的代码。
EVAL_BODY_INCLUDE 隐含1 Evaluate body into existing out stream. Valid return value for doStartTag. This is an illegal return value for doStartTag when the class implements BodyTag, since BodyTag implies the creation of a new BodyContent. 将body的内容输出到存在的输出流中。包括是jsp代码,也可以被输出
SKIP_PAGE 隐含5 Skip the rest of the page. Valid return value for doEndTag. 忽略剩下的页面。
EVAL_PAGE 隐含6 Continue evaluating the page. Valid return value for doEndTag().
在doStartTag()方法中,若返回EVAL_BODY_INCLUDE就计算标签的body 若返回SKIP_BODY就不计算标签的body
在doEndTag()方法中,若返回EVAL_PAGE容器在标签结束时继续计算jsp页面的其它部分, 若返回SKIP_PAGE则在标签结束时停止计算jsp页面其他的部分。
当你实现了BodyTag接口时,也就是你进行带body标签的开发时,有doAfterBody()方法。
当返回EVAL_BODY_TAG时,表示继续计算一次BodyTag,直到返回SKIP_BODY才会调用doEndTag()方法在doStartTag()方法中,若返回EVAL_BODY_INCLUDE就计算标签的body 若返回SKIP_BODY就不计算标签的body
步骤3.配置web.xml文件。
<taglib>
<taglib-uri>hnisi.tld</taglib-uri>
<taglib-location>/WEB-INF/hnisi.tld</taglib-location>
</taglib>
步骤4.在页面使用.
jtselect
1.1标签属性:
* id 元素id 同时也是下拉框id
* name 元素name 同时也是下拉框name
* whereCls where条件
* nameColumnName 名称所在的列的名称
* valueColumnName 值所在的列的名称
* selectValue 默认选择的值
* cusStyle 用户自定义样式
* sourceTable 数据来源表 默认为AA10
说明:标记为红色的属性为必须属性
2使用方法和步骤:
步骤1:在使用该标签的页面的前部加上如下文字:
<%@ taglib uri="jttag.tld" prefix="jttag" %>
说明:
uri:必须是jttag.tld,详见web.xml文件配置
prefix: jttag 前缀可以自定义
步骤2:在需要使用该标签的位置添加如下代码
如果下拉框来源于AA10时:
<jttag:jtselect name="AAC004" id="AAC004" />
如果是自定义表格时:
<jttag:jtselect id="AAC004" name="AAC004" nameColumnName="AAA103" valueColumnName="AAA102" sourceTable="AA10" whereCls=" AAA100='AAC004' " selectValue="1" cusStyle="readonly=true"/>
相关推荐
在实际开发中,有时我们需要根据项目需求实现特定的功能,比如动态生成SQL或者进行复杂的业务逻辑处理,这时MyBatis的自定义标签功能就显得尤为重要。 自定义标签是MyBatis框架的一大特色,它允许我们扩展XML映射...
在Struts2中,自定义标签是提高代码可读性和可维护性的重要工具。本文将深入探讨Struts2自定义标签的实现机制、优点以及如何在实际项目中进行应用。 一、Struts2自定义标签的概念 自定义标签是JSP的一种扩展,允许...
在JavaServer Pages (JSP) 技术中,自定义标签是扩展JSP功能的关键手段,它允许开发者创建可重用的组件,提高代码的可维护性和可读性。本实例将深入探讨如何实现一个简单的JSP自定义标签。 首先,自定义标签的实现...
在ThinkPHP中,自定义标签(Tag Lib)是一种强大的特性,允许开发者扩展模板引擎的功能,使其更符合项目需求。下面将详细解释如何在ThinkPHP 3.0版本中实现自定义标签及其使用方法。 1. **自定义标签的作用** ...
一个“自定义标签”是开发者为了扩展JSP(JavaServer Pages)功能而创建的,它允许我们封装复杂逻辑并将其作为可重用的组件。本项目提供了一个用于分页的自定义标签,适用于那些需要在网页上进行数据分页展示的应用...
本篇文章将详细阐述如何在CKEditor 4.0中进行自定义标签操作,并提供经过修改的编辑器JAR包供下载。 CKEditor 4.0是一款开源的JavaScript富文本编辑器,它支持多种浏览器环境,提供丰富的功能和高度可定制性。...
在Java Server Pages (JSP) 2.0版本中,自定义标签和自定义标签函数极大地扩展了JSP开发的灵活性和可重用性。这些特性允许开发者创建可复用的组件,使代码更加清晰,易于维护。本文将深入探讨JSP 2.0中的自定义标签...
在Spring框架中,自定义标签是一项非常实用的功能,它允许我们创建符合XML语法的自定义元素,以便在配置文件中更方便地表达业务逻辑。在"spring自定义标签例子"这个项目中,我们可以深入理解这一特性,特别是通过...
本案例通过JavaScript来实现自定义标签的功能。具体而言,它通过遍历文档中的内容,将自定义的标签转换为标准的HTML标签,并应用相应的样式。下面我们将详细介绍其实现细节。 #### 自定义标签代码解析 ```...
在JavaServer Pages (JSP) 技术中,自定义标签是提高代码可重用性和模块化的重要手段。自定义标签允许开发者创建自己的组件,这些组件可以像HTML标签一样在页面上使用,使得代码更加清晰易读。本教程将深入探讨JSP...
在 Struts 中,自定义标签是提供一种灵活的方式,使得视图层(通常为 JSP 页面)能够更好地与业务逻辑交互,从而提高代码的可读性和可维护性。本文将深入探讨如何在 Struts 中实现自定义标签。 一、自定义标签概述 ...
在JSP(JavaServer Pages)开发中,自定义标签是一种扩展JSP功能的强大工具,它允许开发者创建可重用的代码组件,以提高代码的可读性和可维护性。本篇学习笔记将深入探讨JSP自定义标签的相关概念、创建方法以及实际...
首先,创建自定义标签的目的是为了增加语义化,使网页内容更易于机器理解,同时提高人类阅读的清晰度。例如,可以定义`<article>`、`<sidebar>`等标签来明确内容区块的类型。自定义标签遵循驼峰式命名规则,如`...
在Java Web开发中,自定义标签(Custom Tags)是一个强大的工具,它允许开发者创建可重用的组件,提高代码的可读性和维护性。自定义标签是JSP标准标签库(JSTL)的一种扩展,它能将复杂的业务逻辑封装起来,使JSP...
Java自定义标签是JavaServer Pages (JSP)技术的一个强大特性,它允许开发者扩展JSP的标准标签库,创建自己的定制化标签,以提高代码的可读性和可维护性。自定义标签可以封装复杂的业务逻辑或者视图呈现,使得页面...
JSP(JavaServer Pages)自定义标签是JSP技术中一个重要的特性,允许开发者创建可重用的、自定义的组件,从而提高代码的可读性和可维护性。本文将深入讲解JSP自定义标签的相关概念、格式、处理过程以及创建和使用...
使用jsp自定义标签的功能实现权限的控制。(如果用户没有某个模块的删除权限,就不现实这个删除按钮) 在整个项目中所有的页面都可以引入自定义的标签去做到权限的控制。 自定义标签文件 删除 可以控制页面中的每...
在这个"Freemarker自定义标签简单案例"中,我们将深入探讨如何利用Freemarker进行模板设计,并结合自定义标签来增强模板的功能。 首先,让我们理解Freemarker的基础知识。Freemarker是一个与语言无关的模板引擎,它...
JSP自定义标签是用户定义的JSP语言元素,可以看成是一种通过标签处理器生成基于XML脚本的方法。自定义标签在功能上和逻辑上都与JavaBean类似,都是一组可重用的组件代码。相较于JavaBean,自定义标签可以使Web开发者...