1、简单标签
实现自定义标签的三个步骤:
1)编写标签处理程序(java类)。
2)编写标签库描述符(提供有关标签和库文件的元信息的XML文件)。
3)JSP实现(包含自定义标签的JSP文件)。
2、开发简单的自定义标签
1)标签处理程序wz.java的源代码如下:
4)对wz.tld文件的解释:
tlib-version:是必须的元素,指定标记库函数的版本号。
short-name:为标记库指定一个缩略名称,用它可以作为标记库的默认名字空间。
info:用来描述标记的文档信息,默认值为空。
uri:用来指定连接到标记的附加源文件,即tld的公共可用副本。
tag:是标记描述文件中最重要的一个元素,有6个子元素:name、tagclass、teiclass、bodycontent、info、attribute。
name:用户指定的标记名称。
tag-class:指定标记处理类,写全名,即带包的类。
bodycontent:说明标记体的类型,分为4种:empty、jsp、scriptless、tagdependent。
empty:表示没有标记体。
jsp:表示标记体可以为jsp代码。
scriptless:表示标记中不能用jsp脚本。
tagdependent:表示标签中的内容交给标记处理程序去进行处理。
info:记录标记的描述信息。
attribute:用来指定零个或者多个标记属性,有三个子元素:name、required、rtextprvalue。
name:必须设定,用来表示大小写敏感属性名称。
required:必须设定,标示属性是否一定要存在,默认为flase,即在标记处理程序中不会自动调用属性
的setAttribue方法。
rtextprvalue:用来说明属性是否可以是动态生成的,但设定为true时,属性即可以是一个常量值,也可
以由表达式生成。
3、标签文件,是JSP2.0新增的功能,目的是让JSP网页开发人员能够直接使用JSP语法来制作标签,而无须了解java语言。其扩展名都是.tag或.tagx。假如Tag File包含其他完整的或片段的Tag File,JSP2.0规范建议扩展名为.tagf。
1)Tag File的7个隐式对象:request、response、out、jspContext、session、application、config。
2)Tag File的指令:
tag 如同JSP网页的page指令。
taglib 如同JSP网页的taglib指令。
include 如同JSP网页的include指令。
attribute 用来设定自定义标签的属性。
variable 用来设TagFile的变量,此变量可回传至JSP网页。
3)新增的几个动作:
<jsp:attribute>标签:用来指定自定义标签属性块,必要时可以作为代码段输出。
<jsp:doBody>标签:告诉容器去处理body,并且将处理结果添加到response中,可以有选择地使用"var"属性,捕获处理的结果,并在下一步进行处理。
<jsp:invoke>标签:对作为属性传递的特定参数进行操作。
4)开发并使用一个日期标签:datetag.tag与datetag.jsp
datetag.tag的代码如下:
sumtag.tag的代码如下:
4、JSP标记与JavaBean有何区别?
答:JavaBean存在先天的不足,它只是可复用组件,独立于运行环境而包装了一些数据和业务逻辑功能,无法获得运行环境信息,无法与JSP页面进行更加深层次的交互。自定义标记机制解决了它的这种的缺陷,标记库的处理类不但具有JavaBean的功能,而且可以把JSP的环境住处传到类中间,不但能得到JSP传递过来的属性,还能与JSP共用页面环境,JSP页面中可以通过session、page与标记处理程序进行数据通信,这一点是javaBean所不能实现的。
实现自定义标签的三个步骤:
1)编写标签处理程序(java类)。
2)编写标签库描述符(提供有关标签和库文件的元信息的XML文件)。
3)JSP实现(包含自定义标签的JSP文件)。
2、开发简单的自定义标签
1)标签处理程序wz.java的源代码如下:
package
www.zzz;
import javax.servlet.jsp.tagext. * ;
import java.io. * ;
import java.util. * ;
import javax.servlet.jsp. * ;
public class wz extends SimpleTagSupport {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void doTag() throws JspException, IOException {
JspWriter out = this.getJspContext().getOut();
out.println("<h3>"+name+"的个人信息:</h3><br>");
getJspContext().setAttribute("name","姓名:"+name+"<br>");
getJspContext().setAttribute("age", "年龄:"+age+"<br>");
getJspBody().invoke(null);
}
}
2)标签描述文件wz.tld的内容如下:
import javax.servlet.jsp.tagext. * ;
import java.io. * ;
import java.util. * ;
import javax.servlet.jsp. * ;
public class wz extends SimpleTagSupport {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void doTag() throws JspException, IOException {
JspWriter out = this.getJspContext().getOut();
out.println("<h3>"+name+"的个人信息:</h3><br>");
getJspContext().setAttribute("name","姓名:"+name+"<br>");
getJspContext().setAttribute("age", "年龄:"+age+"<br>");
getJspBody().invoke(null);
}
}
<?xml version
=
"
1.0
"
encoding
=
"
UTF-8
"
?>
<taglib xmlns = " http://java.sun.com/xml/ns/j2ee "
xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance "
xsi:schemaLocation = " http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd "
version = " 2.0 " >
<description>
A tag library exercising SimpleTag handlers.
</description>
<tlib-version> 1.0 </tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/SimpleTagLibrary</uri>
<tag>
<description>Outputs Hello , World</description>
<name>wz</name>
<tag-class>www.zzz.wz</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>age</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3)引入标签的JSP页面的源码:
<taglib xmlns = " http://java.sun.com/xml/ns/j2ee "
xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance "
xsi:schemaLocation = " http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd "
version = " 2.0 " >
<description>
A tag library exercising SimpleTag handlers.
</description>
<tlib-version> 1.0 </tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/SimpleTagLibrary</uri>
<tag>
<description>Outputs Hello , World</description>
<name>wz</name>
<tag-class>www.zzz.wz</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>age</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
<%
@ page contentType="text/html; charset=GBK"
%>
<% @ taglib uri="/WEB-INF/tld/wz.tld" prefix="mytag" %>
< html >
< body >
< mytag:wz name ="张三" age ="15" >
${name}
${age}
</ mytag:wz >
</ body >
</ html >
注:编译后的类文件放到WEB-INF/classes目录下,描述文件tld放到WEB-INF/tld目录下(似乎哪个目录下都行,也可直接放到WEB-INF目录下,因为有uri引用吧),tag文件保存到web应用的WEB-INF/tags目录下。
<% @ taglib uri="/WEB-INF/tld/wz.tld" prefix="mytag" %>
< html >
< body >
< mytag:wz name ="张三" age ="15" >
${name}
${age}
</ mytag:wz >
</ body >
</ html >
4)对wz.tld文件的解释:
tlib-version:是必须的元素,指定标记库函数的版本号。
short-name:为标记库指定一个缩略名称,用它可以作为标记库的默认名字空间。
info:用来描述标记的文档信息,默认值为空。
uri:用来指定连接到标记的附加源文件,即tld的公共可用副本。
tag:是标记描述文件中最重要的一个元素,有6个子元素:name、tagclass、teiclass、bodycontent、info、attribute。
name:用户指定的标记名称。
tag-class:指定标记处理类,写全名,即带包的类。
bodycontent:说明标记体的类型,分为4种:empty、jsp、scriptless、tagdependent。
empty:表示没有标记体。
jsp:表示标记体可以为jsp代码。
scriptless:表示标记中不能用jsp脚本。
tagdependent:表示标签中的内容交给标记处理程序去进行处理。
info:记录标记的描述信息。
attribute:用来指定零个或者多个标记属性,有三个子元素:name、required、rtextprvalue。
name:必须设定,用来表示大小写敏感属性名称。
required:必须设定,标示属性是否一定要存在,默认为flase,即在标记处理程序中不会自动调用属性
的setAttribue方法。
rtextprvalue:用来说明属性是否可以是动态生成的,但设定为true时,属性即可以是一个常量值,也可
以由表达式生成。
3、标签文件,是JSP2.0新增的功能,目的是让JSP网页开发人员能够直接使用JSP语法来制作标签,而无须了解java语言。其扩展名都是.tag或.tagx。假如Tag File包含其他完整的或片段的Tag File,JSP2.0规范建议扩展名为.tagf。
1)Tag File的7个隐式对象:request、response、out、jspContext、session、application、config。
2)Tag File的指令:
tag 如同JSP网页的page指令。
taglib 如同JSP网页的taglib指令。
include 如同JSP网页的include指令。
attribute 用来设定自定义标签的属性。
variable 用来设TagFile的变量,此变量可回传至JSP网页。
3)新增的几个动作:
<jsp:attribute>标签:用来指定自定义标签属性块,必要时可以作为代码段输出。
<jsp:doBody>标签:告诉容器去处理body,并且将处理结果添加到response中,可以有选择地使用"var"属性,捕获处理的结果,并在下一步进行处理。
<jsp:invoke>标签:对作为属性传递的特定参数进行操作。
4)开发并使用一个日期标签:datetag.tag与datetag.jsp
datetag.tag的代码如下:
<%
@tag pageEncoding="GBK"
%>
<% @tag import="java.util.*,java.text.*" %>
<% @variable name-given="fulldate" scope="AT_BEGIN" %>
<%
DateFormat fullformate = DateFormat.getDateInstance(DateFormat.FULL);
Date now = new Date();
jspContext.setAttribute("fulldate", fullformate.format(now));
%>
< jsp:doBody />
datetag.jsp的代码如下:
<% @tag import="java.util.*,java.text.*" %>
<% @variable name-given="fulldate" scope="AT_BEGIN" %>
<%
DateFormat fullformate = DateFormat.getDateInstance(DateFormat.FULL);
Date now = new Date();
jspContext.setAttribute("fulldate", fullformate.format(now));
%>
< jsp:doBody />
<%
@ page contentType="text/html; charset=GBK"
%>
<% @ taglib prefix="mytag" tagdir="/WEB-INF/tags/" %>
<% @ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
< html >
< body >
< h1 >
日期tag标签文件演示
</ h1 >
< mytag:datetag >
标签体的输出:${fulldate} < br >
</ mytag:datetag >
页面的输出:${fulldate}
</ body >
</ html >
5)开发并使用一个求和标签:sumtag.tag与sumtag.jsp
<% @ taglib prefix="mytag" tagdir="/WEB-INF/tags/" %>
<% @ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
< html >
< body >
< h1 >
日期tag标签文件演示
</ h1 >
< mytag:datetag >
标签体的输出:${fulldate} < br >
</ mytag:datetag >
页面的输出:${fulldate}
</ body >
</ html >
sumtag.tag的代码如下:
<%
@tag pageEncoding="GBK"
%>
<% @attribute name="items" required="true" rtexprvalue="true" %>
<% @attribute name="great" fragment="true" %>
<% @attribute name="less" fragment="true" %>
<% @taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<% @variable name-given="sum" variable-class="java.lang.Object" %>
< c:if test ="${not empty items}" >
< c:forEach items ="${items}" var ="item" >
< c:set var ="sum" value ="${item+sum}" />
</ c:forEach >
< c:if test ="${sum>=1000}" >
< jsp:invoke fragment ="great" />
</ c:if >
< c:if test ="${sum<1000}" >
< jsp:invoke fragment ="less" />
</ c:if >
</ c:if >
sumtag.jsp的代码如下:
<% @attribute name="items" required="true" rtexprvalue="true" %>
<% @attribute name="great" fragment="true" %>
<% @attribute name="less" fragment="true" %>
<% @taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<% @variable name-given="sum" variable-class="java.lang.Object" %>
< c:if test ="${not empty items}" >
< c:forEach items ="${items}" var ="item" >
< c:set var ="sum" value ="${item+sum}" />
</ c:forEach >
< c:if test ="${sum>=1000}" >
< jsp:invoke fragment ="great" />
</ c:if >
< c:if test ="${sum<1000}" >
< jsp:invoke fragment ="less" />
</ c:if >
</ c:if >
<%
@ page contentType="text/html; charset=GBK"
%>
<% @ taglib prefix="mytag" tagdir="/WEB-INF/tags/" %>
<% @ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
< html >
< body >
< mytag:sumtag items ="111,222,333" >
< jsp:attribute name ="great" >
< font color ="red" > SUM: ${sum} </ font >
</ jsp:attribute >
< jsp:attribute name ="less" >
< font color ="blue" > SUM: ${sum} </ font >
</ jsp:attribute >
</ mytag:sumtag >
</ body >
</ html >
注:tag文件保存到web应用的WEB-INF/tags目录下。
<% @ taglib prefix="mytag" tagdir="/WEB-INF/tags/" %>
<% @ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
< html >
< body >
< mytag:sumtag items ="111,222,333" >
< jsp:attribute name ="great" >
< font color ="red" > SUM: ${sum} </ font >
</ jsp:attribute >
< jsp:attribute name ="less" >
< font color ="blue" > SUM: ${sum} </ font >
</ jsp:attribute >
</ mytag:sumtag >
</ body >
</ html >
4、JSP标记与JavaBean有何区别?
答:JavaBean存在先天的不足,它只是可复用组件,独立于运行环境而包装了一些数据和业务逻辑功能,无法获得运行环境信息,无法与JSP页面进行更加深层次的交互。自定义标记机制解决了它的这种的缺陷,标记库的处理类不但具有JavaBean的功能,而且可以把JSP的环境住处传到类中间,不但能得到JSP传递过来的属性,还能与JSP共用页面环境,JSP页面中可以通过session、page与标记处理程序进行数据通信,这一点是javaBean所不能实现的。