明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

對struts一些理解總結(jié)

[摘要]Struts controller基本功能是1. 截獲用戶的Http請求2. 把這個(gè)請求映射到一個(gè)定義好的業(yè)務(wù)操作上3. 獲取業(yè)務(wù)操作結(jié)果,提供給客戶端4. 決定下一步應(yīng)該顯示哪一個(gè)頁面有幾個(gè)部分共同組成了Struts 的Controller,用戶的請求發(fā)送到ActionServlet中,Acti...
Struts controller基本功能是
1. 截獲用戶的Http請求
2. 把這個(gè)請求映射到一個(gè)定義好的業(yè)務(wù)操作上
3. 獲取業(yè)務(wù)操作結(jié)果,提供給客戶端
4. 決定下一步應(yīng)該顯示哪一個(gè)頁面

有幾個(gè)部分共同組成了Struts 的Controller,用戶的請求發(fā)送到ActionServlet中,ActionServlet調(diào)用RequestProssor開始處理用戶請求的流程,在這個(gè)流程中,會查找ApplicationConfig,得到用戶請求對應(yīng)的Action,調(diào)用相應(yīng)的Action來具體執(zhí)行用戶的請求,最后返回ActionForward,轉(zhuǎn)向相應(yīng)的流程。
================
org.apache.struts.action.ActionServlet 是Struts Controller中最主要的部分,所有用戶請求都會被發(fā)送到這里,所有的其它處理也必須從這里經(jīng)過。ActionServlet是從HttpServlet中繼承過來的。
當(dāng)ActionServlet接收到HTTP request的時(shí)候,不管是doGet()或者doPost()方法,都會調(diào)用process()方法。

protected void process(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException { RequestUtils.selectApplication( request, getServletContext() ); getApplicationConfig(request).getProcessor().process( request, response );}

一般情況下,我們不需要自己實(shí)現(xiàn)或者修改ActionServlet類,僅僅使用就可以了。某些情況下,我們可以自己擴(kuò)展ActionServlet類,從ActionServlet繼承,實(shí)現(xiàn)自己的MyActionServlet類。覆蓋其中的一些方法來達(dá)到你的特殊處理的需要。ActionServlet繼承自javax.servlet.http.HttpServlet,所以在本質(zhì)上它和一個(gè)普通的servlet沒有區(qū)別,你完全可以把它當(dāng)做一個(gè)servlet來看待,只是在其中完成的功能不同罷了。
================

RequestProssor具體處理用戶的request,作為一個(gè)request handler存在。同樣,處理request的時(shí)候,會執(zhí)行RequestProcessor類中的process(execute)方法。

process中調(diào)用的方法都是可以重載的, 如果有需要,可以實(shí)現(xiàn)為自己特定的方法。比如,對于Locale問題,通常都是在系統(tǒng)最一開始加載的時(shí)候讀取的,如果用戶想在任何時(shí)刻都可以切換或者選擇自己的Locale,我們就可以重載processLocale()方法。然后只需要在配置文件中加入段就可以了

================
Action類是實(shí)現(xiàn)整個(gè)體系的核心部分,它在客戶請求、界面表示和業(yè)務(wù)邏輯之間起到一個(gè)橋梁的作用。每一個(gè)Action都用來處理某一項(xiàng)任務(wù),或者進(jìn)行一個(gè)業(yè)務(wù)操作。當(dāng)然了,我們說一項(xiàng)任務(wù)不是說Action只實(shí)現(xiàn)一個(gè)業(yè)務(wù)操作方法,而是集中實(shí)現(xiàn)某一個(gè)功能單元。比如登錄用的LogonAction、查找用的SearchAction等等。Action是在RequestProcessor中,由processActionPerform方法調(diào)用的

非常重要的一點(diǎn):不要在Action中包含任何業(yè)務(wù)邏輯操作,而是應(yīng)該調(diào)用一個(gè)Model層的JavaBean來實(shí)現(xiàn)你的業(yè)務(wù)邏輯操作。在某些情況下,可能包含少許表現(xiàn)邏輯。這樣,就可以充分進(jìn)行代碼重用,比如上例中調(diào)用的IStorefrontService接口,這個(gè)接口在實(shí)現(xiàn)時(shí)完全可以不用考慮客戶端的事情,所以它可以被其它部分或者其它系統(tǒng)所使用。否則的話,Action會變得非常難于理解,難于維護(hù),代碼也不能重用。

struts-example工程的設(shè)計(jì)就是一個(gè)bug,它把業(yè)務(wù)邏輯封裝到了Action類中
===================

在Action的execute方法中,返回一個(gè)ActionForward類。ActionForward把配置文件中forward部分的信息包裝起來,減少了應(yīng)用程序和物理資源信息之間的耦合性。通過ActionMapping類,可以在配置文件中查找相應(yīng)的forward信息。例如,對于一個(gè)LoginAction,它的配置信息可能是這樣的:


返回的ActionForward就會包含段中的信息。在ActionMapping類的findForward方法中,首先會根據(jù)查找forward的name查找是否有相應(yīng)的forward段,如果沒有,則在配置文件中的段中進(jìn)行查找,如果還沒有就會拋出一個(gè)例外。

=====================

以前,頁面上的輸入數(shù)據(jù)都通過HTTP request提交,服務(wù)方檢索出輸入的數(shù)據(jù),進(jìn)行驗(yàn)證,然后將這些數(shù)據(jù)傳遞給其它組件進(jìn)行業(yè)務(wù)處理。一切基本都需要手工編寫代碼進(jìn)行操作,比較麻煩,也使代碼變得復(fù)雜。
ActionForm[org.apache.struts.action.ActionForm]用來收集用戶的輸入,并且把這些信息傳遞給Action對象,然后,在Action對象中,ActionForm中的數(shù)據(jù)被取出來傳遞給業(yè)務(wù)邏輯層進(jìn)行處理。
ActionForm一方面作為一個(gè)緩沖區(qū),臨時(shí)存儲用戶輸入的數(shù)據(jù);另一方面,可以把ActionForm當(dāng)成是HTTP和Action之間的一個(gè)防火墻,它可以驗(yàn)證輸入數(shù)據(jù)的正確性,如果驗(yàn)證不通過,這個(gè)request是不會發(fā)送給Action進(jìn)行處理的。
ActionForm可以有兩種Scope,request或者session。request就是只能在rquest到response,之后ActionForm就不可見了;session可以保存時(shí)間長一點(diǎn)。

==================

在ActionForm的Validate方法中返回的是ActionErrors對象。這個(gè)對象可以將錯(cuò)誤信息都封裝起來,并且自動(dòng)把它們顯示給用戶。
在相應(yīng)JSP頁面上添加,可以自動(dòng)將ActionErrors中的錯(cuò)誤信息顯示出來。包括,每一個(gè)具體的,通過add添加的錯(cuò)誤信息,和一個(gè)ErrorHeader和一個(gè)ErrorFooter,這些都可以通過配置文件指定,并且可以包含HTML語法。

==========================

Struts提供了四種自定義Tag庫:
bean:struts-bean taglib包含在訪問bean和bean屬性時(shí)使用的tag,也包含一些消息顯示的tag。
html:struts-html taglib包含用來創(chuàng)建struts輸入表單的tag,和其它通常用來創(chuàng)建基于HTML用戶界面的tag。
logic:struts-logic taglib包含的tag用來管理根據(jù)條件生成輸出文本,和其它一些用來控制的信息。
template:struts-template taglib包含的tag用來定義模板機(jī)制。