随笔 - 71  文章 - 15  trackbacks - 0
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

因为口渴,上帝创造了水;
因为黑暗,上帝创造了火;
因为我需要朋友,所以上帝让你来到我身边
Click for Shaanxi xi'an, Shaanxi Forecast
╱◥█◣
  |田|田|
╬╬╬╬╬╬╬╬╬╬╬
If only I have such a house!
〖总在爬山 所以艰辛〗
Email:myesjoy@yahoo.com.cn
NickName:yesjoy
MSN:myesjoy@hotmail.com
QQ:150230516

〖总在寻梦 所以苦痛〗

常用链接

留言簿(3)

随笔分类

随笔档案

文章分类

文章档案

Hibernate在线

Java友情

Java认证

linux经典

OA系统

Spring在线

Structs在线

专家专栏

企业信息化

大型设备共享系统

工作流

工作流产品

网上购书

搜索

  •  

最新评论

阅读排行榜

评论排行榜

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学习

FeedBack:
# re: Struts提供的强大的HTML标签库总结[未登录] 2015-08-20 13:45 哈哈
是  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: