Struts学习随笔(3)

对于一个框架,它至少应该具备以下三个部分:

####外部配置文件
提供开发人员不想嵌入源代码中的实现细节。

####中心控制器
提供一种方式,将HTTP 请求排入一个易于管理的队列。这种设计有时叫前端控制器
模式(Front Controller [Go3])

####外部表现系统
让不同的人同时工作在同一应用的不同部分。如, Java 工程师可以工作在和中心控制
器相关的类,而页面设计者则专注于JSP。除了JSP,其他表现系统,如Velocity Templates或者 XSLT, 都可以和Struts 一起使用。

####框架有时分为两极标有白盒和黑盒的统一体
白盒框架严重依赖于面向对象的语言的特征,如继承和动态绑定。黑盒框架则注重定义可插入组件的接口,然后基于这些接口提供基本的起始组件。接口和基本组件通常提供热点(hotspot)方法,这个方法可以直接使用或者重写后提供特别的行为。

Design Patterns 中的MVC 例子称为通知/订阅者(notify/subscribe)协议和观察者(Observer)模式的使用。

结合使用 JSP和 servlet 开始被称为Model 2 (单独使用JSP 称为Model 1)

层模式在一个复杂应用中,这可以在添加组件时,防止依赖关系呈指数增长。在设计远程应用时,分层是一个核心模式。

分层的web 应用使用一种比传统MVC 模式更加“扁平”的模式。控制器被夹在表现层(View) 和应用逻辑 (Model)之间。
每个组件的主要职责并没有改变。流程有轻微改变,即查询状态和改变通知都必须通过控制器。另一个改变是,当视图,或者表现层需要渲染动态页面时,它使用从控制器传递的数据而不是直接来自于模型层。这种改变去除了View 和 Model 的耦合,允许控制器选择数据和显示这些数据的视图。

Struts 通过提供一个控制器Servlet 实现了Sun 的 Model 2 架构,这个控制器可以用来管
理JSP 页面和其他表现设备之间的流程。Struts 通过使用ActionForward和ActionMapping
来保证表现层之外的控制流决策来实现 MVC/层 模式。JSP 可以引用一个逻辑目标。控制器组件在运行时提供准确的URI。
类 描述
ActionForward 用户指向或者视图选择
ActionForm 状态改变的数据
ActionMapping 状态改变事件
ActionServlet 控制器,接受用户请求和状态改变,以及发出视图选择
Action 控制器的一部分,与模型交互,执行状态改变或状态查询,以及告诉ActionServlet 下一个选择的视图

ApplicationResources.properties 存储本地化信息和标签,以使应用可以国际化
struts-config.xml 存储控制器对象的缺省配置,包括模型支持的用户指向,状态改变,状态查询

标记库描述符 目的
struts-html.tld 扩展HTML Form的JSP标记
struts-bean.tld 扩展处理JavaBean的JSP标记
struts-logic.tld 扩展测试属性值的JSP标记

IMPORTANT

实践中,控制器与视图的交互通过请求,会话以及Servlet 平台提供的应用上下文进行。
控制器和模型的交互通过文件和数据存储系统完成 (比如装入XML 文档或者属性文件),或者通过其他服务,如TCP, 创建一个到JDBC 数据库的连接。

<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

当ActionServlet 收到一个请求, 它通过一系列的流程处理locale, mapping, form bean, 最
后是Action 来运行这个请求
当ActionServlet 收到一个请求, 它通过一系列的流程处理locale, mapping, form bean, 最
后是Action 来运行这个请求。这里某些步骤只在Struts 1.1 应用才有:
􀂄 处理多部分请求. 如果请求是个多部分(multipart)请求 (比如,一个表单加上一个MIME
附件), Servlet 用一个特殊的句柄包装这个请求,避免处理错误。
􀂄 处理路径 ActionServlet 首先检查这个请求路径是否是一个应用模块。如果是,相应模
块的配置被选中。[Struts 1.1]
􀂄 处理场所.(local) 默认下,ActionServlet 会检查是否有一个标准的locale 对象在用户会
话的上下文当中。如果没有, ActionServlet将放入一个。这个对象将为每个用户提供
本地化表现。
􀂄 处理内容和缓存 默认的MIME 类型和可选的请求头将加在响应之上。
􀂄 处理映射( Mapping) ActionServlet检查ActionMapping,是否有注册的路径符合正处
理的请求。如果没找到,ActionServlet 转发到默认(或 “unknown”) Action(如果设定有
默认或未知Action),否则,产生一个 “bad request” 错。如果找到相关映射,将被放入
请求之中,供后面引用。
􀂄 处理角色. ActionServlet 检查是否用户被授权可以访问action. [Struts 1.1]。
􀂄 处理ActionForm. ActionServlet 检查是否mapping 中指定了一个ActionForm.。如果是,
servlet 检查是否已经有一个存在于特定的范围之内(默认是会话)。如果不存在,
ActionServlet 创建一个。
􀂄 处理组装. ActionForm的 reset 方法被调用,然后通过反射机制被自动组装。匹配
ActionForm属性的参数将被使用。其他参数和属性被忽略。
􀂄 处理验证 ActionForm的 validate 方法被调用。如果方法返回false, 控制传递给
ActionMapping的input 属性标明的路径, Action 未被处理。
􀂄 处理转发和包含 如果ActionMapping 标明forward 或include 属性,控制被传递给其
他资源。否则ActionServlet 将请求委托给一个Action 对象。
􀂄 处理 Action. 如果mapping 标明一个Action 类型, ActionServlet检查是否已经有一个被
实例化了。如果没发现, Action 对象将被实例化。每个类只能有一个Action 对象
(Singleton 模式),它通过多线程处理所有对它的请求。Servlet调用 Action的 perform
或 execute 方法,传递请求, 响应, mapping, 以及form bean。
Action 执行要求的行为,可以包括:
􀂄 访问数据系统,比如JDBC 数据库
􀂄 在请求中创建被视图使用的对象
􀂄 如果需要,在会话中创建对象
􀂄 根据需要更新会话对象,比如用户的场所
􀂄 执行需要的业务功能
􀂄 处理以外和其他错误条件
􀂄 发送一个直接发送一个响应,或者返回一个ActionForward 给servlet
这里某些行为,象访问数据库,通常由Action 调用的业务对象来处理( Business Delegate
模式)。 Action 处理一些web 特定的任务,可以放在业务对象中的代码都应该放入业务对
象。Action 是一个控制器类,不应该用来处理业务的核心逻辑。

通常, 动态数据在JavaBean 中传递到请求上下文中的页面。这就是熟知的视图助手(View
Helper )模式
ps: struts in action 真是通俗易懂啊….