我来详细讲解一下 "JSP 自定义标签第3/3页" 的完整攻略。
什么是 JSP 自定义标签
JSP 自定义标签,指的是用户可以自定义自己的标签,在 JSP 页面上使用,达到简化 JSP 页面代码,增加可读性的目的。JSP 自定义标签可以分为两种类型:
- 动态内容标签:在标签体中执行动态内容,并输出结果。
- 静态内容标签:输出预定的静态内容,不需要执行动态逻辑。
自定义标签的基本语法
自定义标签的基本语法如下:
<taglib>
<tag>
<name>tagName</name> <!-- 标签名 -->
<tag-class>com.xxx.TagClass</tag-class> <!-- 标签类名 -->
<body-content>JSP</body-content> <!-- 标签体内容 -->
</tag>
</taglib>
其中,name
是标签名,tag-class
是标签对应的 Java 类的全限定名,body-content
表示标签体可以有的内容类型,有三种可选值:
- JSP:标签体内直接写 JSP 代码。
- empty:标签体为空。
- scriptless:标签体不能是 JSP 代码,并且无法访问隐含对象。
自定义标签的完整攻略
从定义标签类、定义标签库及部署应用三部分来讲解 JSP 自定义标签的完整攻略。
定义标签类
自定义标签的 Java 类主要包含两个部分:定义属性和业务逻辑的方法。
定义标签属性
使用 Java Bean 的方式,在标签类中定义属性,可以使用 JSP 页面中的属性(即 JSP EL 表达式)或者其他 var 变量来设置自定义标签的属性值。
示例如下:
public class HelloWorldTag extends TagSupport {
private String message;
public void setMessage(String message) {
this.message = message;
}
// ...
}
在 JSP 页面中使用自定义标签时,可以使用 JSP EL 表达式或者 var 变量来设置 message
属性的值,例如:
<my:helloWorld message="${param.name}" />
<my:helloWorld message="${user.name}" />
实现业务逻辑的方法
自定义标签的业务逻辑方法必须实现 javax.servlet.jsp.tagext.Tag
接口。在 doStartTag()
方法中处理标签的开始标记,doEndTag()
方法中处理标签的结束标记,doAfterBody()
方法中处理标签之间循环的内容。具体实现方式可以根据不同的标签体内容类型进行定义。
示例如下:
public class HelloWorldTag extends TagSupport {
private String message;
@Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.println("Hello World!");
out.println("Message: " + message);
} catch (IOException e) {
throw new JspException(e.getMessage());
}
return EVAL_BODY_INCLUDE;
}
// ...
}
定义标签库
标签库主要包含了用标签名映射标签的信息,可以让 JSP 引擎知道哪些标签由哪些类的哪些方法处理。
标签库需要定义在一个 XML 文件中,如 mytag.tld
中的示例:
<taglib>
<tlib-version>1.0</tlib-version>
<tag>
<name>helloWorld</name>
<tag-class>com.xxx.HelloWorldTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>message</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
其中,name
是自定义标签的名字,tag-class
是自定义标签的处理类,body-content
是标签体的内容类型,attribute
标签是自定义属性信息。
部署应用
将自定义标签类编译成 class 文件,打成 jar 包,将 jar 包放到 WEB-INF/lib 目录下。然后将 mytag.tld
文件放到 WEB-INF 目录下,配置 web.xml 文件。
web.xml 文件中增加以下内容:
<jsp-config>
<taglib>
<taglib-uri>/mytag</taglib-uri>
<taglib-location>/WEB-INF/mytag.tld</taglib-location>
</taglib>
</jsp-config>
其中,taglib-uri
是个性化命名空间,taglib-location
是 mytag.tld 文件的路径。
完成以上步骤后,就可以在 JSP 页面中使用自定义标签了,示例如下:
<%@ taglib prefix="my" uri="/mytag" %>
...
<my:helloWorld message="Hello World!" />
示例说明
动态内容标签示例
以自定义标签名为 foreach
的动态内容标签为例,示例如下:
- 在 webapp 目录下创建目录
WEB-INF/tags
,并在此目录下创建 foreach.tag 文件:
<%@tag body-content="JSP"%>
<%@attribute name="items"%>
<%@variable name-given="item" alias-from="item"%>
<%@variable name-given="index" alias-from="index"%>
<%@variable name-given="count" alias-type="int" scope="AT_BEGIN"%>
<%
Object[] items = (Object[]) pageContext.getAttribute("items");
if (items != null) {
for(int index=0; index<items.length; index++) {
count = index + 1;
item = items[index];
pageContext.setAttribute("item", item);
pageContext.setAttribute("index", index);
%>
<%=bodyContent%>
<%
}
}
%>
该标签的标签体可以是 JSP 代码,需要使用 attribute
定义标签属性。
- 在 webapp 目录下创建目录
WEB-INF/tags
,并在此目录下创建 foreach.tld 文件:
<tag>
<name>foreach</name>
<tag-class>com.example.tags.ForEachTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
定义自定义标签的属性,将标签名映射到标签类。
- 在 JSP 页面中使用自定义标签:
<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %>
<my:foreach items="${items}">
<p>item: ${item}, index: ${index}, count: ${count}</p>
</my:foreach>
静态内容标签示例
以自定义标签名为 includeHeader
的静态内容标签为例,示例如下:
- 在 webapp 目录下创建目录
WEB-INF/tags
,并在此目录下创建 includeHeader.tag 文件:
<%@ tag language="java" pageEncoding="UTF-8"%>
<div class="header">
<h1>This is header</h1>
</div>
该标签的标签体为空,输出预定义的静态内容。
- 在 webapp 目录下创建目录
WEB-INF/tags
,并在此目录下创建 includeHeader.tld 文件:
<tag>
<name>includeHeader</name>
<tag-class>com.example.tags.IncludeHeaderTag</tag-class>
<body-content>empty</body-content>
</tag>
将标签名映射到标签类。
- 在 JSP 页面中使用自定义标签:
<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %>
<my:includeHeader />
输出定义好的静态内容。
总结
以上就是 “JSP 自定义标签第3/3页” 的完整攻略,主要包括了自定义标签的基本语法、定义标签类、定义标签库及部署应用,以及两个示例说明。自定义标签可以帮助简化 JSP 页面代码,使其更具可读性,也可以根据业务需求灵活自由的定义标签。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP 自定义标签第3/3页 - Python技术站