随笔-71  评论-4  文章-0  trackbacks-0
引言

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 支持嵌套的属性。

posted on 2005-11-21 12:19 zjw_albert 阅读(417) 评论(1)  编辑  收藏

评论:
# re: 实用Struts应用程序编写实例(一) 2005-12-04 18:40 | 宋伟
建伟,偶然发现你的blog,但太专业了,我看不懂。晕!  回复  更多评论
  

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


网站导航: