struts读书笔记二 (9.28)
struts读书笔记二 (9.28)一、struts体系结构 此图表现了struts在MVC模式中的结构,框架中三个部分:模型,视窗和控制器。模型(Model)在struts框架中,模型分为两个部分:l 系统的内部状态l 可以改变状态的操作(事务逻辑) 内部状态通常由一组ActinForm JavaBean表示。根据设计或应用程序复杂度的不同,这些Bean可以是自
struts读书笔记二 (9.28)
一、struts体系结构
此图表现了struts在MVC模式中的结构,框架中三个部分:模型,视窗和控制器。
模型(Model)
在struts框架中,模型分为两个部分:
l 系统的内部状态
l 可以改变状态的操作(事务逻辑)
内部状态通常由一组ActinForm JavaBean表示。根据设计或应用程序复杂度的不同,这些Bean可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。
大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的bean调用。比如购物车bean,它拥有用户购买商品的信息,可能还有checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。
小型程序中,操作可能会被内嵌在Action类,它是struts框架中控制器角色的一部分。当逻辑简单时这个方法很适合。
视窗(View)
由JSP建立,struts包含扩展自定义标签库,可以简化创建完全国际化用户界面的过程。
控制器(Controller)
struts中,基本的控制器组件是ActionServlet类中的实例servelt,实际使用的servlet在配置文件中由一组映射(由ActionMapping类进行描述,此映射在struts-config.xml中)进行定义。
Struts,MVC 2 的一种实现
Struts 是一组相互协作的类、servlet 和 JSP 标记,它们组成一个可重用的 MVC 2 设计。这个定义表示 Struts 是一个框架,而不是一个库,但 Struts 也包含了丰富的标记库和独立于该框架工作的实用程序类。图 5 显示了 Struts 的一个概览。
图 5. Struts 概览
Struts 概览
- Client browser(客户浏览器)
来自客户浏览器的每个 HTTP 请求创建一个事件。Web 容器将用一个 HTTP 响应作出响应。 - Controller(控制器)
控制器接收来自浏览器的请求,并决定将这个请求发往何处。就 Struts 而言,控制器是以 servlet 实现的一个命令设计模式。struts-config.xml 文件配置控制器。 - 业务逻辑
业务逻辑更新模型的状态,并帮助控制应用程序的流程。就 Struts 而言,这是通过作为实际业务逻辑“瘦”包装的 Action 类完成的。 - Model(模型)的状态
模型表示应用程序的状态。业务对象更新应用程序的状态。ActionForm bean 在会话级或请求级表示模型的状态,而不是在持久级。JSP 文件使用 JSP 标记读取来自 ActionForm bean 的信息。 - View(视图)
视图就是一个 JSP 文件。其中没有流程逻辑,没有业务逻辑,也没有模型信息 -- 只有标记。标记是使 Struts 有别于其他框架(如 Velocity)的因素之一。
二、struts框架中的组件介绍
ActionServlet |
控制器 |
ActionClass |
包含事务逻辑 |
ActionForm |
显示模块数据 |
ActionMapping |
帮助控制器将请求映射到操作 |
ActionForward |
用来指示操作转移的对象 |
ActionError |
用来存储和回收错误 |
Struts标记库 |
可以减轻开发显示层次的工作 |
ActionServlet 类(控制器)
Struts 的控制器是将事件(事件通常是 HTTP post)映射到类的一个 servlet。控制器使用配置文件以使您不必对这些值进行硬编码。ActionServlet 是该 MVC 实现的 Command 部分,它是这一框架的核心。ActionServlet (Command) 创建并使用 Action、ActionForm 和 ActionForward。struts-config.xml 文件配置该 Command。在创建 Web 项目时,您将扩展 Action 和 ActionForm 来解决特定的问题。文件 struts-config.xml 指示 ActionServlet 如何使用这些扩展的类。这种方法有几个优点:
- 应用程序的整个逻辑流程都存储在一个分层的文本文件中。这使得人们更容易查看和理解它,尤其是对于大型应用程序而言。
- 网页设计人员不必费力地阅读 Java 代码来理解应用程序的流程。
- Java 开发人员也不必在更改流程以后重新编译代码。
可以通过扩展 ActionServlet 来添加 Command 功能。
ActionForm 类
ActionForm 维护 Web 应用程序的会话状态。ActionForm 是一个抽象类,必须为每个输入表单模型创建该类的子类。当我说输入表单模型时,是指 ActionForm 表示的是由 HTML 表单设置或更新的一般意义上的数据。例如,您可能有一个由 HTML 表单设置的 UserActionForm。Struts 框架将执行以下操作:
- 检查 UserActionForm 是否存在;如果不存在,它将创建该类的一个实例。
- Struts 将使用 HttpServletRequest 中相应的域设置 UserActionForm 的状态。没有太多讨厌的 request.getParameter() 调用。例如,Struts 框架将从请求流中提取 fname,并调用 UserActionForm.setFname()。
- Struts 框架在将 UserActionForm 传递给业务包装 UserAction 之前将更新它的状态。
- 在将它传递给 Action 类之前,Struts 还会对 UserActionForm 调用 validation() 方法进行表单状态验证。注:这并不总是明智之举。别的网页或业务可能使用 UserActionForm,在这些地方,验证可能有所不同。在 UserAction 类中进行状态验证可能更好。
- 可在会话级维护 UserActionForm。
注:
- struts-config.xml 文件控制 HTML 表单请求与 ActionForm 之间的映射关系。
- 可将多个请求映射到 UserActionForm。
- UserActionForm 可跨多页进行映射,以执行诸如向导之类的操作。
Action 类
Action 类是业务逻辑的一个包装。Action 类的用途是将 HttpServletRequest 转换为业务逻辑。要使用 Action,请创建它的子类并覆盖 process() 方法。
ActionServlet (Command) 使用 perform() 方法将参数化的类传递给 ActionForm。当事件进展到这一步时,输入表单数据(或 HTML 表单数据)已被从请求流中提取出来并转移到 ActionForm 类中。
注:扩展 Action 类时请注意简洁。Action 类应该控制应用程序的流程,而不应该控制应用程序的逻辑。通过将业务逻辑放在单独的包或 EJB 中,我们就可以提供更大的灵活性和可重用性。
考虑 Action 类的另一种方式是 Adapter 设计模式。Action 的用途是“将类的接口转换为客户机所需的另一个接口。Adapter 使类能够协同工作,如果没有 Adapter,则这些类会因为不兼容的接口而无法协同工作。”(摘自 Gof 所著的 Design Patterns - Elements of Reusable OO Software)。本例中的客户机是 ActionServlet,它对我们的具体业务类接口一无所知。因此,Struts 提供了它能够理解的一个业务接口,即 Action。通过扩展 Action,我们使得我们的业务接口与 Struts 业务接口保持兼容。(一个有趣的发现是, Action 是类而不是接口)。Action 开始为一个接口,后来却变成了一个类。真是金无足赤。)???
Error 类
UML 图(图 6)还包括 ActionError 和 ActionErrors。ActionError 封装了单个错误消息。ActionErrors 是 ActionError 类的容器,View 可以使用标记访问这些类。ActionError 是 Struts 保持错误列表的方式。
图 7. Command (ActionServlet) 与 Model (Action) 之间的关系的 UML 图
ActionMapping
类
输入事件通常是在 HTTP 请求表单中发生的,servlet 容器将 HTTP 请求转换为 HttpServletRequest
。控制器查看输入事件并将请求分派给某个 Action
类。struts-config.xml
确定 Controller 调用哪个 Action
类。struts-config.xml
配置信息被转换为一组 ActionMapping
,而后者又被放入 ActionMappings
容器中。(以 s 结尾的类就是容器)
ActionMapping
包含有关特定事件如何映射到特定 Action
的信息。ActionServlet
(Command) 通过 perform()
方法将 ActionMapping
传递给 Action
类。这样就使 Action
可访问用于控制流程的信息。
ActionMappings
ActionMappings
是 ActionMapping
对象的一个集合。
三、struts结构工作过程
模块:在Struts 1.0中,我们只能在web.xml中为ActionServlet指定一个配置文件,在实际的应用开发过程中,可能会有些麻烦。因为许多开发人员都可能同时需要修改配置文件,但是配置文件只能同时被一个人修改,这样肯定会造成一定程度上的资源争夺,势必会影响开发效率和引起开发人员的抱怨。
在Struts 1.1中,为了解决这个并行开发的问题,提出了两种解决方案:
- 多个配置文件的支持
- 模块的支持
支持多个配置文件,是指你能够为ActionServlet同时指定多个xml配置文件,文件之间以逗号分隔,比如Struts提供的MailReader演示例子中就采用该种方法。
<!-- Action Servlet Configuration --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml, /WEB-INF/struts-config-registration.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
|
这种方法可以很好地解决修改冲突的问题,不同的开发人员可以在不同的配置文件中设置自己的Action、ActionForm等等。但是,这里还是存在一个潜在的问题,就是可能不同的配置文件之间会产生冲突,因为在ActionServlet初始化的时候这几个文件最终还是需要合并到一起的。比如,在struts-config.xml中配置了一个名为success的<forward>,而在struts-config-registration.xml中也配置了一个同样的<forward>,那么执行起来就会产生冲突。
为了彻底解决这种冲突,Struts 1.1中引进了模块(Module)的概念。一个模块就是一个独立的子系统,你可以在其中进行任意所需的配置,同时又不必担心和其它的配置文件产生冲突。因为前面我们讲过,ActionServlet是将不同的模块信息保存在不同的ModuleConfig对象中的。要使用模块的功能,需要进行以下的准备工作:
1、为每个模块准备一个配置文件
2、配置web.xml文件,通知控制器
决定采用多个模块以后,你需要将这些信息告诉控制器,这需要在web.xml文件进行配置。下面是一个典型的多模块配置:
<init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>config/customer</param-name> <param-value>/WEB-INF/struts-config-customer.xml</param-value> </init-param> <init-param> <param-name>config/order</param-name> <param-value>/WEB-INF/struts-config-order.xml</param-value> </init-param>
|
要配置多个模块,你需要在原有的一个<init-param>(在Struts 1.1中将其对应的模块称为缺省模块)的基础之上,增加模块对应的<init-param>。其中<param-name>表示为config/XXX的形式,其中XXX为对应的模块名,<param-value>中还是指定模块对应的配置文件。上面这个例子说明该应用有三个模块,分别是缺省模块、customer和order,它们分别对应不同的配置文件。
3、准备各个模块所需的ActionForm、Action和JSP等资源
但是要注意的是,模块的出现也同时带来了一个问题,即如何在不同模块间进行转发?有两种方法可以实现模块间的转发,一种就是在<forward>(全局或者本地)中定义,另外一种就是利用org.apache.struts.actions.SwitchAction。
更多推荐
所有评论(0)