第 3 步:在标签处理程序 Java 类中创建属性
我们希望为 mapDefine
标签指定三个属性,如下所示:
属性说明
id |
新 scriptlet 变量的名字。 |
scope |
新 scriptlet 变量所在的范围。 |
type |
新 scriptlet 变量的类型 (HashMap 、FastHashMap 、TreeMap 或者 FastTreeMap )。 如果 type 设置为 hash ,那么就会创建一个 HashMap 。如果 type 设置为 fasthash ,那么将创建 FastHashMap 。 |
在 JSP 页中使用这个标签时,它看起来将像下面这样:
<map:mapdefine type="hash" scope="session" id="editParams"> ... </map:mapdefine>
这个标签将在会话范围内创建一个名为 editParams
的 HashMap
。
为了在标签处理程序中创建属性,需要定义相应的 JavaBean 属性。 因此,每一个属性在标签处理程序中都有对应的 setter 方法,如下所示:
public class MapDefineTag extends TagSupport { ... private String type = FASTTREE; private String id; private String scope; public void setType(String string) { type = string; } public void setId(String string) { id = string; } public void setScope(String string) { scope = string; }
转换引擎将用硬编码的配置数据或者运行时表达式设置这个标签的属性。 我们将在 第 4 步:在 TLD 文件中定义属性 中对此做更详细的讨论。
在 第 5 步:实现 doStartTag() 方法 中,我们将在标签处理程序的 doStartTag()
方法中使用这些属性。
第 4 步:在 TLD 文件中定义属性
就 像上一小节中所做的那样,通过声明 JavaBean 属性定义自定义属性,然后在 TLD 文件中声明这些属性。 每一个 JavaBean 属性都必须与相应的自定义标签属性相匹配。 在 TLD 中定义的属性必须匹配 JavaBean 属性,不过却可以有与标签属性不匹配的 JavaBean 属性。
下面是 MapDefineTag
的属性声明:
<tag> <name>mapDefine</name> <tag-class>trivera.tags.map.MapDefineTag</tag-class> <body-content>JSP</body-content> ... <attribute> <name>id</name> <required>true</required> <rtexprvalue>false</rtexprvalue> <description>The id attribute</description> </attribute> <attribute> <name>scope</name> <required>false</required> <rtexprvalue>false</rtexprvalue> <description>The scope attribute</description> </attribute> <attribute> <name>type</name> <required>false</required> <rtexprvalue>false</rtexprvalue> <description> Specifies the type of map valid values are fasttree, fasthash, hash, tree </description> </attribute> </tag>
name
元素指定属性的名字。required
元素指定属性是否是必需的(默认值是 false
)。rtexprvalue
元素表明属性是硬编码了转换时的值还是允许使用运行时 scriptlet 表达式。
记住,MapDefineTag
类必须为前面描述的每一个属性定义一个 JavaBean 属性,我们在 第 3 步:在标签处理程序 Java 类中创建属性 中完成这个任务。
第 5 步:实现 doStartTag() 方法
标签开始时调用 doStartTag()
方法 —— 从开发人员的角度看,这是当引擎遇到 <map:mapdefine></map:mapdefine>
时发生的。如果 doStartTag()
返回 SKIP_BODY
,那么将不处理标签正文。 如果它返回一个 EVAL_BODY_INCLUDE
,那么将处理正文。
MapDefine
类的 doStartTag()
方法完成以下工作:
- 根据
type
属性确定要创建的 map 的属性。
- 根据
scope
属性确定新的 map 对象放在什么范围内。
- 根据
id
属性确定新 map 对象要放入的范围的名字。
让我们更详细地分析这个过程。MapDefine
类检查 type
属性是设置为 FASTTREE
、HASH
、TREE
还是 FASTHASH
。然后创建相应的 map,如下所示:
/* String constants for the different types of maps we support */ public static final String FASTHASH = "FASTHASH"; public static final String FASTTREE = "FASTTREE"; public static final String HASH = "HASH"; public static final String TREE = "TREE"; /** The map we are going to create */ private Map map = null; /** The member variable that holds the type attribute */ private String type = FASTTREE; ... public int doStartTag() throws JspException { /** Based on the type attribute, determines which type of Map to create */ if (type.equalsIgnoreCase(FASTTREE)) { map = new FastTreeMap(); } else if (type.equalsIgnoreCase(HASH)) { map = new HashMap(); } else if (type.equalsIgnoreCase(TREE)) { map = new TreeMap(); } else if (type.equalsIgnoreCase(FASTHASH)) { map = new FastHashMap(); }
然后,用 id
和 scope
属性将 hashmap 以一个给定的名字设置到一个给定范围中:
private String id; private String scope; public int doStartTag() throws JspException { ... if (scope == null){ pageContext.setAttribute(id, map); }else if("page".equalsIgnoreCase(scope)){ pageContext.setAttribute(id, map); }else if("request".equalsIgnoreCase(scope)){ pageContext.getRequest().setAttribute(id, map); }else if("session".equalsIgnoreCase(scope)){ pageContext.getSession().setAttribute(id, map); }else if("application".equalsIgnoreCase(scope)){ pageContext.getServletContext().setAttribute(id, map); } return EVAL_BODY_INCLUDE; }
如果范围属性是 null
,那么 map 将放入页范围。否则,参数将放入通过 scope
属性传递的范围名所对应的范围中。
到目前为止,我们已经有一个非常简单的标签,它有三个属性:id
、scope
和 type
。 我们将用给定的名字将 map 放到一个范围中。但是,我们还有一件事没做,就是声明 scriptlet 变量。 为了做到这一点,需要向 TLD 再添加一项,这就是我们在下一小节中所要做的事。
第 6 步:声明 scriptlet 变量
要 理解 scriptlet 变量,必须理解 TLD 文件的作用。这个文件基本上是元数据的一个储存库,当 JSP 页转换为 servlet 时,标签会使用这些元数据。 在生成的 servlet 中,scriptlet 变量成了本地变量。 要让 JSP 转换引擎知道这些变量应当声明的类型,需要像下面这样在 TLD 文件中增加项:
<variable> <name-from-attribute>id</name-from-attribute> <variable-class>java.util.Map</variable-class> <scope>AT_BEGIN</scope> </variable>
将上面的代码片断放在 TLD 文件中 body-content
元素之后、attribute
元素之前。 在 variable
元素下面,我们声明了三个子元素:name-from-attribute
、variable-class
和 scope
。 name-from-attribute
指定 id
属性的值是转换引擎将要定义的 scriptlet 变量的名字。variable-class
是转换将要定义的变量的类类型。scope
指定变量什么时候可用:它可以嵌套到标签的正文中 (NESTED
)、在标签结束后 (AT_END
)、或者在标签的开始时 (AT_BEGIN
)。我们使用 AT_BEGIN
这一范围,它意味着变量的范围将是从标签的开始到当前 JSP 页的结束。
现在了解了如何构建简单自定义标签。在下一小节中,我们将分析标签的生存周期方法,以了解 JSP 页实际运行时所发生的情况。
分享到:
相关推荐
本实例将深入探讨如何实现一个简单的JSP自定义标签。 首先,自定义标签的实现主要依赖于两个核心概念:Tag接口和TagSupport类。`Tag`接口定义了自定义标签必须实现的方法,如`doStartTag()`和`doEndTag()`,它们...
本篇学习笔记将深入探讨JSP自定义标签的相关概念、创建方法以及实际应用。 一、概述 1.1 使用简单标签机制 JSP自定义标签提供了类似HTML标签的语法结构,通过自定义标签,开发者可以封装复杂的Java代码,使得页面...
本教程将深入探讨JSP自定义标签的使用,同时结合实例介绍分页和下拉框绑定值的封装。 一、JSP自定义标签基础 1. **定义标签库(Tag Library)**:自定义标签首先需要定义一个TLD(Tag Library Descriptor)文件,它...
jsp自定义标签jsp自定义标签jsp自定义标签jsp自定义标签
使用jsp自定义标签的功能实现权限的控制。(如果用户没有某个模块的删除权限,就不现实这个删除按钮) 在整个项目中所有的页面都可以引入自定义的标签去做到权限的控制。 自定义标签文件 删除 可以控制页面中的每...
在JSP自定义标签的例子中,我们可以看到这个压缩包文件可能包含了一个完整的示例项目,可以在Apache Tomcat这样的Servlet容器下直接运行。Apache Tomcat是一款开源的Servlet容器,广泛用于部署和运行Java Web应用...
本文将详细讲解如何利用JSP自定义标签库实现数据列表的显示,以及涉及到的相关技术。 首先,`UserListTag.java` 是自定义标签的核心类,它继承了`javax.servlet.jsp.tagext.TagSupport` 或 `javax.servlet.jsp....
在使用JSP自定义标签时,开发者可能会遇到一些报错问题,这通常涉及到项目结构、类路径设置或自定义标签的编译与打包方式。在本文中,我们将深入探讨这些问题,以及如何解决“JspException”这个特定异常。 首先,...
首先,我们要理解JSP自定义标签的概念。自定义标签是JSP的一种扩展机制,它允许开发者创建自己的标签库,以更加清晰和可维护的方式编写页面。自定义标签的实现通常涉及三个主要部分:标签库描述符(TLD)、标签处理...
本篇将深入探讨“JSP自定义标签之日期显示”,以及如何通过自定义标签来优雅地处理日期格式化和展示。 首先,我们要理解JSP自定义标签的基本概念。自定义标签是JSP的一种扩展,它不是Java内置的标签,而是由开发者...
本教程将深入探讨JSP自定义标签的实例与详细讲解。 一、JSP自定义标签概述 JSP自定义标签是类似于HTML标签的自定义组件,但它们提供了更强大的功能,可以封装Java代码,提供复杂的业务逻辑。自定义标签通过TLD(Tag...
本教程将深入探讨如何利用JSP自定义标签来编写一个灵活、可扩展的分页系统,该系统不依赖于特定的数据库,具有很高的通用性。 首先,理解JSP自定义标签的工作原理至关重要。自定义标签由三部分组成:标签库描述符...
在Java Server Pages (JSP) 2.0版本中,自定义标签和自定义标签函数极大地扩展了JSP开发的灵活性和可重用性。这些特性允许开发者创建可复用的组件,使代码更加清晰,易于维护。本文将深入探讨JSP 2.0中的自定义标签...
一、JSP自定义标签基础 JSP自定义标签是JSP技术的一部分,它允许开发者创建自己的标签,以扩展HTML或XML文档。这些自定义标签可以封装复杂的Java代码,使JSP页面更加清晰,易于理解和维护。自定义标签由两部分组成:...
【jsp自定义标签库注意事项】 在Java服务器页面(JSP)开发中,自定义标签库是一种强大的工具,它能够帮助开发者创建可重用的代码片段,提高代码的可读性和可维护性。以下是对JSP自定义标签库的详细解释和使用注意...
综上所述,“权威实用jsp自定义标签demo,checkbox,radio>”教程旨在帮助开发者掌握如何创建和使用与选择器相关的自定义标签,从而提升JSP开发的效率和质量。通过学习这个教程,你可以了解到自定义标签的核心概念、...
本资源“jsp自定义标签大全.rar”提供了一套全面的JSP自定义标签的实例和指南,旨在帮助开发者深入理解和应用这一特性。 **JSP自定义标签的基本概念** JSP自定义标签不同于标准动作标签(如<jsp:include>或<jsp:...
java jsp自定义标签非常好用大家下载学习java jsp自定义标签非常好用大家下载学习java jsp自定义标签非常好用大家下载学习java jsp自定义标签非常好用大家下载学习java jsp自定义标签非常好用大家下载学习java jsp...
首先,我们需要理解JSP自定义标签的基本结构。自定义标签通常由两部分组成:标签库描述符(TLD)和标签处理类。TLD文件定义了标签的名称、属性、行为等元数据,而标签处理类则实现了这些行为,处理由JSP页面传递过来的...
总结起来,"JSP自定义Table标签demo"是一个教育性的示例,它演示了如何利用JSP自定义标签的灵活性和强大功能,来创建复杂且可复用的组件,如动态表格。通过学习和理解这个demo,开发者可以提升自己的JSP开发能力,...