1. 自定义标签运行原理
自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被
称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。
2. 两种标签
可以定义两种类型的标签:
(1) javax.servlet.jsp.tagext.Tag
(2) javax.servlet.jsp.tagext.BodyTag
有标签体的标签必须实现 BodyTag 接口, 无标签体的简单标签可以实现 Tag 接口。
3. 标签处理程序
int doStartTag() throws JspException---处理开始标签
int doEndTag() throws JspException---处理结束标签
Tag getParent()/void setParent(Tag t)---获得/设置标签的父标签
void setPageContext(PageContext pc)--- pageContext 属性的 setter 方法
void release() 释放获得的所有资源
doStartTag()和doEndTag()方法的返回值说明:
SKIP_BODY 表示不用处理标签体,直接调用doEndTag()方法。
SKIP_PAGE 忽略标签后面的jsp(SUN企业级应用的首选)内容。
EVAL_PAGE 处理标签后,继续处理jsp(SUN企业级应用的首选)后面的内容。
EVAL_BODY_BUFFERED 表示需要处理标签体,且需要重新创建一个缓冲(调用setBodyContent方法)。
EVAL_BODY_INCLUDE 表示在现有的输出流对象中处理标签体,但绕过setBodyContent()和doInitBody()方法
EVAL_BODY_AGAIN 对标签体循环处理。(存在于javax.servlet.jsp.tagext.IterationTag接口中)
实现javax.servlet.jsp.tagext.Tag接口或扩展javax.servlet.jsp.tagext.TagSupport类:
TagSupport 类定义了 get/setParent() 和 setPageContext(),这与所有标签处理程序几乎相同。get/setParent()
方法允许标签嵌套。
TagSupport 类还定义了一个可以被子类使用的 pageContext 实例变量 (protected PageContext pageContext),
这个变量是由 setPageContext() 方法设置的。
在创建自定义标签之前,需要创建一个 标签处理程序。标签处理程序是一个执行自定义标签操作的 Java 对象。
在使用自定义标签时,要导入一个
标签库 —— 即一组标签/标签处理程序对。通过在 Web 部署描述符中声明库导
入它,然后用指令 taglib 将它导入 JSP 页。
<%@ taglib prefix="util" uri="http://org.dmwdp.pem/tag/util-1.0" %>
如果 JSP 容器在转换时遇到了自定义标签,那么它就检查 标签库描述符(tag library descriptor) (TLD) 文件
以查询相应的标签处理程序。TLD 文件对于自定义标签处理程序,就像 Web 部署描述符对于 servlet 一样。
在运行时,JSP 页生成的 servlet 得到对应于这一页面所使用的标签的标签处理程序的一个实例。生成的 servlet 用
传递给它的属性初始化标签处理程序。
标签处理程序实现了 生存周期 方法。生成的 servlet 用这些方法通知标签处理程序应当启动、停止或者重复自定义
标签操作。生成的 servlet 调用这些生存周期方法执行标签的功能。
4. TLD 文件
TLD文件的根元素是 taglib。
taglib 描述了一个 标签库 —— 即一组标签/标签处理程序对。
因为使用的是 JSP 版本 1.2,所以在这个例子中需要 tlib-version 和 short-name 元素。
tlib-version 元素对应于标签库版本。
jsp-version 对应于标签库所依赖的 JSP 技术的版本。
short-name 元素定义了 IDE 和其他开发工具可以使用的标签库的简单名。
taglib 元素包含许多 tag 元素,标签库中每一个标签有一个 tag 元素。
5. 案例实战
(1) TLD文件:utilTag.tld
<?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.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>util</short-name>
<uri>http://com.zskx.pem/tag/util-1.0</uri>
<tag>
<name>domainUrl</name>
<tag-class>com.dmwdp.network.biz.commons.taglib.DomainUrlTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>imgUrl</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
(2) web.xml配置
......
<jsp-config>
<taglib>
<taglib-uri>util</taglib-uri>
<taglib-location>/WEB-INF/taglib/utilTag.tld</taglib-location>
</taglib>
</jsp-config>
......
(3) 标签处理类
public class DomainUrlTag extends TagSupport {
private static final Logger LOGGER = Logger.getLogger(DomainUrlTag.class);
private static final long serialVersionUID = 8662373418251060423L;
private String imgUrl;
public void setImgUrl(String imgUrl) {
this.imgUrl = imgUrl;
}
public DomainUrlTag() {
}
@Override
public int doStartTag() throws JspTagException {
//表示在现有的输出流对象中处理标签体,但绕过setBodyContent()和doInitBody()方法
return EVAL_BODY_INCLUDE;
}
@Override
public int doEndTag() throws JspException {
if (StringUtils.isBlank(imgUrl)) {
return EVAL_PAGE;
}
String[] imgServers = ImagePropertiesReader.getImageServerURLs();
int imgUrlCount = imgServers.length;
int serverNum = Math.abs((imgUrl.hashCode() % imgUrlCount));
String resultUrl = null;
for (int i = 0; i < imgUrlCount; i++) {
if (serverNum == i) {
resultUrl = imgServers[i];
break;
}
}
outPutResultUrl(resultUrl);
return EVAL_PAGE;
}
private void outPutResultUrl(String resultUrl) {
if (StringUtils.isBlank(resultUrl)) {
return;
}
try {
pageContext.getOut().write(resultUrl);
} catch (IOException e) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Customize Tag error", e);
}
}
}
}
(4) 页面使用
<%@ taglib prefix="util" uri="http://com.zskx.pem/tag/util-1.0" %>
<link rel="shortcut icon" href="<util:domainUrl imgUrl='/pem.ico'/>/dmwdp.ico" />
(5) ImagePropertiesReader.java
public class ImagePropertiesReader {
private static final Logger LOGGER = Logger.getLogger(ImagePropertiesReader.class);
private static Properties props = new Properties();
private ImagePropertiesReader() {
}
static {
try {
final InputStream tempIn = ImagePropertiesReader.class.getResourceAsStream("/image.properties");
props.load(tempIn);
} catch (Exception e) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("ImagePropertiesReader error", e);
}
}
}
public static String[] getImageServerURLs() {
String imgUrlStr = props.getProperty(Constant.DMWDP_IMAGE_SERVER_URLS);
return imgUrlStr.split(",");
}
}
分享到:
相关推荐
自定义标签可以带有属性,这些属性在标签被调用时可以传递特定的值,使得标签的使用更加灵活和强大。 #### 二、创建自定义带属性的标签步骤 1. **编写自定义标签类**:首先,你需要创建一个继承自`javax.servlet....
对于带有标记体的标签,需要继承`javax.servlet.jsp.tagext.BodyTagSupport`,并在处理类中使用`doStartTag()`、`doAfterBody()`和`doEndTag()`方法来处理标签体内容。 5.3 一个简单的带标记体的标签(二) 在实际...
在JSP中,`BodyTagSupport`接口提供了一组方法,用于处理带有体内容的标签。这些方法包括: - `doStartTag()`:此方法在标签的开始执行,它决定了是否需要评估标签体内的内容。 - `setBodyContent()`:此方法由容器...
本实例将带你深入理解JSP自定义标签的创建和使用。 首先,我们要了解自定义标签的结构。自定义标签通常由三部分组成:标签库描述文件(TLD)、标签处理类(Tag Handler)和JSP页面。TLD是XML格式的文件,用于定义...
可以像这样使用带有标签体的自定义标签:`内容</my:fargment>`。 通过以上步骤,你就能创建并使用自定义的JSP标签了。这增强了JSP的可扩展性和复用性,使得开发更加灵活,代码更易于管理和维护。
一个“自定义标签”是开发者为了扩展JSP(JavaServer Pages)功能而创建的,它允许我们封装复杂逻辑并将其作为可重用的组件。本项目提供了一个用于分页的自定义标签,适用于那些需要在网页上进行数据分页展示的应用...
3. 带标签体的标签:标签之间可以包含其他JSP标签、HTML或自定义标签的内容。 4. 可以被Scriptlet使用的标签:通过定义id和type属性,可以在标签后面的Scriptlet中引用。 在JSP技术中,自定义标签的处理类需要实现...
- **带有标签体**:标签内可以包含其他内容,如`<mt:iterate>Hello</mt:iterate>`。 - **嵌套使用**:一个自定义标签可以包含另一个自定义标签,如`<map:mapdefine>`中的`<map:mapEntry>`。 3. **标签处理程序** ...
自定义标签是JSP的高级特性,它允许我们创建自己的标签库,这些标签可以有自己的行为逻辑,与内置的JSP标签(如`<jsp:include>`或`<c:forEach>`)类似。通过定义标签处理程序类和XML格式的TLD(Tag Library ...
“带有参数的taglib(自定义标签)”是Java Web开发中的一个重要概念,它允许我们在JSP页面中定义和使用具有参数的自定义标签,从而提高代码质量,简化开发流程。了解并熟练掌握自定义标签的创建和使用,对于提升...
在Java Web开发中,自定义标签(Custom Tags)是一种扩展JSP功能的有效方式,它可以将复杂的业务逻辑封装起来,使得视图层代码更加简洁、易读。本篇内容主要介绍了一个简单的分页标签的实现过程,这是一个很好的学习...
- **有属性的标签**:通过设置属性值来调用标签。 ```jsp ``` - **带体内容的标签**:可以在标签内嵌入其他内容。 ```jsp // 标签体内容 ``` #### 四、标签库文件(TLD) 1. **标签库文件的定义**:...
Tag标签有多种类型,包括带属性的Tag、带Body的Tag、定义了脚本变量的Tag,以及具有协作关系的Tag。例如,带属性的Tag可以通过属性传递参数,带Body的Tag可以包含其他HTML或JSP代码,定义脚本变量的Tag可以在Tag内部...
本文将基于一篇技术笔记——《自定义标签库制作(二)》,详细阐述如何创建并应用带有参数的自定义标签。 **一、自定义标签的概念与意义** 自定义标签允许开发者封装复杂的业务逻辑和UI组件,以标签的形式在JSP...
- **BodyTag接口**(JSP1.2):处理带有体内容的标签,增加了`doAfterBody()`和`doBeforeBody()`方法。 - **IterationTag接口**(JSP1.2):处理迭代标签,通常与BodyTag一起使用。 - **SimpleTag接口**(JSP2.0):...
2. 带有属性的空标签,如`<max num1="13" num2="32" />` 3. 带有内容的标签,如`<greeting>Welcome you!</greeting>` 4. 带有内容和属性的标签,如`<greeting name="zhou">Welcome you!</greeting>` 5. 嵌套标签,如...
对于带有条件判断的自定义标签,如`if-else`,通常需要在`doTag()`方法中进行逻辑判断。由于示例中这部分内容较多,建议直接查看提供的资源文件。但基本思路是,在`doTag()`方法内根据属性值或表达式的计算结果来...
自定义标签库 自定义标签库是 JSP 页面...为自定义标签定义属性时,每个属性都必须按照 JavaBean 的属性命名方式,在标签处理器中定义属性名对象的 setter 方法,用来接收 JSP 页面调用自定义标签时传递进来的属性值。
通过这种方式,可以在JSP页面中动态地渲染出带有预设值的下拉列表。 #### 其他自定义标签概述 除了`options`标签之外,根据提供的文件内容,还有其他几种自定义标签可用于不同的用途: - **header**标签: 用于...
**JSP自定义标签的使用**是JSP应用开发中的一种高级特性,它允许开发者创建自己的标签库,以更简洁、可复用的方式编写代码,提高程序的可读性和维护性。下面我们将深入探讨自定义标签的相关概念和创建步骤。 **1. ...