簡介
對於RequestProcessor這個類,有的人可能很陌生,畢竟它不象ActionSerlvet那樣,在我們的面前頻繁的出現。但是,RequestProcessor用的要遠比ActionServlet多,那么RequestProcessor到底是乾什麼的呢?當ActionServlet接收到客戶請求後,會進行一連串的初始化操作,然後,就會將客戶請求轉交給合適的處理器進行處理,這個合適的處理器就是org.apache.struts.action.RequestProcessor。
詳細分析
1.調用processMultipart()方法,如果HttpServletRequest是POST方式,且請求為multipart/form-data,Struts框架將請求對象包裝成處理multipart請求專用的請求對象,否則,只是簡單地返回原有的請求對象。一般來說,除非需要處理檔案上傳,否則不用關心multipart功能的具體細節。
2.調用processPath()方法,該方法用來從請求URL中獲套用取路徑部分。獲取到的信息在稍後的步驟中用於選擇合適的StrutsAction調用。
3.調用processLocale()方法,處理一些國際化的事務。
4.調用方法processContent(),來決定請求的contenttype編碼(encoding)方式。contenttype可以配合在配置檔案中,也可以在jsp檔案中配置,默認為text/html。
5.根據noCache屬性的設定調用processNoCache()方法,如果noCache設定為true。則添加合適的回響頭到回響對象中,使得頁面保留在瀏覽器的Cache中。這些回響頭包含Pragma,Cache-Control,和Expires。
6.調用processPreprocess()方法,這個方法在這兒設定一個鉤子,方法的默認實現只是簡單地返回true,這樣給了自定義處理器的開發者提供了一個合適的地方讓你添加自己的業務邏輯。因為這個方法在調用Action之前被調用,如果你重載這個方法,只需要返回false,則Action就不會被調用。例如,你可以重載這個方法用戶檢查客戶session,如果不通過就返回false。
7.調用processMapping()方法,根據客戶請求信息中的path信息來決定是否返回ActionMapping對象實例。如果不能夠找到path的映射,則客戶將會得到一個error回響。
8.通過調用processRoles()方法,檢查是否為Action配置了安全形色。
如果配置了角色要求,則請求對象的isUserInRole()方法被調用,如果用戶屬於這些角色,則客戶會得到顯示一個error回響。
9.調用processActionForm()方法,檢查是否存在為ActionMapping配置的ActionForm。如果存在,則在有效區域內查找是否存在該ActionForm的實例,存在,則復用,不存在,則創建一個實例。然後將實例保存與再配置檔案中配置好的有效區域(request,session,application)內,並用Action元素的name屬性作為該實例的關鍵字。
10.調用processPopulate()方法,如果存在為ActionMapping配置的ActionForm,則封裝請求對象中的數據到ActionForm中,在進行封裝之前,先調用ActionForm的reset()方法進行屬性值的默認化。
11.調用processValidate()方法,如果ActionForm被配置好,並且action元素的屬性validate被設定為true,則進一步調用validate()方法進行規則校驗。如果validate()方法校驗失敗,就會保存一個ActionErrors對象到請求區域中,請求將會自動重定向到action映射的input屬性所指定的頁面中。如果校驗通過或在action映射中沒有配置ActionForm,則繼續處理請求。
12.根據action映射是否配置了forward屬性或include屬性來決定下一步操作。如果配置了任意一個,則相應地調用RequestDispatcher對象的forward()方法或include()方法,調用後,對客戶請求的處理結束。否則,繼續處理請求。
13.調用processActionCreate()方法,創建或獲取一個Action對象實例處理請求。processActionCreate()方法會在快取中查找是否存在已經創建好的Action實例,如果存在,則復用,否則,則重新創建並將其村於快取中。
14.調用processActionPerform()方法,該方法用於在一個try/catch代碼塊中調用action實例的execute()方法,這樣確保action的execute()方法一旦發生執行異常能夠被RequestProcessor捕獲。
15.調用processActionForward()方法,並傳入action的execute()方法所返回的ActionForward對象實例,方法通過檢查ActionForward對象實例,決定採用redirect或forword方式進行重定向。究竟採用redirect還是
forword取決於forward元素的redirect屬性值。
在實際的套用開發中,如果我們想對Struts在初始化的時候進行一些擴展,我們可以重新寫ActionServlet的子類,或RequestProcessor的子類,但是不建議去寫ActionServlet的子類,在RequestProcessor中為我們提供了processPreprocess()這個鉤子方法,這樣,我們可以去重寫這個方法,來進行擴展。雖然RequestProcessor在表面上不是很常用到,但是他給人的感覺卻恰恰相反,這個類用來處理我們每一次的請求,所以,更好的了解RequestProcessor類對我們來說很重要。
擴展RequestProcessor
1).繼承RequestProcessor,實現自定義的processXXXXX()處理方法。例如xxxRequestProcessor
2).在struts-config.xml檔案中配置xxxRequestProcessor。用戶重寫了RequestProcessor,但Struts並不知道,必須配置才可以。下面是配置本示例:
Java代碼 :
<controller>
<set-propertyproperty="processorClass"value="packagename.xxxRequestProcessor"/>
<set-propertyproperty="contentType"value="text/html;charset=utf-8"/>
<set-propertyproperty="nocache"value="true"/>
</controller>
構造方法詳細信息
RequestProcessor
publicRequestProcessor()
方法詳細信息
processRoles
protectedbooleanprocessRoles(javax.servlet.http.HttpServletRequestrequest,
javax.servlet.http.HttpServletResponseresponse,
org.apache.struts.action.ActionMappingmapping)
throwsjava.io.IOException,javax.servlet.ServletException
覆蓋:
類org.apache.struts.action.RequestProcessor中的processRoles
拋出:
java.io.IOException
javax.servlet.ServletException
從父類繼承的方法
從父類org.apache.struts.action.RequestProcessor繼承的方法:
destroy,doForward,doInclude,getInternal,getServletContext,init,internalModuleRelativeForward,internalModuleRelativeInclude,process,processActionCreate,processActionForm,processActionPerform,processCachedMessages,processContent,processException,processForward,processForwardConfig,processInclude,processLocale,processMapping,processMultipart,processNoCache,processPath,processPopulate,processPreprocess,processValidate