麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

Struts控制器組件簡單介紹

2019-11-18 12:54:25
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 综合图区亚洲 | 久久视频精品 | 色播视频在线播放 | caoporn国产一区二区 | 欧美中文在线 | 毛片在线免费观看视频 | 免费啪视频在线观看 | 成人性视频欧美一区二区三区 | 日本特级a一片免费观看 | 欧美成人激情 | 综合99 | 九一免费版在线观看 | av电影院在线观看 | 成人男女激情免费视频 | 亚洲午夜1000理论片aa | 欧美a久久 | 久久99国产精品免费网站 | 亚洲成人黄色片 | 超碰人人做人人爱 | av在线1| 小雪奶水翁胀公吸小说最新章节 | 黑色丝袜美美女被躁视频 | 少妇一级淫片免费放4p | 久久精品视频69 | av在线更新| 一色屋任你操 | 成人免费在线观看视频 | 一级黄色免费观看视频 | 91精品国产综合久久男男 | h视频在线免费观看 | 毛片视 | 黄色一级片免费在线观看 | 亚州综合一区 | 国产一级aaa全黄毛片 | 成人一级视频 | 免费在线性爱视频 | 亚洲综合网站 | 蜜桃成品人免费视频 | 欧美性生活区 | 国产精品久久久久久久久久iiiii | 亚洲射情 |