Struts 的工作流程

来源:互联网 发布:vue.js 视频教程 编辑:程序博客网 时间:2024/05/20 03:41
ActionServlet是一个FrontController,它是一个标准的Servlet,它将request转发给RequestProcessor来处理,

  ActionMapping是ActionConfig的子类,实质上是对struts-config.xml的一个映射,从中可以取得所有的配置信息

  RequestProcessor根据提交过来的url,如*.do,从ActionMapping 中得到相应的ActionForn和Action。然后将request的参数对应到ActionForm中,进行form验证。如果验证通过则调用Action的execute()方法来执行Action,最终返回ActionFoward。

  ActionFoward是对mapping中一个foward的包装,对应于一个url

  ActionForm使用了ViewHelper模式,是对HTML中form的一个封装。其中包含有validate方法,用于验证form数据的有效性。ActionForm是一个符合JavaBean规范的类,所有的属性都应满足get和set对应。对于一些复杂的系统,还可以采用DynaActionForm来构造动态的Form,即通过预制参数来生成Form。这样可以更灵活的扩展程序。

  ActionErrors是对错误信息的包装,一旦在执行action或者form.validate中出现异常,即可产生一个ActionError并最终加入到ActionErrors。在Form验证的过程中,如果有Error发生,则会将页面重新导向至输入页,并提示错误。

  Action是用于执行业务逻辑的RequsestHandler。每个Action都只建立一个instance。Action不是线程安全的,所以不应该在Action中访问特定资源。一般来说,应改使用 Business Delegate 模式来对Business tier进行访问以解除耦合。

  Struts提供了多种Action供选择使用。普通的Action只能通过调用execute执行一项任务,而DispatchAction可以根据配置参数执行,而不是仅进入execute()函数,这样可以执行多种任务。如insert,update等。LookupDispatchAction可以根据提交表单按钮的名称来执行函数。
--------------------------------------------------------------------------------------------------------------------
Struts的工作流程

  对于采用Struts框架的Web应用,在Web应用启动时就会加载兵初始化ActionServlet,ActionServlet从struts- config.xml文件中读取配置信息,把它们存放到各种配置对象中,例如Action的映射信息存放在ActionMapping对象中。

  当ActionServlet接受到一个客户请求时,将执行如下流程。

流程:

 (1)减缩和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。
 (2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。
 (3)根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。
 (4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。
 (5)ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。
 (6)Action的execute()方法返回一个ActionForward对象,ActinoServlet再把客户请求转发给ActionForward对象只想的JSP组件。
 (7)ActionForward对象指向的JSP组件生成动态网页,返回给客户。

  对于以上流程的流程(4),如果ActionForm的validate()方法返回一个或多个ActionMessage的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含用户提交表单的JSP组件。再这种情况下,不会再创建Action对象并调用Action的execute()方法。

StrutsMVC / Model 2 的實現方式中,擔任Controller角色的是org.apache.struts.action.ActionServlet,它繼承自 javax.servlet.http.HttpServlet,通常會直接使用ActionServlet,在web.xml中配置相關的組態,就如同配置一般的Servlet一樣,您也可以配置一些相關的初始參數給ActionServlet使用。

在MVC/Model 2的架構中,理想上客戶端不會直接要求資源或指定請求的JSP頁面,所有客戶的請求都必須發送至Controller,由Controller決定該轉發給哪一個物件進行處理、決定該由哪一個View頁面進行顯示與回應。

(為了避免客戶直接要求JSP頁面或相關資源,您可以將JSP頁面或相關資源放到Web應用程式的/WEB-INF目錄下,讓客戶端只能透過 Controller的forward要求資源)

在Struts中,擔任Controller的是ActionServlet,所有的請求都發送給ActionServlet,對於 ActionServlet來說, doGet()會調用doPost(),所以無論請求是GET或POST在行為上都是相同的。ActionServlet藉由組態檔struts- config.xml知道如何分配物件來處理請求,這包括了org.apache.struts.action.ActionMapping、 org.apache.struts.action.ActionForm、org.apache.struts.action.Action等物件的分配,struts-config.xml是整個Struts運作的重心。

ActionServlet會將處理的控制權暫時交給Action物件,在Action中,您可以藉由一些資料傳輸物件(Data Transfer Object)、輔助類別(Helper Class)等Model來完成業務請求,Struts使用JSP/Servlet的setAttribute()和 getAttribute()方法來與View進行溝通。Action應當傳回ActionForward物件給ActionServlet,之後 ActionServlet根據 ActionForward中的資訊來進行forward或include View的動作,由View抽取Model資料並顯示處理的結果。

Struts的View部份可以是靜態網頁、JSP網頁、Struts自訂標籤,Struts自訂標籤可以與Struts的一些物件及資源檔案合作使用,也配合使用其它自訂標籤,像是JSTL、JSF等。

Struts 1.1後新增org.apache.struts.action.RequestProcessor類別,有關於使用者請求的物件分配等動作已經大部份交由RequestProcessor來處理,下圖是ActionServlet接收到請求之後的一些主要動作,在之後的各主題說明中,您可以藉由這張圖您將可以瞭解struts-config.xml的組態設定意義,以及Struts運作的方式:

Struts 工作流程
<script type="text/javascript"><!--google_ad_client = "pub-9750319131714390";google_ad_width = 160;google_ad_height = 600;google_ad_format = "160x600_as";google_ad_type = "text_image";google_ad_channel = "";//--> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> <iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-9750319131714390&amp;dt=1201965301968&amp;lmt=1177080419&amp;format=160x600_as&amp;output=html&amp;correlator=1201965301953&amp;url=http%3A%2F%2Fcaterpillar.onlyfun.net%2FGossip%2FStruts%2FWorkFlow.htm&amp;ad_type=text_image&amp;cc=359&amp;ga_vid=583781786.1201965302&amp;ga_sid=1201965302&amp;ga_hid=887876374&amp;flash=9&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=16&amp;u_tz=480&amp;u_java=true" frameborder="0" width="160" scrolling="no" height="600" allowtransparency="allowtransparency"></iframe>

<script type="text/javascript"><!--google_ad_client = "pub-9750319131714390";google_ad_width = 160;google_ad_height = 600;google_ad_format = "160x600_as";google_ad_type = "text_image";google_ad_channel = "";//--> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> <iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-9750319131714390&amp;dt=1201965302015&amp;lmt=1177080419&amp;prev_fmts=160x600_as&amp;format=160x600_as&amp;output=html&amp;correlator=1201965301953&amp;url=http%3A%2F%2Fcaterpillar.onlyfun.net%2FGossip%2FStruts%2FWorkFlow.htm&amp;ad_type=text_image&amp;cc=359&amp;ga_vid=583781786.1201965302&amp;ga_sid=1201965302&amp;ga_hid=887876374&amp;flash=9&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=16&amp;u_tz=480&amp;u_java=true" frameborder="0" width="160" scrolling="no" height="600" allowtransparency="allowtransparency"></iframe>

来源:http://www.yesky.com/SoftChannel/72342371961929728/20031210/1752290.shtml
 
原创粉丝点击