Sung in Blog

                     一些技術(shù)文章 & 一些生活雜碎

          Struts控制器組件負(fù)責(zé)接收用戶的請(qǐng)求,更新模型.以及選擇合適的視圖組件返回給客戶端.控制器組件有助于將模型和視圖分離,有了這種分離可以在同一個(gè)模型的基礎(chǔ)上得心應(yīng)手的開(kāi)發(fā)多種模型的視圖.主要是ActionServlet框架中央控制器,RequestProcessor每個(gè)子應(yīng)用的模塊處理器,Action負(fù)責(zé)處理具體的業(yè)務(wù)的組件.Struts采用ActionServlet和RequestProcessor組件進(jìn)行集中控制,并且采用Action組件來(lái)完成具體的業(yè)務(wù)單項(xiàng)處理.控制器組件的控制機(jī)制:主要認(rèn)識(shí)是接受用戶請(qǐng)求,根據(jù)用戶的請(qǐng)求調(diào)用合適的模型來(lái)執(zhí)行業(yè)務(wù)邏輯,獲取業(yè)務(wù)邏輯的結(jié)果,根據(jù)當(dāng)前狀態(tài)以及業(yè)務(wù)邏輯執(zhí)行結(jié)果選擇合適的視圖組件返回給客戶端.

          ActionServlet類:是Struts框架的核心控制器組件,所有的用戶請(qǐng)求都先由它來(lái)處理,然后再由它把請(qǐng)求轉(zhuǎn)發(fā)給其他組件.容器啟動(dòng)的時(shí)候或者用戶首次請(qǐng)求ActionServlet的時(shí)候加載ActionServlet類在這兩種情況下,容器都會(huì)在ActionServlet被加載后立即執(zhí)行它的init()方法,這可以保證當(dāng)ActionServlet處理用戶請(qǐng)求的時(shí)候已經(jīng)被初始化.至于具體的初始化方法我們不用去管,下面研究一下ActinServlet的process()方法.當(dāng)主控制器實(shí)例接收到Http請(qǐng)求后,在doGet()或者doPost()方法中都會(huì)調(diào)用process()方法來(lái)處理請(qǐng)求.在這個(gè)方法中首先調(diào)用selectModule()方法,這個(gè)方法選擇負(fù)責(zé)處理用于請(qǐng)求的子應(yīng)用模塊.然后把子應(yīng)用模塊相關(guān)的ModuleConfig和MessageResources對(duì)象存儲(chǔ)到request范圍內(nèi),這使得框架的其余組件可以方便地從request范圍內(nèi)讀取這些對(duì)象.從而獲取應(yīng)用配置信息和消息資源.ActionServlet是可以派生子類的但是感覺(jué)沒(méi)什么意義了,多數(shù)的功能都被移動(dòng)到了RequestProcessor類中,以便減輕ActionServlet的負(fù)擔(dān).

          RequestProcessor類:對(duì)于應(yīng)用模塊,每個(gè)子應(yīng)用模塊都由各自的RequestProcessor實(shí)例.在ActionServlet的process()方法中一旦選擇了正確的子應(yīng)用模塊,就會(huì)調(diào)用子應(yīng)用的模塊的RequestProcessor類,每個(gè)子應(yīng)用模塊都可以擁有單純的RequestProcessor類.開(kāi)發(fā)人員可以很方便的創(chuàng)建客戶化的RequestProcessor類.

          Action類:是用戶請(qǐng)求和業(yè)務(wù)邏輯之間的橋梁,每個(gè)Action充當(dāng)客戶的一項(xiàng)業(yè)務(wù)代理.在RequestProcessor類預(yù)處理請(qǐng)求的時(shí)候.在創(chuàng)建了Action的實(shí)例后,就調(diào)用自身的processActionPerForm()方法,該方法調(diào)用Action的execute()方法.為了確保線程安全thread-safe,在一個(gè)應(yīng)用的生命周期中.Struts框架只會(huì)為每個(gè)Action類創(chuàng)建一個(gè)Action實(shí)例.所有的客戶請(qǐng)求共享同一個(gè)Action實(shí)例.并且所有的請(qǐng)求線程可以執(zhí)行它的execute方法.Action類的execute()方法返回一個(gè)ActionForward對(duì)象,代表了Web資源的邏輯對(duì)象,這里的Web資源可以是JSP頁(yè)面,JAVA servlet或者Action.從execute()方法返回的對(duì)象有兩種方法:創(chuàng)建一個(gè)動(dòng)態(tài)的ActionForward實(shí)例和在配置文件的action元素里的子元素元素.在execute()方法只需要調(diào)用mapping實(shí)例參數(shù)的findForward()方法,來(lái)獲得特定的ActionForward對(duì)象.元素的roles屬性是指定這個(gè)Action的用戶必須具備的安全角色.多個(gè)角色之間以逗號(hào)隔開(kāi).

          利用Token解決重復(fù)提交:在某些情況下,如果用戶對(duì)同一個(gè)HTML表單多次提交,Web應(yīng)用必須能夠判斷用戶的重復(fù)提交的行為,以做出相應(yīng)的處理.可以利用同步令牌Token機(jī)制來(lái)解決Web應(yīng)用重復(fù)提交的問(wèn)題.Struts給出了一個(gè)參考實(shí)例.Action類中提供了一系列和Token相關(guān)的方法判斷存儲(chǔ)在當(dāng)前用戶會(huì)話中的令牌值和請(qǐng)求參數(shù)中的令牌是否匹配,如果匹配返回true.否則返回false.方法是protected boolean isTokenValid(request).

          實(shí)用類:RequestUtils類:org.apache.struts.util.RequestUtlis為Struts框架提供了一些處理請(qǐng)求的通用的方法.ModuleUtils類:org.apache.strtus.taglib.ModuleUtils類提供了處理子應(yīng)用應(yīng)用模塊的實(shí)用方法.Globals類:org.apache.struts.Globals類提供了一組公共類型的靜態(tài)常量.

          控制器組件的核心技術(shù)可以說(shuō)就是Servlet,控制器也是Struts的靈魂也是MVC模式的核心,所以如果想學(xué)好Struts就必須徹底的了解控制器的運(yùn)行原理.

          posted on 2005-10-27 17:29 Sung 閱讀(301) 評(píng)論(0)  編輯  收藏 所屬分類: Struts
          主站蜘蛛池模板: 宜章县| 吴旗县| 泰和县| 西林县| 成安县| 赤城县| 盐亭县| 克东县| 综艺| 故城县| 来安县| 漯河市| 靖西县| 临桂县| 师宗县| 江永县| 黄平县| 得荣县| 镇远县| 嘉义市| 鲁甸县| 泊头市| 红桥区| 泾源县| 宁阳县| 长葛市| 无极县| 云浮市| 红桥区| 临颍县| 高清| 弋阳县| 翁源县| 呼伦贝尔市| 桑日县| 卓资县| 格尔木市| 兖州市| 麻城市| 罗江县| 衡南县|