Chinaunix首页 | 论坛 | 博客
  • 博客访问: 638273
  • 博文数量: 125
  • 博客积分: 8703
  • 博客等级: 中将
  • 技术积分: 1102
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-10 17:48
文章分类

全部博文(125)

文章存档

2012年(2)

2011年(3)

2010年(11)

2009年(1)

2008年(12)

2007年(58)

2006年(38)

分类: Java

2006-11-01 14:53:24

Struts控制流



    因为web 应用是动态的,所以很难表现“一个真正固定的控制流”。取决于环境,不同的方式下有很多不同的事情发生—特别是在web 应用中。但是事情仍然有一个通用的秩序。如果你是个Struts,应用框架,甚至web 应用的新手,这些流程刚开始可能难以跟得上(理解)。亟待解决的各种问题不一定那么明显。我们将在本书中慢慢详细涉及。首先,在介绍树木之前我们先认识这片森林。你读完此书后,我们建议你再次回来,看看每一部分是如何切合进这个总图的。
    以UML以次序图的方式展示了Struts 请求-响应流程。我们来按这个请求-响应流程走一遍。
括号内的数字请参照图11中的相关地方:
  • 客户请求匹配Action URI 样式的路径(1).
  • 容器将请求传递给ActionServlet.
  • 如果这个是模块化应用,ActionServlet 选择响应的模块。
  • ActionServlet 查询路径的映射。(来自于配置文件)
  • 如果映射标明了一个form bean,ActionServlet 看是否已经有一个实例,或者创建一个新的实例 (1.1)。如果已经有一个form bean,ActionServlet 重设它,并根据HTTP 请求重新组装它。
  • 如果 mapping 的 validate 属性设置为 true, 它将调用 form bean 的validate 方法(1.2)。
  • 如果失败,Servlet 将控制转发到input 属性标明的路径,控制流终止。
  • 如果mapping 标明一个Action 类型,如果它已经存在或已经实例化,它将被重用(1.3)。
  • Action 的perform 或 execute 方法被调用,并传递一个实例化的form bean(或者 null)。
  • Action 组装form bean, 调用业务对象,以及其他需要做的事情。 (1.3.1-1.3.4)。
  • Action 返回一个ActionForward 给ActionServlet (1.3.5).
  • 如果ActionForward 指向另一个 Action URI,重新开始; 否则,显示页面或者其他资源,流程结束。通常,结果是一个JSP 页面,或者Jasper, 或其它类似技术 (非Struts)渲染的页面。 (2, 3).
  • 如果JSP 中使用了Struts HTML 标记, 并且在请求中看到正确的ActionForm(1.1),他们会从ActionForm 中组装HTML 控件。否则, 标记将创建一个。从Struts 1.1 开始, 如果form 标记自行创建一个ActionForm ,它将调用ActionForm 的Reset 方法。如果你只是想创建一个空白的表单 (1.1),你可以使用标准的ForwardAction来通过Action 传递控制,然后离开页面。

出色的细节

   前面显示了Struts 的概揽,但忽略了很多重要的细节。让我们深入到更好的地方。因为这里是HTTP, 所有东西都是从请求开始。

请求由容器接收

   Struts 框架的核心组件是 ActionServlet。象所有的servlets, 它生存在容器中, 比如Tomcat, Resin, 或者 WebLogic 等。当容器启动时,读入部署描述符 (web.xml),告诉容器要装入哪些个ervlet。一个标准的servlet 设定是 servlet mapping。 容器使用这个设定来决定哪个请求将被送到
哪个servlet:

这里,我们让容器将ActionServlet映射到那些符合/do/*样式的请求。这些请求可以是:
/do/This
/do/That
/do/something/Whatever.

许多应用喜欢使用前缀:
URL 样式也可以使用象this.do 或 that.do 或 /something/whatever.do 的样式。可以用任何有效的扩展名,但.do 是比较简单和常用的选择。

    当一个请求随着符合Servlet 上下文的路径组件提交时,容器将其转发给ActionServlet。不匹配的请求则不转发到ActionServlet。比如,匹配*.jsp 的请求将直接转发给容器的 JSP 服务,比如Jasper(如果你使用Tomcat 或者WebSphere 的话)。在应用中可以有其他的servlet来处理其他格式的请求路径。不匹配所有servlet mapping 的请求将直接送给容器默认的web server。

请求被ActionServlet接收

    当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 是一个控制器类,不应该用来处理业务的核心逻辑。

Action返回ActionForward

    Action 完成后,它返回一个ActionForward。如果 ActionForward 为null, ActionServlet假定响应产生了,但不做任何事情。否则, ActionServlet 读入 ActionForward ,重定向或者转发请求到相应的资源。如果请求是另一个Action URI, 容器将请求返回给ActionServlet。否则容器发送请求到其它servlet 或service。如果ActionForward 设为重定向(redirect), 请求被发送回客户端,并提示重新提交一个新请求到特定的地址。

由Jasper (或类似的东西) 渲染JSP页面

    ActionServlet 发送一个请求 到 JSP, 请求是被另外的服务处理, 如 Jasper。典型地, Struts和其他标签扩展用来编写页面的动态部分。有时,也使用JSP 模板,以便页面可以从其它组件进行构建。
    通常, 动态数据在JavaBean 中传递到请求上下文中的页面。这就是熟知的视图助手(ViewHelper )模式[Go3]。 标签扩展简单的调用JavaBean 的方法,并返回格式化的数据。而数据如何被放入页面中那是表现逻辑的事情。数据本身的格式通常是业务逻辑的一部分,所以委托给了bean。
   Struts 标记也可以访问框架提供的视图助手。这些包括本地化标签和提示,错误信息,以及超链接路径。另外,Struts 标记可以计算表达式,通过列表反复,以及在HTML 表单中组装控件。

其他 servlet 渲染响应

    处理完Action 后,请求可以被送到应用中的其他 servlet 或服务。其他表现系统,如Velocitytemplates, 可以通过servlet 上下文访问框架资源。

阅读(1487) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~