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可以根据提交表单按钮的名称来执行函数。
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()方法。
对于采用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()方法。
在 Struts 對 MVC / 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運作的方式: |