实用Struts应用程序编写实例(一)
引言
Struts 是 Apache 软件基金会(Apache Software Foundation)资助的一个开放源代码框架。您可以用它来维护和扩展 Web 应用程序。 IBM® WebSphere® Studio Application Developer 版本 5.0(以下称 WebSphere Studio)对 Struts 有内建支持,支持 Struts 1.02 和 1.1(beta 2)。WebSphere Studio 中的 Struts Configuration 编辑器使您可以很容易地修改 struts-config.xml 文件。这篇文章描述了怎样用 WebSphere Studio 中的内建支持创建一个 Struts 示例。
Struts
Struts 框架完全是用 Java 写的,写时用了标准 J2EE API。另外,它还采用了几种著名的 J2EE 设计模式,比如模型-视图-控制器(Model-view-controller)和 FrontController。
模型-视图-控制器(MVC) 模型-视图-控制器(MVC)是一种设计模式,它在定义下面三个应用层时作了明确的区分。
·模型(model)是应用程序的数据和业务规则集合。通常被称作应用程序的业务逻辑。
·视图(view)是应用程序的用户界面。
·控制器(controller)定义了应用程序与用户输入及模型进行交互的方式。它被称作应用程序逻辑。
通过明确区分各个层,MVC 允许组成每个层的各个组件间松散地耦合。这使它更加灵活,并且可以重用代码。例如,如果您为一个应用程序开发了几个用户界面,那么就需要开发视图组件,因为各应用层间是松散耦合的。Struts 框架是 MVC 的视图和控制器组件。下面展示了 Struts 怎样映射为 MVC 框架。Struts 有三个主要组成部分:
·Action bean
·ActionServlet
·ActionForm bean 和定制的标记。
图 1. MVC 和 Struts 框架
Action bean 和 ActionServlet Struts 提供了一个单独的 ActionServlet(org.apache.struts.action.ActionServlet)来处理所有的浏览器请求。这种类型的框架我们称之为 FrontController 模式。每个浏览器请求都由 Struts 的 Action 子类(org.apache.struts.action.Action 的子类)来处理。每个浏览器请求都被映射为 struts-config.xml 文件内的一个 Action 子类。ActionServlet 在初始化期间加载这种映射。要配置 Web 项目使其把所有的浏览器请求都传递给 ActionServlet,请把所有以 .do 结尾的 URI(例如 *.do)都映射为 Web 部署描述符中的 ActionServlet。然后您可以在 Struts 配置文件中为各个请求 URI(比如 /submit.do)提供实际的 Action 子类映射。
ActionForm bean 浏览器请求可带参数。当用户提交 HTML 表单后,Struts 框架就把参数放在一个 org.apache.struts.action.ActionForm bean 中。您也可以用 ActionForm bean 把缺省值预先植入一个表单,这些缺省值可从数据库或其他的后端系统获得。如果用户在表单中输入了不正确的值,ActionForm 可以进行验证。您可以用以前的输入重新显示表单。
定制的标记 Struts 提供了许多支持 ActionForm bean 的 JSP 定制标记。这些定制的标记支持:
·把从 ActionForm 子类中获得的值预先植入 HTML 表单。
·国际化,比如提供由用户语言环境决定的文本。
·逻辑,比如根据人们对页面的使用方式为其显示不同的标题。
Struts 是一个通用的框架,您可以很容易地把它和 WebSphere Studio 一起使用。下面我们来开始第一个 Struts 示例。
编写一个简单的 Struts 应用程序
先决条件:启动 WebSphere Studio 版本 5.0:
·转到 Window Start 菜单。
·选择 Programs => IBM WebSphere Studio => Application Developer 5.0。
第 1 步:开始一个新的 Struts Web 项目
创建一个 1.3 EAR 项目(不包含 EJB / Client 或 Web 项目):
1.选择 New => Projects => Enterprise Application Project。
2.选择 Create 1.3 J2EE Enterprise Application Project。按 Next。
3.取消对全部三个子项目(Application Client Project、EJB Project 和 Web Project)的选择。
4.输入 StrutsEAR 作为项目名。
5.单击 Finish。
创建一个 Web 项目并添加 Struts 支持:
1.选择 New => Projects => Web => Web Project。
2.输入 StrutsSampleWeb 作为 Web 项目。
3.选择 Add Struts support 复选框。单击 Next。
4.选择 Existing Enterprise Application Project。
5.浏览查找新建的 EAR 项目。两次单击 Next。
在 Struts Setting 页面中选择 Override default settings,并在下拉框中选择 1.1 (beta 2) ,如图2 所示。前面已经提到过,表单被提交时,HTML 表单数据被自动植入 Struts ActionForm。Struts 1.0.1 只支持简单的 Java 类型。而 Struts 1.1(beta 2)还支持 java.util.HashMap 或其他的 Collection 类型。这一点我们将在本文的后面部分讨论。
单击 Finish。
图 2 .覆盖 Web 项目创建向导中的缺省设置
检查图 3 中的 Struts 文件结构。
图 3 .支持 Struts 的 web 项目
您将稍后修改下面的文件:
·ApplicationResources.properties 是 Struts 应用程序的资源绑定。语言环境的详细信息和错误消息都放在这个属性文件中。
·struts-config.xml 是 Struts 的 xml 配置文件。WebSphere Studio 为这个文件提供了一个 GUI 编辑器。
现在,请执行下列操作:
1.检查 web.xml 文件。
2.展开 StrutsSampleWeb 项目并双击 Web Deployment Descriptor 来打开编辑器。
转到 Servlets 页面。请注意下面两点:
·名为 action 的 Struts org.apache.struts.action.ActionServlet 的定义。
·到这个 servlet 的 URL 映射,*.do。
请注意,在 Initialization 部分,validate 被设为 true。ActionServlet 用 XML 解析器来验证和处理配置文件。它与表单验证无关,稍后在本文中您将看到这一点。
*.do 怎样获得正确的 Action 类? 前面已经提到过,ActionServlet 和 Action 类是 MVC 模型中控制器层的核心。该控制器负责处理用户的请求,把请求路由到业务逻辑,并选择视图来响应用户(请参阅 Struts 用户指南,第 4.4 节)。表单提交给 submit.do 后,Struts ActionServlet 会根据 struts-config.xml 文件中的 选择正确的 Action 类来用。
Struts Action 子类负责处理用户数据。在这个示例中,创建一个名为 SubmitAction 的 Struts Action 子类。它由诸如读和处理表单数据之类的操作组成。每一个表单都和该 Struts ActionForm 子类的一个实例关联在一起。请创建这个继承 ActionForm 的表单类。SubmitForm 是 ActionForm 的一个子类,它是用域的 getter 和 setter 方法创建的。getter 和 setter 方法在 ActionForm 子类中都是必须有的。
SubmitForm 怎样发挥作用? 每一个 Struts Action 类都必须和一个 Struts ActionForm 类关联在一起。您可以在 WebSphere Studio 中的 struts-config.xml 编辑器的 FormBean 页面中定义 SubmitForm 类。然后可以把它与 struts-config.xml 文件中的 SubmitAction 映射关联在一起。一个请求提交后,ActionServlet 把从 Web 浏览器上的实际表单中得到的数据自动植入 SubmitForm。在 SubmitAction 类中,用 SubmitForm f = (SubmitForm) form 来访问表单数据。
第 2 步:用 Struts taglib 构建一个 JSP 表单 Struts 为输入域提供了许多 HTML 标记并为 JSP 表单提供了许多超链接。下面列出了常用的几个:
·复选框 - <html:checkbox property="name"/> ·隐藏域 - <html:hidden property="name"/> ·密码输入域 - <html:password property="name"/> ·单选按钮 - <html:radio property="name"/> ·重设按钮 - <html:reset/> ·选项(下拉框) <html:select property="name"/> <html:option value="a"/>choice1</html:option> </html:select> ·提交按钮 - <html:submit/> ·文本输入域 - <html:text property="name"/> ·文本区输入域 - <html:textarea property="name"/> |
大多数 HTML 标记都支持 Javascript 事件,如 onmouseclick、onmouseover 等事件。关于更多信息,请参阅 HTML Bean API。下面我们来为这个示例创建一张 JSP 页面。在 Web Perspective 中,用 Struts 模型创建一张 JSP 页面:
1.展开 StrutsSampleWeb 项目直到看到 /Web Content 文件夹。右键单击 /Web Content。
2.选择 New => JSP File。
3.在 Name 中输入 submitpage.jsp。
4.从下拉框中选择 Struts JSP 作为 Model。
5.单击 Next,注意只添加了 HTML 和 Bean 的 taglib。如果您想使用其他标记库中的 taglib,如 Logic taglib,请选择 Add Tag Libraries,然后选择 /WEB-INF/struts-logic.tld。
6.单击 Finish。
图 4.JSP 创建向导 - Struts 标记库
用源代码编辑器中的下面这些代码修改 submitpage.jsp 页并保存:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <html:html locale="true"> <HEAD> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <META name="GENERATOR" content="IBM WebSphere Studio"> <META http-equiv="Content-Style-Type" content="text/css"> <LINK href="theme/Master.css" rel="stylesheet" type="text/css"> <TITLE>Pizza Order Page</TITLE> </HEAD> <BODY> <P><h1>Pizza Order Page </h1></P> <html:form action="/submit.do"> Name: <html:text property="customer.name"/><br> Address: <html:text property="customer.address"/><br> Size: <html:radio property ="size" value="S"/>Small <html:radio property ="size" value="M"/>Medium <html:radio property ="size" value="L"/>Large Toppings: <br> Pepperoni<html:checkbox property="topping(Pepperoni)"/><br> Onion<html:checkbox property="topping(Onion)"/><br> Mushroom<html:checkbox property="topping(Mushroom)"/><br> Hot Pepper<html:checkbox property="topping(Hot Pepper)"/><br> Bacon<html:checkbox property="topping(Bacon)"/><br> <html:select property ="type"> <html:option value="a">Delivery</html:option> <html:option value="b">Pickup</html:option> </html:select> <html:submit/> <html:reset/> </html:form> </BODY> </html:html> |
忽略任务列表中关于 submit.do 不存在的警告消息。为 Struts Action 类创建一张 /confirm.jsp 页面用来进行转发。
在 Web Perspective 中,创建 confirm.jsp 页面:
1.右键单击 /Web Content。
2.选择 New => JSP File。
3.在 Name 域中输入 confirm.jsp。
4.单击 Finish。
用下面的代码修改 JSP 文件:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <html:html> <HEAD> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <META name="GENERATOR" content="IBM WebSphere Studio"> <META http-equiv="Content-Style-Type" content="text/css"> <LINK href="theme/Master.css" rel="stylesheet" type="text/css"> <TITLE></TITLE> </HEAD> <BODY> <P>Thank you <%=request.getAttribute("name")%></P> </BODY> </html:html> |
在 submitpage.jsp 中,customer.name 属性引用对象内的一个域。topping(Pepperoni) 属性是 java.util.HashMap 的一个键/值对。Struts 1.1(beta 2)HTML taglib 支持嵌套的属性。