Struts
提供了一个强大的
HTML
标签库来帮助你构建
Web
应用程序。
为了更容易、更快速地进行开发,
Struts
提供了功能同其它
JSP
标签库类似的五个标签库,即:
HTML
、
Bean
、
Logic
、
Template
和
Nested
。第一部分讲述如何配置一个
Struts
应用程序来运用这个标签库,并介绍了第一组标签;第二部分讲述了第二组标签;
HTML
标签库主要用来显示
HTML
元素,如果不用这种方法,你就必须用
HTML
标签来指定它们。从表面上看,这个标签库很简单。但是通过深入研究,我们就会发现它很强大。例如,它可以为我们在
HTML
表单的一个特定输入元素中放置重点内容生成
JavaScript
,或为客户端输入验证生成脚本。而且,你可以用它通过一行代码来处理错误。然而,在将这个标签库用于你的
Struts
应用程序前,你需要做些简单的准备工作。
配置应用程序来运用标签库
在运用
Struts HTML
标签库前,你需要通过三个步骤来配置一个
Struts
应用程序。
1.
在部署描述符(
web.xml
文件)中注册标签库:
<taglib>
<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
上面的代码就告诉了
servlet container
有关
Struts HTML
标签库的情况,以及在哪里可以找到标签库的
TLD
文件。
2.
确信将
struts-html.tld
文件复制到
WEB-INF
目录中。你不用担心标签库类文件,因为它们已经包含在
struts.jar
文件中了。
3.
在运用标签库的每个
JSP
页面中,插入下面的
<taglib>
指示符:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
另外,你也可以运用
struts-html.tld
文件来学习它所支持的标签以及每个标签可以带有哪些属性。
运用一个自定义的标签库通常是很容易的:只要遵循前面讲述的步骤就行了。然而,有些标签库包含一些原则,这些原则使我们在运用这些标签库时并不那么容易。
Struts HTML
标签库就是其中之一。有些标签很简单、很容易使用;然而,另外有些标签则取决于
Struts
应用程序中的其它标签或其它元素。
我将
HTML
标签库中的标签大致分成了两类:简单、容易使用的标签,我把它们称为
“
独立的标签
”
,第二类是必须通过一个
form
标签来使用的标签。我把第二类的标签简单地称为与
form
相关的标签。本文主要讲述独立的标签,在本系列文章的
第二部分
我将讲述与
form
相关的标签。
HTML
标签库包含几个很容易使用的独立的标签。下面讲述几个比较重要的标签。
<html>
标签
<html>
标签是
HTML
标签库中最容易的标签。它有两个属性:
locale
和
xhtml
,两者都不是必需的。下面的代码选自一个运用
<html>
标签的
JSP
页面:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html:html locale="true">
<head>
<title>Welcome</title>
</head>
<body>
Hello World!
</body>
</html:html>
注意,我们没有用标准的
<html>
元素,而是用了
<html:html>
标签。其中第一个
html
指的是前缀,第二个是
<html>
标签本身。而且我们也用了
locale
属性。
JSP
页面将显示成:
<html lang="en">
<head>
<title>Welcome</title>
</head>
<body>
Hello World!
</body>
</html>
注意,
<html:html locale=“true”>
中的
locale
属性在生成的
HTML
页面中被转换成了
lang=“en”
。生成的结果取决于
Struts
应用程序所位于的服务器的
locale
。如果你将应用程序部署到一个不同
locale
的服务器,你不需要改变代码。
Locale
会自动调整。
<base>
标签
<base>
标签显示一个
HTML
元素,用一个
href
属性表示所包含的
JSP
页面的绝对位置。只有当这个标签是内嵌在一个
head
标签部分时,它才有效。例如这个
JSP
页面:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html:html locale="true">
<head>
<title>Welcome</title>
<html:base/>
</head>
<body>
Hello World!
</body>
</html:html>
会转换成以下形式:
<html lang="en">
<head>
<title>Welcome</title>
<base href="http://www.domain.com/myStrutsApp/testing.jsp">
</head>
<body>
Hello World!
</body>
</html>
<img>
标签
<img>
标签用来生成一个
HTML <IMG>
标签。它最重要的属性有:
·page
:图象文件相对于模块的路径;前面必须带有一个斜线
·height
:图象的高度
·width
:图象的宽度
·alt
:如果找不到图象,显示的文本
例如:
<html:img page="/logo.gif" height="50" width="200" alt="Company Logo"/>
会转换成:
<img src="/myStrutsApp/logo.gif" height="50" width="200" alt="Company Logo">
<link>
标签
<link>
标签会生成一个超链接。例如标签:
<html:link page="/index.html">Click here</html:link>
会转换成:
<a href="/myStrutsApp6/index.html">Click here</a>
<errors>
标签
<errors>
标签的易于使用性通常会掩盖其真正的强大功能。通过一个简单的
<html:errors/>
标签,你就可以在一个
JSP
页面上显示完全自定义的错误信息。
这个标签检查
Request
对象的属性集合来查找一个
reserved key
。如果它找到一个
reserved key
,它就假设这个
key
是一个
String
、或是一个
String
数组(它包含在模块的
MessageResources
中查找的
message keys
)、或是类型为
org.apache.struts.action.ActionErrors
的一个对象。
如果在应用程序资源中存在相应的信息,那么就可以用下面这些可选的
message keys
:
· errors.header
:相应的信息在错误信息的单独列表前显示
· errors.footer
:相应的信息在错误信息的单独列表后显示
· errors.prefix
:相应的信息在错误信息的单独列表前显示
· errors.suffix
:相应的信息在错误信息的单独列表后显示
Struts HTML
标签库会使开发更容易、更快速。为了有效地运用这个标签库,你需要对标签库中的标签很熟悉。在本系列文章的第一部分中,你学习了如何配置一个
Struts
应用程序来运用标签库,并对独立的标签有了总体的了解。
在下面第二部分中,你将学习与
form
相关的标签,讲述了如何使用
Struts
提供的
form
相关的标签。
与
form
相关的标签包括
<form>
标签本身以及所有必须包含在其中的标签。比如,
<text>
和
<password>
标签就是和
form
相关的标签,因为如果不把它们放到一个
form
中它们就没有意义。
<form>
标签
<form>
标签用于生成一个
HTML form
。使用该标签时必须遵循许多规则。
首先要遵循的规则是
,
<form>
标签中必须包含一个
action
属性,它是这个标签中唯一必需的属性。如果不具备该属性则
JSP
页面会抛出一个异常。之后你必须给这个
action
属性指定一个有效值。一个有效值是指应用程序的
Struts
配置文件中
<action-mappings>
元素里的任何一个
<action>
子元素的访问路径。而且相应的
<action>
元素中必须有一个
name
属性,它的值是
form bean
的名称。
例如,如果你有这样一个
<form>
标签:
<html:form action="/login" >
那么你的
Struts
配置文件的
<action-mappings>
元素中必须有一个如下显示为粗体的
<action>
元素:
<action-mappings>
<action path="/login"
type="com.javapro.struts.LoginAction"
name="loginForm"
scope="request"
input="/login.jsp">
<forward name="success" path="/mainMenu.jsp"/>
</action>
.
.
.
</action-mappings>
这就是说一个
form
标签是和
form bean
相关联的。
另一个要遵循的规则是:
任何包含在
<form>
中用来接收用户输入的标签(
<text>
、
<password>
、
<hidden>
、
<textarea>
、
<radio>
、
<checkbox>
、
<select>
)必须在相关的
form bean
中有一个指定的属性值。比如,如果你有一个属性值被指定为
“username”
的
<text>
标签,那么相关的
form bean
中也必须有一个名为
“username”
的属性。输入
<text>
标签中的值会被用于生成
form bean
的
userName
属性。
除了上面所讲的属性之外,
<form>
标签还有一些不是必须但加上更好的
“
次要
”
的属性
。比如,你可以用
focus
属性来生成
JavaScript
,它会
“
定焦
”
(
focus
)到该
form
所包含的一个元素上。使用
focus
属性时你需要给它指定元素的名称。比如,以下代码是定焦在第二个
Text
元素上的:
<body>
<html:form action="/login" focus="password">
User Name: <html:text property="userName"/>
<br>Password: <html:text property="password"/>
<br><html:submit/>
</html:form>
</body>
该段代码会被转换成:
<body>
<form name="loginForm" method="post" action="/myStrutsApp6/login.do">
User Name: <input type="text" name="userName" value="">
<br>Password: <input type="text" name="password" value="">
<br><input type="submit" value="Submit">
</form>
<script language="JavaScript"
type="text/javascript">
<!--
if (document.forms["loginForm"].elements["password"].type != "hidden")
document.forms["loginForm"].elements["password"].focus()
// -->
</script>
</body>
注意,
<form>
标签中
method
属性的缺省值是
POST
。另外,有没有看到这个标签库是如何建立
JavaScript
来定焦到
password
元素上的
?
这也是该库让人着迷的地方之一。你不用担心如何在客户端进行编程,它会帮你自动生成。
在运行前面的例子时还要注意,你必须有一个包含
userName
和
password
属性的相关
form
。你可以参考本文第三部分中的
Login
程序。
<text>
标签
<text>
标签用于生成一个文本的输入区域。它必须包含和相关
form bean
中的相同属性对应的
“property”
属性。该标签只有在嵌入到一个
<form>
标签中时才有效。
例如:
<html:text property="userName"/>
会被转换成:
<input type="text" name="userName" value="">
<password>
标签
<password>
标签用于生成一个口令字(
type password
)的输入区域。它必须包含和相关
form bean
中的相同属性对应的
“property”
属性。该标签只有在嵌入到一个
<form>
标签中时才有效。该标签中的一个很重要的属性是
“redisplay”
,它用于重新显示以前输入到这个区域中的值。该属性的缺省值为
true
。然而,为了使
password
不能被重新显示,你或许希望将该属性的值设为
false
。
例如:
<html:password property="password" redisplay="false"/>
会被转换成
:
<input type="password" name="password" value="">
<hidden>
标签
<hidden>
标签用于生成一个隐藏文本的输入区域。它必须包含和相关
form bean
中的相同属性对应的
“property”
属性。该标签只有在嵌入到一个
<form>
标签中时才有效:
例如:
<html:hidden property="userName"/>
会被转换成
:
<input type="hidden" name="userName" value="">
<textarea>
标签
<textarea>
标签用于生成一个文本区元素(
text area element
)。它必须包含和相关
form bean
中的相同属性对应的
“property”
属性。
比如:
<html:textarea property="details" cols="80" rows="20" value="Enter details here"/>
会被转换成:
<textarea name="details" cols="80" rows="20">Enter details here</textarea>
<radio>
标签
<radio>
标签用于显示一个单选按钮(
radio button
)。它必须包含
“value”
属性。比如这段代码:
<html:radio property="title" value="1"/>Mr.
<html:radio property="title" value="2"/>Ms.
<html:radio property="title" value="3"/>Dr.
会被转换成这样的
HTML
:
<input type="radio" name="title" value="1">Mr.
<input type="radio" name="title" value="2">Ms.
<input type="radio" name="title" value="3">Dr.
<checkbox>
标签
<checkbox>
标签用于显示
checkbox
类型的输入区域。比如:
<html:checkbox property="notify"/>Please send me notification
会被转换成:
<input type="checkbox" name="notify" value="on">Please send me notification
<submit>
标签
<submit>
标签用于生成提交类型(
type submit
)的输入区域。
比如:
<html:submit value="Login"/>
会被转换成:
<input type="submit" value="Login">
<reset>
标签
<reset>
标签用于生成重置类型(
type reset
)的输入区域。比如:
<html:reset/>
会被转换成:
<input type="reset" value="Reset">
<option>
标签
<option>
标签用于显示
select box
中的一个选项。参照下面的
<select>
标签。
<select>
标签
<select>
标签用于显示一个包含零个或更多选项的
HTML
选择元素。它必须被嵌入一个
<form>
标签中才有效。下面这个例子将说明如何使用该标签:
<html:select property="color" size="3">
<html:option value="r">red</html:option>
<html:option value="g">green</html:option>
<html:option value="b">blue</html:option>
</html:select>
会被转换成:
<select name="color" size="3"><option value="r">red</option>
<option value="g">green</option>
<option value="b">blue</option>
</select>
在本文系列的第二部分,你学到了一些更重要的和
form
相关的标签。在使用这些标签之前,你必须依照一些规则以便正确地运用它们。第三部分将讲述如何在真正的程序中使用这些标签。
在本文系列的第一部分中,你已经学习了如何配置
Struts
提供的
HTML
标签库以及独立使用的标签;在第二部分中你学习了和
form
相关的标签;在第三部分中,你将学习如何在
Login
程序中使用
HTML
标签库。你可以点此下载该程序。如果你阅读过关于
Struts
的系列文章(包含六个部分),你会发现这个
Longin
程序是上次我们讨论过的
Login
程序的增强版。
图
1.
应用程序目录结构
这个
Login
程序是一个简单的
Struts
程序,它将显示如何使用
HTML
标签库,尤其是和
form
相关的标签和用于错误处理的标签。其目录结构如图
1
中所示。
本文将介绍程序中每个类之间的关系以及它们所起的作用。注意,你必须自己将所有的库文件复制到
WEB-INF/lib
目录下;为了节省下载时间它们没有被包含在
ZIP
文件中。
视图
MVC
范例中有三种作为视图的
JSP
页面:
login.jsp
、
mainMenu.jsp
和
viewSecret.jsp
。
login.jsp
文件中包含一个用于用户登录的
form
,
mainMenu.jsp
中显示了两个链接(注销(
log out
)和查看公司机密),而
viewSecret.jsp
则用来显示一条机密消息。
这个程序的首页面是一个
Login
页面,它是一个包含两个输入框(
userName
和
password
)的
form
(见图
2
)。用户被要求在这两个输入框中输入正确的值。登录成功之后程序会显示
mainMenu.jsp
页面,它包含两个链接:一个是注销,另一个是查看公司机密账号(见图
3
)。
如果点击了
“
注销
”
链接,程序便会退出并重新显示
Login
页面。如果点击了
“
查看机密
”
链接,则会显示
viewSecret.jsp
页面。如果注册失败,那么用户会被重新引导到
Login
页面以重新登录。
如果点击了
“
注销
”
链接,程序便会退出并重新显示
Login
页面。如果点击了
“
查看机密
”
链接,则会显示
viewSecret.jsp
页面。如果注册失败,那么用户会被重新引导到
Login
页面以重新登录。
图
2. Login
页面
如果用户输入正确的用户名和密码,程序会建立一个
session
对象,并会有一个名为
loggedIn
的属性被添加到这个
session
对象中去。只有当程序能够在用户的
session
对象中查找到这个
loggedIn
属性时,用户才可以浏览
Main Menu
页面和
Secret
页面。所有缺少该属性或无效的
session
对象都会迫使用户登录。在这个程序中,正确的用户名是
“john”
,密码是
“123”
。这些值是程序中固定写死的以避免需要连接到数据库里或使用其他存储来完成用户验证。
当用户注销时,他或她的
session
对象将失效,同时
Longin
页面会重新显示。当用户点击链接要查看公司机密时,会弹出
viewSecret.jsp
页面(见图
4
)。
图
3.
主页面
配置文件
Login
程序有两个位于
WEB-INF
目录下的配置文件:作为部署描述符的
web.xml
文件(见列表
1
);以及作为
Struts
配置文件的
truts-config.xml
文件
(见列表
2
)。在列表
1
中,你需要特别注意
action servlet
配置中的
<init-param>
元素:
<init-param>
<param-name>application</param-name>
<param-value>com.javapro.struts.ApplicationResources
</param-value>
</init-param>
一个
<init-param>
元素代表一个初始化参数,它会被包含在传送到
action servlet
中的
ServletConfig
对象里。带有名为
“application”
的初始化参数对
action servlet
来说具有特殊的意义:它定义了一个会被加载到缺省消息资源(
message resource
)中的属性文件。(我将在
“
消息资源
”
部分介绍这个属性文件)。在这个程序中,该属性文件被用于存贮整个程序中的错误消息。
部署描述符中需要注意的第二个地方是的
<taglib>
元素,它包含
<taglib-uri>
和
<taglib-location>
元素。基本上,
<taglib>
元素是用来告诉
servlet
容器如何使用一个标签库的,该标签库的
TLD
文件可以在
<taglib-location>
元素指定的位置找到。
图
4.
机密页面
注意在列表
2
中,
<form-beans>
部分包含一个名为
loginForm
的
form bean
。我在关于
Struts
系列文章的第五部分中曾介绍过
form bean
。
WEB-INF
目录中的最后一个文件是
struts-html.tld
文件,它是
HTML
标签库中的
TLD
文件。为了节省时间我将跳过对它的介绍,但你可以在
ZIP
文件中的
WEB-INF
目录下找到它。
Form
该
form
以
com.javapro.struts.LoginForm
类的形式显示(见列表
3
)。注意粗体的部分:它通过传入
“error.missing.userName”
和
“error.missing.password”
字符串来举例说明
ActionError
对象,这些字符串在消息资源中起关键字(
key
)的作用。
Action
类
Action
类分两种:
LoginAction
(见列表
4
)和
LogoutAction
(见列表
5
)。另外值得一提的是如何通过消息资源中的一个关键字来构建这个
ActionError
消息(在列表
4
中显示为粗体)。
HTML
标签库的使用
列表
6
、列表
7
和列表
8
中分别包含了
JSP
文件。
login.jsp
页面(见列表
6
)中显示了如何在
HTML
库中使用这些标签(粗体部分)。我在本文系列的第一部分中介绍过这些标签,但通过看它如何在真正的程序中运行,你会对它们有更深入的了解。
消息资源
如我在
“
配置文件
”
部分简要介绍的那样,在
WEB-INF/classes/com/javapro/struts
目录下的
ApplicationResources.properties
文件中包含配对的
key/values
,它们会被加载到缺省的消息资源中去。
HTML
标签库中的
<errors>
标签会在该消息资源中查找到自定义的错误消息。想知道它是如何出错的,你可以试着用一个错误的用户名或密码来登录,看看显示的错误消息是什么。更改错误消息和编辑属性文件一样容易。看看如下的属性文件:
errors.header=<b>Error(s)!!!</b><ul>
errors.footer=</ul><hr>
error.missing.userName=<li>A user name was not found.</li>
error.missing.password=<li>A password was not found.</li>
error.login.failed=<li>Incorrect user name and/or password.</li>
如果你检查了程序的
web.xml
文件,你会看到这些对象是如何被加载的。消息资源通过将程序的参数传入
ActionServlet
来完成加载过程。在
ActionServlet
进行初始化时,它会将
package
文件夹中的
ApplicationResources.properties
属性解析为缺省的消息资源。如果在资源中更改一个消息并重新加载程序,它就会在整个程序中显示。在你的
Login
程序中,这个属性文件包含一些程序的类中所使用的错误消息。
本文介绍了如何在一个简单的
Login
程序中使用
HTML
标签库。它对程序进行了详细描述,包括视图、配置文件、
form bean
、
action
类以及用于
JSP
页面的代码。
posted on 2006-04-19 16:52
★yesjoy★ 阅读(3061)
评论(1) 编辑 收藏 所属分类:
Structs学习