更新时间:2022-08-25 18:44
为了真正实现JSP文件中不包含任何Scriptlet代码,还需要通过标签来解决。标签分为自定义标签和开源工具提供的通用标签。
即便是在MVC设计模式中,仅通过使用EL表达式语言,很多时候JSP页面还是会存在大量的Scriptlet代码,为了真正实现JSP文件中不包含任何Scriptlet代码,还需要通过标签来解决。标签分为自定义标签和开源工具提供的通用标签。自定义标签通过标签编程来实现,由于标签编程较难,加上用户自定义的标签一般都很繁琐、不通用,所以实际开发中并不常用,读者只需要了解基本原理即可。真正在开发中使用的都是各种开源组件中提供。
JSP的开发是在HTML代码中嵌人大量的Java代码,但是这样使得JSP页面中充满了Java程序,修改或维护起来非常不方便,例如,下面的代码中就出现了大量的Scriptlet代码。
【示例代码1】包含Scriptlet代码的程序。
<%
int rows=i0;
int cols=10;
for(int X=0;X
%>
<%
for(int Y=0;y
%>
<% }
%>
<%
%>
本程序使用JSP完成表格的输出,但是里面存在过多的Scriptlet代码,所以这种程序阅读和修改起来非常麻烦,标签编程的主要目的就是为了减少页面中的Scriptlet代码,使程序更加便于理解和修改。
下面通过一个简单的程序演示标签编程,本程序的主要功能依然是在JSP页面上输出“Hello World!”的信息。
要想实现一个标签,可以直接继承javax.servlet.jsp.tagext.TagSupport类,如果要定义的标签内没有标签体,则直接覆写TagSupport类中的doStartTag()方法即可。
【示例代码2】定义标签的操作类。
源文件名称:HelloTag.java
package org.ixy.tag;
import javax.servlet.Jsp.JspException;
import javax.serv]et.Jsp.JspWriterj
import javax.servlet.Jsp.tagext.TagSupport;
public class HelloTag extends TagSupport{ //继承标签支持类TagSupport
public int doStartTag()throws JspException{ //覆写doStartTag()方法
JspWriter out=super.pageContext.getOut()j //取得页面输出流对象
try{
out.println(”Hello World!”)j //进行页面输出
)catch(Exception e){ //此处产生异常需要处理
e.printStackTrace()j
}
return TagSupport.SKIP—BODY; //没有标签体
)
)
在HelloTag类中,首先继承了TagSupptort标签支持类,之后覆写了doStartTag()方法,此方法主要的作用是在标签起始时进行调用,之后通过TagSupptort中的pageContext属性,取得了当前页面的输出对象,进行页面的输出,由于此时开发的标签没有任何的标签体,所以在程序的最后返回的是一个SKIP—BODY的常量,表示不执行标签体的内容。 一定标签类定义完成之后,下面就需要编写标签描述文件(Tag Library Descriptor,
TLD),在*.tld文件中,可以描述标签的名称、简介、处理类和标签使用到的各个属性等。
【示例代码 3】定义标签描述文件。
源文件名称:hellotag.tld
xmlns:xsi=”http://www.w3.org/200l/XMLSchema—instance’’
xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee/web
version=”2.1’。>
1.0
firsttag
hello
org.ixy.tag.Hel]oTag
empty
在hellotag.tld文件中,详细地描述了此标签的版本和支持的JSP版本,其中最重要的是在元素中定义的元素,表示的是标签中使用的名称。每个元素的具体作用如下:
:TLD文件的根元素,其中可以定义多个元素。
:标签库的版本,用于开发和配置管理。
:一个标签的短名称,主要用于标签的编写工作。
:描述标签库中的每一个标签。
:标签的名称。
:标签处理类的路径。
:表示标签中是否包含标签体,如果是empty表示标签体为空。
编写完*.tld文件之后,下面即可通过]SP访问此标签,JSP中调用标签的语法如下:
<%@taglib prefix=”标签前缀”uri=”TLD文件路径”%>
prefix表示的是标签使用时的前缀,uri表示的是此标签对应的*.tld文件的路径。
【示例代码4】标签测试程序。
源文件名称:hellotag.jsp
<%@page language=”java”import=”java util.*”pageEncoding=”GBK”%>
<%@taglib prefix=”mytag”uri=”/Web—INF/hellotag.tld”%>
My Jsp’hellotag.Jsp‘starting page
在hellotag.jsp页面中,首先通过<%@taglib%>定义了一个标签的前缀名称
“mytag”,之后通过此前缀名称调用了hellotag.tld文件中定义的标签,调用标签的名称为
“hello”。程序的运行结果如图1所示。
此时,虽然完成了一个标签的开发,但是也存在一个不足,本案例中的程序是在JSP(hellotag.jsp)中直接找到了标签描述文件(hellotag.tld),如果该标签文件名称过长,编写起来会很麻烦,若是更换标签描述文件的名称,修改起来更加麻烦,所以,一般会采取以下方法:在web.xml文件中对所有的*.tld文件进行名称的映射,以后直接在JSP页面中使用映射名称即可访问标签描述文件,修改web.xml,映射TLD文件,如下所示:
pxxy_hello
/Web—INF/hellotag.tld
此处将“/Web—INF/hellotag.tld”文件映射成pxxy—hello名称,所以在以后所有的JSP
中直接通过pxxy—hello即可访问此标签描述文件。
修改hellotag.jsp,使用映射名称访问标签:
<%@taglib prefix=”mytag”uri=”pxxy hello”%>
此时JSP通过映射名称访问标签描述文件,以后维护时也更加容易,程序运行结果与上面的一致。
通过上述标签案例的操作可以知道,一个标签的开发包含以下几个部分。
·标签处理类:HelloTag.java。
·标签描述文件:hellotag.tld。
·JSP页面:通过<%@taglib%>定义标签。
·在web.xml文件中配置映射名称。(可选)
一个标签的操作中*.tld是一个最重要的文件,所有标签的具体信息都要通过此文件定义,此文件的导人分两种情况。当一个JSP页面第一次运行时,首先会根据JSP文件编写的<%@taglib%>中的uri属性找到对的*.tld文件,并将其加载到JVM中;而如果是第二次运行此标签,由于JVM已经存在此*.tld文件,所以不会再重复加载。
使用标签库可以避免过多的Scriptlet代码,但是如果采用自定义的标签库做法,会非常繁琐且不通用,所以开发中一般是借助于一些开源工具使用一些公共的标签,JSTI。就是一种使用广泛的通用标签。
JSTL(JSP Standard Tag Library,JSP标准标签库)是一个开放源代码的标签组件,由
Apaceh的Jakarta小组开发,可以直接从http://tomcat.apache.org/taglibs/上下载。JSTL 1.2版本中主要有如下几个标签库支持,如下所示。
此时,即可使用JSTL进行项目开发。
JSTI。的核心标签库标签共13个,从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、Url操作标签。使用这些标签能够完成JSP页面的基本功能,减少编码工作。