IT Technology Topic
  该博客的主人很懒,什么都没有留下。
 
 
实用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 和定制的标记。
Action bean ActionServlet Struts 提供了一个单独的 ActionServletorg.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 项目
Struts Setting 页面中选择 Override default settings,并在下拉框中选择 1.1 (beta 2) ,如图2 所示。前面已经提到过,表单被提交时,HTML 表单数据被自动植入 Struts ActionFormStruts 1.0.1 只支持简单的 Java 类型。而 Struts 1.1beta 2)还支持 java.util.HashMap 或其他的 Collection 类型。这一点我们将在本文的后面部分讨论。

单击 Finish
您将稍后修改下面的文件:

·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 被设为 trueActionServlet 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 事件,如 onmouseclickonmouseover 等事件。关于更多信息,请参阅 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
用源代码编辑器中的下面这些代码修改 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.1beta 2HTML taglib 支持嵌套的属性。

3 步:创建一个 Struts ActionForm SubmitForm

您必须定义一个继承 Struts ActionForm 类的子类。它必须有用于所有表单域的 setter getter。前面已经提到过,提交表单后,ActionForm 类被预先植入表单数据。ActionForm 类有验证方法和重设方法(可选)分别用来验证表单输入和重新设置表单。稍后将在本文中讨论它们。

如果您的应用程序有一个跨多个 Web 页面的表单,那么就可以只用一个 ActionForm。定义一个包含所有域的属性的 ActionForm bean,不管域实际显示在哪一张页面上。同样,可以把同一个表单的各个页面提交给同一个 Action 类。使用这种设计,Web 站点设计者不必改动业务逻辑就可以重新安排域。

创建一个 Java 类,它继承 Web 项目下 /Java Source 文件夹中的org.apache.struts.action.ActionForm

1.
Web Perspective 中,右键单击 StrutsSampleWeb 项目下的 /Java Source 文件夹。
2.
选择 New => Other => Web。展开