版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
12.1标签库概述12.2自定义标签库的开发12.3安装配置支持JSTL的IDE12.4JSTL应用编程举例习题12第12章JSP标签库
标签库与JavaBean类似,也是一种软件复用技术,但标签库具有比JavaBean更丰富的运行时协议。
本章首先讲述标签库的概念、JSTL标签分类和标签实现接口,接着介绍用户自定义标签的开发。为了使我们更容易地使用标准标签库,本章第3节介绍了一种支持JSTL的集成开发环境:Eclipse+MyEclipse+Tomcat。第4节讲述如何使用JSTL开发Web应用。
12.1.1标签库的概念
标签扩展是一个Java类,它是运行一个或者两个接口的JavaBean。在JSP规范里,标签具有比JavaBean更丰富的运行时(Runtime)协议。它可以非常紧密地和JSP的表示逻辑联系在一起,同时它又具有和普通JavaBean相同的业务逻辑处理能力。标签库的典型应用有控制显示逻辑、内容迭代和访问数据库等。12.1标 签 库 概 述与HTML、XML类似,标签可以带有属性和主体(Body),也可以没有属性和主体,它们是可选的。最简单的标签没有属性和主体。下面是几种典型的标签:
●不带属性和主体的标签。
●不带主体但有属性的标签。
●带有属性和主体的标签。
另外,一个标签也可以嵌套在另一个标签里面,这就使得标签可以有很强的页面内容管理能力。从标签的来源上看,JSP中的标签库可以分为两种类型:一种是JSP标准标签库(JSPStandardTagLibrary,JSTL),它是JSP开发环境供应商开发的;另一种是JSP开发环境的使用者(即用户)自己定义的标签。
通过使用标签库,可以简化JSP和Web应用程序的开发,减少JSP中的脚本代码量,大大降低JSP页面的复杂度,并且使代码最大程度地重用。
12.1.2标签库的接口和类的继承关系
JSP所有的标签都实现了javax.servlet.jsp.tagext.JspTag接口。这个接口是一个标记接口,它有两个直接子接口:一个是SimpleTag接口,它是JSP2.0新增加的接口,代表简单的标签;另一个是Tag接口,它是经典的、必须实现的接口,它有一个直接子接口IterationTag。标签库的接口和类的继承关系如图12.1所示。
图12.1标签库的接口和类的继承关系
IterationTag是用于开发迭代的标签,它有一个简单的实现类TagSupport。在开发时,我们只要从TagSupport扩展就可以开发出迭代的标签了。IterationTag还有一个子接口BodyTag,该子接口允许带有Body。BodyTag也有一个实现类BodyTagSupport。在开发BodyTag时,往往直接从BodyTagSupport继承就可以了。当然,我们在开发自己的标签时,除了继承原有的类之外,也可以直接实现Tag接口。SimpleTag是JSP2.0新增加的一种标签类。12.1.3Tag接口中定义的方法和常量
在Tag接口中,定义了如下一些方法:doStartTag(),doEndTag(),setPagcontext(),setParent(),getParent(),release()。
表12.1给出了Tag接口中定义的标识符常量和成员方法。
表12.1Tag接口中定义的标识符常量和成员方法12.1.4JSTL介绍
从JSP1.1开始,JSP就支持在JSP中使用自定义标签了。自定义标签的广泛使用造成了程序员的重复定义,这就促成了标准标签库(JSPStandardTagLibaray,JSTL)的诞生。
JSTL是一个不断完善的开放源代码的JSP标签库,是由Apache的Jakarta小组开发的。JSTL运行在支持JSP1.2和Servlet2.3以上规范的容器上,如Tomcat4.0以上的版本。在JSP2.0规范中,JSTL被作为标准支持。JSTL的最新版本是JSTL1.1。
JSTL是一个实现Web应用程序中通用功能的定制标签的集合,这些功能包括迭代和条件判断、数据管理格式化、XML操作以及数据库访问等。目前,在JSTL中有core、format、sql和xml四个定制的标签库,每个标签库中都包含一些特定的标签。
core标签库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。format标签库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源来进行JSP页面的国际化。xml标签库包含一些用来操作通过XML表示数据的标签。sql标签库定义了一些用来查询关系数据库的操作。各个标签库所包含的标签及其功能等见表12.2。关于这方面的更详细描述请参阅/j2ee/1.3/docs/tutorial/doc/JSTL3.html~JSTL9.html。
表12.2目前JSTL中包含的标签、前缀及其分类和功能12.1.5表达式语言(EL)
表达式语言(ExpressionLanguage)是JSP2.0新增加的技术。通过表达式语言,可以非常简单地访问JavaBean中的属性,可以简化JSP开发,使代码整洁。在使用标签库时常用到表达式语言。
表达式语言是用符号“$”开始的,内容包括在花括号“{”和“}”中。例如,在12.4.1节的示例程序c12_3.jsp中就有下面两句使用了表达式语言:
<c:outvalue="${header['user-agent']}"/>
<c:outvalue="${a}"escapeXml="true"/>
其中的${header['user-agent']}和${a}都是表达式语言。
1.常用的隐含对象
JSP表达式语言定义了一些隐含对象,使用表达式语言可以方便地访问这些隐含对象。这些隐含对象除了我们在第5章介绍的内置对象中的request、response、sessin、cookie、pageContent外,还有:
●
requestScope:把请求作用域内的属性名称和值进行映射。
●
sessionScope:把会话作用域内的属性名称和值进行映射。●
applicationScope:把应用程序作用域内的属性名称和值进行映射。
●
pageScope:把页面作用域内的属性名称和值进行映射。
●
param:把请求中的参数名称和单个值进行映射。
●
paramValues:把请求中的参数名和单个值进行映射。
●
header:把请求中的header名和一个String类型的数组进行映射。
●
headerValues:把请求中的header名和一个String类型的数组进行映射。
2. EL运算符
表达式语言定义了以下的操作:
●算术运算符:+、-、*、/(或div)和%(或mod)。
●关系运算符:==(或eq)、!=(或ne)、<(或lt)、>(或gt)、<=(或le)和>=(或ge)。
●逻辑运算符:&&(或and)、||(或or)和!(或not)。上述三类操作与我们在第4章讲述的内容一致。
●验证运算符:empty。用于判断某个值是否为null或empty。
●点运算符:.。点运算符通常用于访问对象的特性。例如,在表达式${user.firstName}中,使用点运算符来访问user标识符所引用对象的名为firstName的特性。●方括号运算符:[]。方括号运算符用来检索数组和集合的元素。在数组和有序集合的情况下,把要检索的元素的下标放在方括号中。对于实现java.util.Map接口的集合,方括号运算符使用关联的键查找存储在映射中的值。在方括号中指定键,并将相应的值作为表达式的值返回。
点运算符和方括号运算符在某种程度上可以互换。点运算符和方括号运算符具有最高的优先级。
自定义标签技术是从JSP1.1开始支持的,而且在JSP1.2和2.0规范中得到了不断加强。通过定义标签库,可以简化JSP和Web应用程序的开发,减少JSP中的脚本代码量,大大降低JSP页面的复杂度,并且使代码最大程度地重用。12.2自定义标签库的开发12.2.1自定义标签的组成和开发步骤
自定义标签由标签处理程序和标签的描述组成。标签处理程序就是Java类,类中包含了请求期间将要执行的Java代码。当遇到特定的标签时,标签处理程序就会告诉系统应该做什么。标签的描述声明了怎样使用这个标签。如果用户要开发和使用自定义标签,则有下述四个步骤:
(1)开发标签实现类。也就是用Java语言来开发自己的标签库。开发标签实现类又有两种选择:一种是直接实现原始的Tag接口;另一种是从TagSupport类继承。
(2)编写标签描述文件。这个描述文件通常是以
.tld结尾的。
(3)修改web.xml文件。在web.xml文件中指定标签库的引用。
(4)编写JSP页面文件。在这个页面中通过<%
@
taglib>标签将自定义标签引入,从而实现使用自定义标签的目的。JSP容器使用这个标签库来确定在遇到定制标签时该怎么做。12.2.2继承TagSupport类开发自定义标签
下面通过继承TagSupport类来开发一个简单的标签,以说明自定义标签的开发过程。该例共包括四个文件,分别是HelloTag.java、mytag.tld、web.xml和c12_1.jsp。通常,这些文件都有特定的存放位置,弄不好就会出现找不到文件的错误。为此,我们首先将HelloTag.java文件放在src/bean目录下(src目录是系统自动生成的),将web.xml文件放在WEB-INF目录中(该目录也是系统自动生成的);然后,再在WEB-INF目录下建一个tlds目录,将mytag.tld文件放在这个目录下。
1.开发标签实现类
开发实现类就是编写
.java文件。本例通过继承TagSupport类来开发标签实现类,文件名是HelloTag.java,它被放在一个名为bean的包中。
HelloTag.java文件的内容如下:
packagebean; //给出包名
importjavax.servlet.jsp.*;
importjavax.servlet.jsp.tagext.*;
importjava.io.IOException;
importjava.util.Date;
//通过继承TagSupport类来开发标签
publicclassHelloTagextendsTagSupport
{
publicintdoStartTag()throwsJspTagException
{//覆盖doStartTag方法
returnEVAL_BODY_INCLUDE;
}
publicintdoEndTag()throwsJspTagException
{//覆盖doEndTag方法
StringdateString=newDate().toString();
try
{
pageContext.getOut().write("你好这是我自己开发的标签HelloTag<br>
现在的时间是:"+dateString);
}
catch(IOExceptionex)
{
thrownewJspTagException("Error:hellotagconldnotwritetoJSP");
}
returnEVAL_PAGE;
}
}
2.编写标签描述文件
标签描述文件是用XML格式书写的,且其扩展名固定为
.tld。本例的标签描述文件名为mytag.tld,其内容如下:
<?xmlversion="1.0"encoding="gb2312"?>
<taglib>
<description>
AtaglibraryexercisingSimpleTaghandlers.
</description>
<tlib-version>1.0</tlib-version><!--标签版本不能为空,且必须为准确值-->
<short-name>examples</short-name>
<uri>/demotag</uri>
<!--指定调用此标签的URI,demotag是系统默认的自定义标签库-->
<description>Asimpletablibraryfortheexample</description>
<tag>
<name>hello_tag</name>
<tag-class>bean.HelloTag</tag-class>
<!--类文件名一定要有包,且不可以使用默认的包-->
<body-content>empty</body-content>
<description>
Simplehelloworldexamples.Takesnoattribute,andsimplygeneratesHTML
</description>
</tag>
</taglib>
3.编写web.xml文件
在web.xml文件中指定标签库的引用。本例中web.xml文件的内容如下:
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<web-app>
<taglib>
<taglib-uri>/demotag</taglib-uri>
<taglib-location>/WEB-INF/tlds/mytag.tld</taglib-location>
</taglib>
</web-app>
在这个文件中,最关键的是<taglib-uri>和<taglib-location>两句,它们分别指出标签文件的存放路径和标签描述文件的存放位置,不能写错。
4.编写使用自定义标签的JSP页面文件
在JSP页面文件中通过<%@taglib>指令将自定义标签引入,从而实现使用自定义标签的目的。本例中的JSP页面文件是c12_1.jsp,其内容如下:
<%@tagliburi="/demotag"prefix="hello"%>
<%@pagecontentType="text/html;charset=gb2312"language="java"%>
<html>
<head>
<title>自定义tag使用实例</title>
</head>
<body>
<p>以下的内容从Taglib中显示:</p>
<p><i><hello:hello_tag/></i></p>
</body>
</html>完成了上述文件的编写后,就可以在浏览器地址栏中输入:
http://localhost:8080/ch12/c12_1.jsp
执行这个JSP文件,就可以看到如图12.2所示的效果。
这一过程看起来似乎有些复杂,但是,如果要在多处使用同样的代码时,就可以将这些代码写在一个自定义的标签中,做到一次编写,多处使用。此外,由于使用了标签,不仅增加了代码的重用度,而且也使页面易于维护。例如,可以把一些需要迭代显示的内容做成一个标签,在每次迭代显示时,使用这个标签就可以了,不必重复书写这些代码。
图12.2使用自定义标签hello的示例程序的执行效果12.2.3实现Tag接口开发自定义标签
下面再给出一个通过实现Tag接口的方式来开发标签程序的例子。这个例子和12.1.3节给出的例子只在
.java文件的内容上有所不同。这是因为接口提供的方法都是抽象方法,需要在使用此接口的程序中实现这些方法。其它几个文件内容只需做简单的修改就可以了。实现Tag接口的HelloTag2.java文件的内容如下:
packagebean;
importjavax.servlet.jsp.*;
importjavax.servlet.jsp.tagext.*;
importjava.io.IOException;
importjava.util.Date;
publicclassHelloTagimplementsjavax.servlet.jsp.tagext.Tag
{//实现Tag接口
privatePageContextpageContext;
privateTagparent;
publicHelloTag(){super();}//构造方法
publicvoidsetPageContext(finaljavax.servlet.jsp.PageContextpageContext)
{this.pageContext=pageContext;}//设置标签的页面的上下文
publicvoidsetParent(finaljavax.servlet.jsp.tagext.Tagparent)
{this.parent=parent;}//设置上一级标签
publicjavax.servlet.jsp.tagext.TaggetParent()
{returnparent;}//获取上一级标签
publicintdoStartTag()throwsjavax.servlet.jsp.JspTagException
{returnSKIP_BODY;
//开始标签时的操作返回SKIP_BODY,表示不计算标签体
}
publicintdoEndTag()throwsjavax.servlet.jsp.JspTagException
{//结束标签时的操作
try
{pageContext.getOut().write("Hello,你好!"); }
catch(java.io.IOExceptione)
{ thrownewJspTagException("IOError:"+e.getMessage());}
returnEVAL_PAGE;
}
publicvoidrelease(){}//释放标签程序占用的资源
}完成上述HelloTag.java程序的编写后,修改12.2.2节的web.xml文件,在该文件的</taglib>之后插入下述内容:
<taglib>
<taglib-uri>/hellotag2</taglib-uri>
<taglib-location>/WEB-INF/tlds/mytag.tld</taglib-location>
</taglib>
接着,再在12.2.2节的mytag.tld文件的</tag>之后插入下述内容:
<uri>/hellotag2</uri>
<tag>
<name>hello_tag2</name>
<tag-class>bean.HelloTag2</tag-class>
<body-content>empty</body-content>
<description>
Simplehelloworldexamples. Takesnoattribute,andsimplygeneratesHTML
</description>
</tag>
最后,再编写一个具有如下内容的c12_2.jsp程序:
<%@tagliburi="/hellotag2"prefix="hello"%>
<%@pagecontentType="text/html;charset=gb2312"language="java"%>
<html>
<head><title>firstcumstomedtag</title></head>
<body>
<p>以下的内容从Taglib中显示:</p>
<p><i><hello:hello_tag2/></i></p>
</body>
</html>完成上述文件的修改和编写后,在浏览器地址栏输入:
http://localhost:8080/ch12/c12_2.jsp
执行这个JSP文件,就可以输出如图12.3所示的“Hello,你好!”的信息。
图12.3使用自定义标签hello的示例程序的执行效果
虽然自JSP1.0开始就有了JSTL,而且从JSP2.0起,JSTL得到了进一步加强,并作为标准的支持。但是,由于第3章介绍的Eclipse中文加强版还没有把JSTL和Tomcat捆绑在一起,若要使用JSTL,需要下载
.jar和
.tld文件,而且这些文件都有特定的存放位置,需要创建相应的文件夹进行安装,操作比较复杂且容易出错。为此,我们在本节引入支持JSTL的集成开发环境,即Eclipse+MyEclipse+Tomcat环境,讲解如何把这些工具整合在一起使用。使用本节介绍的方法,就可以去除使用JSTL的上述烦恼。12.3安装配置支持JSTL的IDE12.3.1安装前的准备工作
Eclipse、MyEclipse都是开源软件,而且是免费的,可以直接在其官方网站上下载。这些文件的下载地址如下:
Eclipse3.2.2:/downloads/
MyEclipse5.1.1:/
Tomcat6.0:注意:Eclipse版本与MyEclipse版本必须匹配,如果你使用的Eclipse版本和上面列示的不一样,那你必须找到和你的Eclipse版本匹配的MyEclipse版本,否则是不能正常安
装的。
从上面列出的站点下载下列资源到f:\abc文件夹下。这是因为本例以f:\abc文件夹为安装目录,如果你计划的安装目录与我们的不同,请下载到你计划的目录中(下同)。
eclipse-SDK-3.2.2-win32.zip;
MyEclipse_5.1.1GA_installer.exe
apache-tomcat-6.0.10.exe
jdk-6-windows-i586.exe
下载完成后,将eclipse-SDK-3.2.2-win32.zip解压缩到f:\abc文件夹下。12.3.2安装配置MyEclipse的步骤
首先把Eclipse3.2.2解压缩到你的指定目录下,接着安装MyEclipse5.1.1插件。在安装过程中需要注意的是:如图12.4所示,一定要明确指定Eclipse的安装目录,这样才可以把插件正确地安装进去。
图12.4安装MyEclipse_5.1.1——选择Eclipse文件夹
(1)安装JDK1.6与Tomcat6的步骤见第3章。本节是在第3章JDK已安装好的前提条件下进行的。如果你还没有安装JDK,请按照第3章介绍的方法先把JDK安装好。
JDK1.6的安装目录是:F:\Java\jdk1.6.0。
Tomcat6.0.10的安装目录是:F:\abc\Tomcat6.0。
(2)安装MyEclipse_5.1.1插件。运行MyEclipse_5.1.1GA_Installer.exe,出现如图12.4所示的对话框。在这个对话框中输入存放eclipse文件的路径;也可单击“Choose…”按钮,指定eclipse的存放位置。本例指定的安装位置如图12.4所示,是F:\abc\eclipse-SDK-3.2.2-win32\eclipse。指定后单击“Next”按钮,弹出图12.5所示对话框。
(3)在图12.5所示的对话框中,需要指定安装MyEclipse的文件夹。本例指定的安装文件夹如图12.4所示,是F:\abc。然后单击“Next”,弹出图12.6所示对话框。
(4)图12.6所示是创建图标和热键对话框,在这里可取默认值。单击“Next”,弹出图12.7所示对话框。
(5)图12.7是对前几步设置的确认信息对话框。单击“Install”按钮,开始安装,弹出图12.8所示的对话框。图12.5安装MyEclipse_5.1.1——选择安装文件夹
图12.6创建图标和热键对话框
图12.7安装位置确认对话框
图12.8是否打开“ReleaseNotes”对话框
(6)图12.8所示的对话框是询问在安装完成后是否打开“ReleaseNotes”对话框。取默认值,单击“Next”,弹出图12.9所示的对话框。
(7)图12.9是显示“ReleaseNotes”信息的对话框。单击“Done”按钮,完成安装。
图12.9安装成功对话框12.3.3MyEclipse的其它一些设置
(1)设置工作区(目录)。运行f:\abc下的MyEclipse5.1.1GA,选择或设置工作区。如图12.10所示,本例设置的工作区为F:\xiti。
(2)配置Profereces。如图12.11所示,在MyEclipse的菜单栏中依次选择“Window”、“Profereces”,弹出如图12.12所示的“Preferences”对话框。
图12.10选择工作目录对话框图12.11设置MyEclipse的Profereces在图12.12所示的“Preferences”对话框的左侧目录树中,逐层展开“MyEclipse”、“ApplicationServers”选项;在“ApplicationServers”中选择“Tomcat5”或“Tomcat6”,然后再在右侧选中“TomcatServer”下的“Enable”单选按钮;最后,点击“Apply”按钮后再单击“OK”按钮,完成这一设置过程。
图12.12配置Profereces12.3.4一个使用JSTL的通用web.xml文件
在使用JSTL标签时总要用到web.xml文件。为了简化本章以下各节中有关这个文件的修改,下面我们给出一个使用JSTL的通用web.xml文件。该文件的内容如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<web-app>
<jsp-config>
<taglib>
<taglib-uri>/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/fmt-rt</taglib-uri>
<taglib-location>/WEB-INF/fmt-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/core-rt</taglib-uri>
<taglib-location>/WEB-INF/c-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/sql</taglib-uri>
<taglib-location>/WEB-INF/sql.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/sql-rt</taglib-uri>
<taglib-location>/WEB-INF/sql-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/x</taglib-uri>
<taglib-location>/WEB-INF/x.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/x-rt</taglib-uri>
<taglib-location>/WEB-INF/x-rt.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
本节对12.1.4节介绍的JSTL库中的各类标签,选择其中较常用的部分标签给出应用实例进行说明。
12.4.1<c:set>和<c:out>标签应用
1.
<c:set>标签语法
<c:set>标签用于设置某个对象的作用范围(page,request,session,application)或某个对象的属性。它有如下几种语法格式:12.4JSTL应用编程举例
(1)使用value属性设置var属性的值和作用范围(scope)。
<c:setvalue="value"var="varName"[scope="{page|request|session|application}"]/>
(2)设置var属性的作用范围,并且带有一个body。
<c:setvar="varName"[scope="{page|request|session|application}"]>
标签主体内容
</c:set>
(3)设置某个对象的一个属性。
<c:setvalue="value"target="target"property="proprtyName"/>
(4)设置某个对象的一个属性,并带有一个body。
<c:settarget="target"property="proprtyName"/>
标签主体内容
</c:set>
其中:var是用于表示value值的属性名;value属性的取值可以是一个具体值,也可以是一个将要计算的EL表达式;scope是var的有效范围;target代表将要设置属性的对象,它必须是一个JavaBean或java.util.Map对象;property是设置对象target的一个属性名。
2. <c:out>标签语法
<c:out>标签的作用是输出表达式的值,相当于JSP脚本中的<%=variableName%>语句。它的语法如下:
(1)没有body时。
<c:outvalue="value"escapeXml="{true
|
false}"[default="defaultValue"]/>
(2)带有body时。
<c:outvalue="${variableNam}"[escapeXml="{true|false}"]>
defaultvalue
</c:out>其中:value的取值可以是一个具体值,也可以是一个将要计算的EL表达式;escapeXml属性的作用是确定以下五个字符:<、>、&、’、”,在结果字符串中是否被转换成字符实体代码,该属性的默认值为true;default是个可选取项,当value为null时,输出default的值。
3.在MyEclipse中创建应用JSTL程序的过程
作为使用JSTL的第一个例子,下面我们从MyEclipse中创建项目的操作开始,分步讲解在MyEclipse中创建一个项目到运行一个测试程序的过程。
1)创建项目
启动MyEclipse,在菜单栏中依次单击打开“File”、“New”、“Project”菜单项,弹出如图12.13所示的“NewProject”对话框。
图12.13“NewProject”对话框在这个对话框中,依次单击展开“MyEclipse”、“J2EEProject”,选中“WebProject”项后,单击“Next”按钮,出现如图12.14所示的对话框(注意,第1次使用时需要注册)。在这个对话框的“ProjectName”后的框中输入名称“ch12”。然后,再选中“JSTLSupport”项下的“AddJSTLlibrariesto…”复选框;再选中“JSTL1.0”和“JSTL1.1”两个单选按钮中的任意一个(目前通常选JSTL1.1)。最后,点击“Finish”按钮,完成这一设置。
图12.14配置新建项目对话框
2)创建JSP文件
接着我们再新建一个名为c12_3.jsp的JSP文件。在“PackageExplorer”(资源管理器)窗口的“ch12”项目上单击右键,弹出如图12.15所示的快捷菜单。在这个菜单中依次选择“New”、“JSP(AdvancedTemplates)”,出现如图12.16所示的对话框。
图12.15快捷菜单
图12.16定义文件名对话框在图12.16所示的对话框的“FileName”后的文本框中输入文件名“c12_3.jsp”,然后单击“Finish”按钮,出现编辑文件的界面。
3)输入JSP程序代码
在编辑界面中,为c12_3.jsp文件输入如下所示的测试代码:
<%@pageimport="java.util.*"contentType="text/html;charset=GB2312"%>
<%@taglibprefix="c"uri="/jsp/jstl/core"%>
<html>
<head><title>测试第一个使用JSTL的网页</title></head>
<body>
<c:outvalue="欢迎测试第一个使用JSTL的网页"/>
</br>使用的用户代理是:</br>
<c:outvalue="${header['user-agent']}"/>
</br>输出我们自己定义的变量值:</br>
<c:setvar="a"value="DavidO′Davies"/>
<c:outvalue="${a}"escapeXml="true"/>
</body>
</html>
4)修改web.xml文件
接下来我们需要对WEB-INF目录下的web.xml文件做一些修改,即在web.xml文件中指定标签库的引用。由于我们在12.3.4节已经给出了一个通用的web.xml文件,所以,这里的修改工作只是把12.3.4节给出的web.xml文件复制到WEB-INF目录下。但需要指出的是,由于本例中只使用了<c:out>和<c:set>标签,所以实际上只用到该文件中的下述两段:
<taglib>
<taglib-uri>/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/core-rt</taglib-uri>
<taglib-location>/WEB-INF/c-rt.tld</taglib-location>
</taglib>此外,有些web.xml文件设置<taglib>标签时会产生异常。产生这种异常的一种可能是因为web.xml文档需要的DTD格式不一致。对于这种情况,只要把<web-app>后面的属性全部删除就可以了。还有一种情况是由于新版本的web.xml文件中没有<taglib>标签项。在这种情况下,可以先在<web-app>层内加入<jsp-config>层,再把<taglib>标签的内容写在<jsp-config>层内就可以运行了。12.3.4节给出的web.xml文件就是经过上述处理的。
5)运行发布前的工作
运行发布时需要指定所使用的服务器。图12.17~图12.20说明了这一过程。操作步骤如下:
(1)单击图12.17工具栏中圆圈标示的按钮,出现图12.18所示的界面。
图12.17运行发布界面
(2)在图12.18所示的界面上,首先单击“Project”后的下拉列表按钮,选定项目名。本例的项目名是在图12.14中设置的,如图12.18所示,为ch12。然后单击“Add”按钮,出现如图12.19所示的对话框,为项目添加服务器。
(3)在图12.19所示的界面上,首先单击“Server”后的下拉列表按钮,从中选定服务器。本例的服务器如图12.20所示,是Tomcat6。然后单击“Finish”按钮,出现如图12.20所示的对话框。
(4)在图12.20所示的对话框上,直接单击“OK”按钮,完成这一过程。
图12.18指定项目名并为项目添加服务器对话框
图12.19选择服务器对话框
图12.20为项目添加了服务器的界面
6)运行程序
首先单击图12.21工具栏中圆圈标示的按钮后的下拉列表按钮,在出现的列表中依次选择“Tomcat6”、“Start”项,启动服务器。然后,再单击图12.22工具栏中圆圈标示的“地球”按钮,在出现的地址列表框中输入或选择“http://localhost:8080/ch12/c12_3.jsp”,就可以看到图12.22中部窗口中的运行结果。
图12.21启动服务器发布项目的界面
图12.22运行程序的界面及运行结果启动IE浏览器,在地址栏中输入“http://localhost:8080/ch12/c12_3.jsp”,运行效果如图12.23所示。
图12.23c12_3.jsp的运行效果12.4.2迭代标签<c:forEach>应用
在JSP开发中,迭代是经常使用的操作。例如,脚本语言中的for循环和while循环等。JSTLcore大类中的<c:forEach>标签提供指定次数的循环或在某个数据结构(Collection/Array)上进行循环的能力。它有如下两种用法。
语法格式1:循环固定的次数。
<c:forEach
[var="varName"]
[varStatus="varStatusName"]begin="begin"
end="end"
[step="step"]>
标签主体的内容
</c:forEach>
语法格式2:在Collection/Array上进行循环。
<c:forEach[var="varName"]
items="collection"
[varStatus="varStatusName"]
[begin="begin"]
[end="end"]
[step="step"]>
标签主体的内容
</c:forEach>
其中,方括号中的内容是可选的。<c:forEach>的属性描述于表12.3中。
表12.3<c:forEach>的属性下面通过一个例子来说明<c:forEach>标签的使用。这个例子由两个程序组成:一个是名为TestBean.java的Java文件;另一个是使用<c:forEach>标签的JSP程序c12_4.jsp。
TestBean.java程序源代码如下:
packagech12;
publicclassTestBean
{ publicStringuserName;
publicStringuserID;
publicintage;
publicvoidsetUserName(Stringname) { this.userName=name; }
publicvoidsetUserID(Stringpassword){ this.userID=userID; }
publicStringgetUserName(){ returnthis.userName; }
publicStringgetUserID(){ returnuserID; }
publicintgetAge() { returnthis.age; }
publicvoidsetAge(intage) { this.age=age; }
}
c12_4.jsp程序源代码如下:
<%@taglibprefix="c"uri="/jstl/core"%>
<%@pagecontentType="text/html;charset=gb2312"language="java"%>
<%@pageimport="java.util.*,ch12.TestBean"%>
<%
Collectionusers=newArrayList();
for(inti=0;i<5;i++)
{
TestBeanuser=newTestBean();
user.setUserName("0624120"+i);
user.setUserID("2006040"+i);
user.setAge(20+i);
users.add(user);
}
session.setAttribute("users",users);
%>
<html>
<head>
<title>JSTL:c:forEach的使用</title>
</head>
<bodybgcolor="#FFFFFF"><center>
<h4>借阅者列表</h4>
<tableborder="1"align="center">
<tr><tdalign="center">学号</td><tdalign="center">ID</td>
<tdalign="center">年龄</td></tr>
<c:forEachvar="users"items="${users}">
<tr><td><c:outvalue="${users.userName}"/></td>
<td><c:outvalue="${users.userID}"/></td>
<tdalign="center"><c:outvalue="${users.age}"/></td></tr>
</c:forEach>
</table>
</center></body>
</html>
这个例子的运行结果见图12.24。
图12.24使用<c:forEach>标签的程序的运行结果12.4.3SQL类标签应用
SQL标签库有六个标签:<sql:setDataSource>、<sql:query>、<sql:update>、<sql:param>、<sql:dateParam>、<sql:transaction>,提供设置数据源、查询数据库、更新数据库和事务处理等功能。这里我们抛砖引玉地介绍<sql:setDataSource>、<sql:query>和<sql:update>三个标签的使用方法。
1.<sql:setDataSource>标签
<sql:setDataSource>标签是设置数据源的标签。对于没有默认数据库的JSP页面,<sql:setDataSource>标签能够准备一个数据库以供使用。<sql:setDataSource>标签的语法格式如下。
<sql:setDataSource{dataSource="dataSource"|url="jdbcUrl"
[driver="driverClassName"][user="username"][password="password"]}
[var="varName"]scope="scope"/>
<sql:setDataSource>标签的属性如表12.4所示。
表12.4<sql:setDataSource>标签的属性例如,下面的语句使用<sql:setDataSource>标签创建了一个数据源:
<sql:setDataSourcevar="jstl_sql"driver="sun.jdbc.odbc.JdbcOdbcDriver"url="jdbc:odbc:TestDB"scope="session"/>
在这个数据源中,代表数据库的变量名(var)是jstl_sql;数据库名是TestDB;由于JDBC驱动程序类的名称是sun.jdbc.odbc.JdbcOdbcDriver,故数据库类型是MSAccess。jstl_sql的作用范围是session。
2. <sql:query>标签
<sql:query>标签是SQL查询标签,使用该标签可以从数据库的表中读取数据。该标签有如下三种用法。
语法格式1:没有Body时。
<sql:querysql="sqlQuery"var="varName"[dataSource="dataSource"]
[scope="scope"][maxRows="maxRows"][startRow="startRow"]/>
语法格式2:有一个Body,并且在Body中指定了查询的参数。
<sql:querysql="sqlQuery"var="varName"[dataSource="dataSource"]
[scope="scope"][maxRows="maxRows"][startRow="startRow"]>
<sql:param>actions
</sql:query>
语法格式3:有Body并且指定可选的查询参数时。
<sql:queryvar="varName"[dataSource="dataSource"]
[scope="scope"][maxRows="maxRows"][startRow="startRow"]>
SQLquery
optional<sql:param>actions
</sql:query>
<sql:query>标签的属性如表12.5所示。
表12.5<sql:query>标签的属性3.用于更新的<sql:update>标签
<sql:update>标签用于更新数据库。它的语法中除了查询语句是SQL更新语句外,其它一些属性选项与<sql:query>标签是相同的。
4.SQL标签应用程序示例
下面是一个使用SQL类的标签设置数据源,查询数据库表中数据的sql_query.jsp程序实例。该例将JSP与MSAccess数据库TestDB.mdb连接,使用两种查询语句从student表中查询输出所有记录和某一条记录。student表的结构和内容见表12.6。
表12.6student表的结构和内容sql_query.jsp程序如下:
<%@taglibprefix="c"uri="/jstl/core"%>
<%@taglibprefix="sql"uri="/jstl/sql"%>
<%@pagecontentType="text/html;charset=gb2312"%>
<html>
<head><title>JSTL:的使用</title></head>
<bodybgcolor="#FFFFFF">
创建Access数据源,
<sql:setDataSourcevar="jstl_sql"driver="sun.jdbc.odbc.JdbcOdbcDriver"
url="jdbc:odbc:TestDB"scope="session"/>
查询输出student表:<hr>
<%--将得到表的结果集赋给queryResults--%>
<sql:queryvar="queryResults"dataSource="${jstl_sql}">
SELECT*FROMstudent
</sql:query>
<tableborder="1">
<%--输出queryResults中的表头--%>
<c:forEachvar="columnName"items="${queryResults.columnNames}">
<th><c:outvalue="${columnName}"/></th>
</c:forEach>
<%--输出queryResults中的内容--%>
<c:forEachvar="row"items="${queryResults.rows}">
<tr>
<td><c:outvalue="${row.id}"/></td>
<td><c:outvalue="${}"/></td>
<td><c:outvalue="${row.score}"/></td>
</tr>
</c:forEach>
</table>
<p>
查询名字为李莉的同学:<hr>
<sql:queryvar="query1"dataSource="${jstl_sql}">
SELECT*FROMstudentwherename=?
<sql:paramvalue="李莉"/>
</sql:query>
<tableborder="1">
<tr><td>学号</td><td>姓名</td><td>成绩</td>
</tr>
<c:forEachvar="row"items="${query1.rows}">
<tr>
<td><c:outvalue="${row.id}"/></td>
<td><c:outvalue="${}"/></td>
<td><c:outvalue="${row.score}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>该程序的运行结果如图12.25所示。这个程序中的<sql:queryvar="queryResults"dataSource="${jstl_sql}">SELECT*FROMstudent</sql:query>语句指出从变量名jstl_sql所指的数据库中查询student表,将查询的结果赋给queryResults对象保存(queryResults对象是javax.servlet.jsp.jstl.sql.Result类的实例)。然后通过<c:forEach>到</c:forEach>标签循环地取得结果集中的数据,再通过<c:out>标签进行输出。其中第一组<c:forEach>标签用于循环地取得表中的字段名;第二组<c:forEach>标签用于循环地取得表中的每一条记录。
JSTL的SQL标签提供了JSP页面与数据库进行交互的功能,访问数据库比较方便。然而它却是违反MVC模型规范的。因为与数据库交互的工作本身就属于业务逻辑层的工作,所以不应该在JSP页面中出现,而应该在模型层中进行。但是,SQL标签的存在对于早期纯JSP开发的应用以及小型的开发有重要的意义。另外,对于那些不熟悉或不适应Java语言的JSP页面作者提供了方便。
图12.25sql_query.jsp的运行结果12.4.4XML核心动作应用
在企业级应用越来越依赖XML的今天,XML格式的数据被作为信息交换的优先选择。JSTL标签库中的XML标签为程序设计者提供了对XML格式文件的基本操作。在该标签库中共有10个标签,被分为三类,分别是:XML核心动作、XML流程控制动作和XML转换动作。本节通过两个例子简要地说明XML核心动作和XML流程控制动作标签。注意,若要在本章第3节介绍的Eclipse+Myeclipse
+Tomcat的运行环境中使用JSTL的XML标签,还需要下载xalan.jar和serializer.jar两个支持包。读者可以从/dist/xml/xalan-j/下载xalan-j_2_7_0-bin-2jars.zip文件,解压后将其中的xalan.jar和serializer.jar两个包复制到Tomcat的lib目录中。
XML核心动作有<x:parse>、<x:out>和<x:set>三个标签。其中:<x:parse>用于解析XML文档;<x:out>用于计算Xpath表达式,并把计算结果返回给JspWriter对象进行输出;<x:set>也用于计算Xpath表达式,但它把计算结果保存到某个范围的变量中。它们的语法格式分别如下所示。表12.7列出了这些标签中的属性。
<x:parse>语法格式1:解析由String或者Reader对象组成的XML文档。
<x:parsexml="XMLDocument"{var="var"[scope="scope"]|varDom="var"
[scopeDom="scope"]}[systemId="systemId"][filter="filter"]/>
<x:parse>语法格式2:解析在Body中指定的XML文档。
<x:parse{var="var"[scope="scope"]|varDom="var"[scopeDom="scope"]}
[systemId="systemId"][filter="filter"]/>
XMLDocumenttoparse
</x:parse>
<x:out>语法格式:
<x:outselect="XpathExpressin"[escapeXml="{true|false}"]/>
<x:set>语法格式:
<x:setselect="XpathExpressin"var="varName"[scope="scope"]/>
表12.7XML核心动作的属性下面的例子说明XML核心动作的使用。我们使用12.3.4节介绍的方法新建一个名为ch12_xml的Web项目,在这个项目中新建一个名为xml_tag.jsp的JSP文件,在这个文件中输入下述代码:
<%@tagliburi="/jstl/core"prefix="c"%>
<%@tagliburi="/jstl/xml"prefix="x"%>
<%@pagecontentType="text/html;charset=gb2312"%>
<html>
<head><title>JSTL:XML的使用</title></head>
<bodybgcolor="#FFFFFF">
<x:parsevar="bookxml">
<books>
<bookid="02">
<name>BookName:Web应用开发技术:JSP</name>
<author>Author:崔尚森张白一</author>
<publisher>publisher:西安电子科技大学出版社</publisher>
</book>
</books>
</x:parse>
<x:outselect="$bookxml/books//name"/><br/>
<x:outselect="$bookxml/books//author"/><br/>
<x:outselect="$bookxml/books//publisher"/>
</body>
</html>
输入完成后,发布运行xml_tag.jsp程序,可看到如图12.26所示的结果。
图12.26xml_tag.jsp的运行结果12.4.5XML流程控制动作应用
XML流程控制动作标签有<x:if>、<x:choose>、<x:when>、<x:otherwise>和<x:forEach>五个,它们提供了基于XPath表达式的流程控制。它与core流程控制动作标签<c:if>、<c:choose>和<c:forEach>等非常类似,不同的是XML流程控制动作标签应用了XPath表达式。例如:
<x:forEachselect="$do
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 环境保护变更协议书
- 信息安全设备防腐施工合同
- 商场装修施工协议
- 精准医疗企业总经理聘用协议
- 人力资源公务员聘用合同方案
- 市政设施服务车库施工协议
- 2024年度工程建设合同工程质量保证
- 2024年居民用水合同标准版3篇
- 2024年智能家居退房退租服务协议3篇
- 2024商超项目股权转让与品牌授权合作协议范本3篇
- 酒店建设投标书
- 《基于javaweb的网上书店系统设计与实现》
- 《皇帝的新装》课件
- 国家开放大学电大《基础写作》期末题库及答案
- 劳动教育五年级上册北师大版 衣服破了我会补(教案)
- DB3502∕T 139-2024“无陪护”医院服务规范通 用要求
- 期中模拟练习(试题)-2024-2025学年统编版语文二年级上册
- 人教版九年级历史下册第10课-《凡尔赛条约》和《九国公约》(共31张课件)
- 2023年法律职业资格《客观题卷一》真题及答案
- 教科版 三年级上册科学知识点归纳梳理
- 2024年初级经济师考试经济基础知识真题及答案
评论
0/150
提交评论