在本文系列的第一部分中,你已经学习了如何配置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页面的代码。
查看本文来源