国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Struts控制器組件簡單介紹

2019-11-18 12:54:25
字體:
供稿:網(wǎng)友

  Struts控制器組件負責(zé)接受用戶請求、更新模型,以及選擇合適的視圖組件返回給用戶。控制器組件有助于將模型層和視圖層分離,有了這種分離,就可以在同一個模型的基礎(chǔ)上得心應(yīng)手地開發(fā)多種類型的視圖。Struts控制器組建主要包括:
  
  ·ActionServlet組件:充當(dāng)Struts框架的中心控制器。
  
  ·RequestPRocessor組件:充當(dāng)每個子應(yīng)用模塊的請求處理器。
  
  ·Action組件:負責(zé)處理一項具體的業(yè)務(wù)。
  
  Struts框架采用控制器組件來預(yù)處理所有的客戶請求,這種集中控制方式可以滿足MVC設(shè)計模式的兩大需求:
  
  ·首先,控制器在用戶輸入數(shù)據(jù)和模型之間充當(dāng)媒介 / 翻譯者的角色,提供一些通用功能,如安全、登入和其他針對具體用戶請求的重要服務(wù),當(dāng)系統(tǒng)的這些通用功能出現(xiàn)需求變更時,部需要修改整個應(yīng)用,只需要修改局部的控制器組件即可。
  
  ·其次,由于所有的請求都經(jīng)過控制器過濾,因此可以降低視圖組件之間,以及視圖組件和模型組件之間的相互依靠關(guān)系,提高每個組件的相對獨立性。由控制器組件來決定把合適的視圖組件返回給用用戶,這可以減少視圖組件之間直接的,錯綜復(fù)雜的連接關(guān)系,使應(yīng)用更加靈活,便于維護。
  
  Struts框架采用ActionServlet和RequestProcessor組件進行集中控制,并采用Action組件來處理單項業(yè)務(wù)。
  
  一 控制器組件的控制機制
  
  Struts的控制器組件主要完成以下任務(wù):
  
  ·接受用戶請求
  
  ·根據(jù)用戶請求,調(diào)用合適的模型組件來執(zhí)行相應(yīng)的業(yè)務(wù)邏輯。
  
  ·獲取業(yè)務(wù)邏輯執(zhí)行結(jié)果。
  
  ·根據(jù)當(dāng)前狀態(tài)以及業(yè)務(wù)邏輯執(zhí)行結(jié)果,選擇合適的視圖組件返回給用戶。
  
  1 Action類
  
  org.apache.struts.action.ActionServlet類是Struts框架的核心控制器組件,所有的用戶請求都先有ActionServlet來處理,然后再由ActionServlet把請求轉(zhuǎn)發(fā)給其他組件。Struts框架只答應(yīng)在一個應(yīng)用中配置一個ActionServlet類,在應(yīng)用的生命周期中,僅創(chuàng)建ActionServlet類的一個實例,這個ActionServlet實例可以同時響應(yīng)多個用戶請求。
  
  (a)  Struts框架初始化過程
  
  (1)  調(diào)用initInternal()方法,初始化Struts框架內(nèi)在的消息資源,如與系統(tǒng)日志相關(guān)的同志、警告和錯誤消息。
  
  (2)  調(diào)用initOther()方法,從web.xml文件中加載ActionServlet的初始化參數(shù),如config參數(shù)。
  
  (3)  調(diào)用initServlet()方法,從web.xml文件中加載ActionServlet的URL映射信息。此外還會注冊web.xml和Struts配置文件所使用的DTD文件,這些DTD文件用來驗證web.xml和Struts配置文件的語法。
  
  (4)  調(diào)用initModuleConfig()方法,加載并解析子應(yīng)用模塊的Struts配置文件;創(chuàng)建ModuleConfig對象,把它存儲在ServletContext中。
  
  (5)  調(diào)用initModuleMessageResources()方法,加載并初始化默認子應(yīng)用模塊的消息資源:創(chuàng)建MessageResources對象,把它存儲在ServletContext中。
  
  (6)  調(diào)用initModuleDataSources()方法,加載并初始化默認子應(yīng)用模塊的數(shù)據(jù)源。假如在Struts配置文件中沒有定義元素,就忽略這一流程。
  
  (7)  調(diào)用InitModulePlugins()方法,加載并初始化默認子應(yīng)用模塊的所有插件。
  
  (8)  當(dāng)默認子應(yīng)用模塊被成功地初始化后,假如還包括其他子應(yīng)用模塊,將重復(fù)流程(4)~(7),分別對其他子應(yīng)用模塊進行初始化。
  
  (b)  ActionServlet的process()方法
  
  當(dāng)ActionServlet實例接受到HTTP請求之后,在doGet()或doPost()方法都會調(diào)用process()方法來處理請求。一下是ActionServlet的process()方法的源代碼:
  
  protected void process (HttpServletRequest request, HttpServletResponse response)
  
  throw IOException, ServletException {
  
  ModuleUtils.getInstance().selectModule(request, getServletContext());
  
  getRequestProcessor(getModuleConfig(request)).process(request, response);
  
  }
  
  在process()方法中,首先調(diào)用org.apache.struts.util.ModuleUtils類的selectModule()方法,這個方法選擇負責(zé)處理當(dāng)前請求的子應(yīng)用模塊,然后把與子應(yīng)用模塊相關(guān)的ModuleConfig和MessageResources對象存儲倒request范圍中,這使得框架的其余組件可以方便地從request范圍中讀取這些對象,從而獲取應(yīng)用配置信息和消息資源。
  
  process()方法的第二步操作為獲得RequestProcessor類的實例,然后調(diào)用RequestProcessor類的process()方法,來完成十幾的預(yù)處理請求操作。
  
  (c)  擴展ActionServlet類
  
  在Sturts 1.1 之前的版本中,ActionServlet類本身包含了很多處理請求的代碼。從Struts 1.1 開始,多數(shù)功能被移到 org.apache.struts.action.RequestProcessor 類中,以便減輕ActionServlet類的控制負擔(dān)。
  
  盡管新版本的Struts框架答應(yīng)在應(yīng)用中創(chuàng)建礦展ActionServlet類的子類,但是這在多數(shù)情況下沒有必要,因為控制器的多數(shù)控制功能位于RequestProcessor類中。
  
  假如實際應(yīng)用確實需要創(chuàng)建自己的ActionServlet類,則可以創(chuàng)建一個ActionServlet的子類,然后在web.xml文件中配置這個客戶化ActionServlet類。
  
  假如覆蓋了init()方法,應(yīng)該確保首先調(diào)用super.init(),它保證ActionServlet的默認初始化操作被執(zhí)行。除了覆蓋init()方法外,事實上,還可以根據(jù)十幾需要覆蓋ActionServlet的任何其他方法。
  
  2 RequestProcessor類
  
  對于多應(yīng)用模塊的Struts應(yīng)用,每個子應(yīng)用模塊都有各自的RequestProcessor實例。在ActionServlet的process()方法中,一旦選擇了正確的子應(yīng)用模塊,就會調(diào)用子應(yīng)用模塊的RequestProcessor實例的process()方法來處理請求。在ActionServlet調(diào)用這個方法時,會把當(dāng)前的request和response對象傳給它。
  
  Struts框架只答應(yīng)應(yīng)用中存在一個ActionServlet類,但是可以存在多個客戶化的RequestProcessor類,每個子應(yīng)用模塊都可以擁有單獨的RequestProcessor類。假如想修改RequestProcessor類的一些默認功能,可以覆蓋RequestProcessor基類中的相關(guān)方法。
  
  (a)  RequestProcessor類的process()方法
  
  RequestProcessor類的process()方法負責(zé)實際的預(yù)處理請求操作。
  
  RequestProcessor類的process()方法一次執(zhí)行一下流程:
  
  (1) 調(diào)用processMultipart()方法。假如HTTP請求方式為POST,并且請求的contentType屬性以“multipart/form-data”開頭,標(biāo)準(zhǔn)的HttpServletRequest對象將被重新包裝,以方便處理“multipart”類型的HTTP請求。假如請求方式為GET,或者contentType屬性不是“multipart”,就直接返回原始的HttpServletRequest對象。
  
  (2) 調(diào)用processPath()方法,獲得請求URI的路徑,這一信息可用于選擇合適的Struts Action組件。
  
  (3) 調(diào)用processLocale()方法,當(dāng)ControllerConfig對象的locale屬性為true,將讀取用戶請求中包含的Locale信息,然后把Locale實例保存在session范圍內(nèi)。
  
  (4) 調(diào)用processContent()方法,讀取ControllerConfig對象的contentType屬性,然后調(diào)用response.setContentType(contentType)方法,設(shè)置響應(yīng)結(jié)果的文檔類型和字符編碼。
  
  (5) 調(diào)用processNoCache()方法,讀取ControllerConfig對象的nocache屬性,假如nocache屬性為true,在響應(yīng)結(jié)果中將加入特定的頭參數(shù):Pragma、Cache-Control和EXPires,防止頁面被存儲在客戶瀏覽器的緩存中。
  
  (6) 調(diào)用processPreprocess()方法。該方法不執(zhí)行任何操作,直接返回true。子類可以覆蓋這個方法,執(zhí)行客戶化的預(yù)處理請求操作。
  
  (7) 調(diào)用processMapping()方法,尋找和用戶請求的URI匹配的ActionMapping。假如不存在這樣的ActionMapping,則向用戶返回恰當(dāng)?shù)腻e誤消息。
  
  (8) 調(diào)用processRoles()方法,先判定是否為Action配置了安全角色,假如配置了安全角色,就調(diào)用isUserRole()方法判定當(dāng)前用戶是否具備必需的角色;假如不具備,就結(jié)束請求處理流程,向用戶返回恰當(dāng)?shù)腻e誤消息。
  
  (9) 調(diào)用processActionForm()方法,先判定是否為ActionMapping配置了ActionForm,假如配置了ActionForm,就先從ActionForm的存在范圍內(nèi)尋找該ActionForm實例;假如不存在,就創(chuàng)建一個實例。接下來把它保存在合適的范圍中,保存時使用的屬性key為ActionMapping的name屬性。
  
  (10) 調(diào)用processActionForm()方法。假如為ActionMapping配置了ActionForm,就先調(diào)用ActionForm的reset()方法,再把請求中的表單數(shù)據(jù)組裝到ActionForm中。
  
  (11) 調(diào)用processValidate()方法,假如為ActionMapping配置了ActionForm,并且ActionMapping的validate屬性為true,就調(diào)用ActionForm的validate()方法。假如validate()方法返回的ActionErrors對象中包

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 定陶县| 合作市| 温泉县| 遂昌县| 龙胜| 阿坝县| 沅江市| 盘锦市| 长葛市| 广元市| 当雄县| 冕宁县| 长乐市| 石棉县| 青海省| 曲水县| 明光市| 平舆县| 通山县| 邯郸县| 涪陵区| 原平市| 苗栗市| 东明县| 上思县| 西充县| 邢台县| 盐城市| 突泉县| 沭阳县| 永春县| 阿拉尔市| SHOW| 溆浦县| 寻甸| 辉县市| 临桂县| 永和县| 闸北区| 闸北区| 阿克苏市|