<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 63  文章 - 0  trackbacks - 0
    <2009年4月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

            大家都知道,Struts控制器組件負(fù)責(zé)接受用戶請求,更通模型,以及返回給用戶合適的視圖組件.
    控制器將模型層和視圖層分開,這樣分離,可以為同一個模型開發(fā)出不同的視圖.
            下面時Struts的三大主要組件
    ActionServlet組件:充當(dāng)Struts框架的中央控制器
    RequestProcessor組件:充當(dāng)每個子應(yīng)用模塊的請求處理器
    Action組件:真正來處理一項具體的業(yè)務(wù).

    一. Struts的init()方法
    Struts應(yīng)用中只存在ActionServlet的一個實例,Servlet容器在啟動時,或者用戶首次請求ActionServlet時加載ActionServlet類.在這兩種情況下,servlet容器都會在ActionServlet容器被加載后立即執(zhí)行它的init()方法,這可以保證ActionServlet處理用戶請求時已經(jīng)被初始化.

    下面根據(jù)Init()講述Struts的初始化過程
  • public void init() throws ServletException {   
  •   
  •         // Wraps the entire initialization in a try/catch to better handle   
  •         // unexpected exceptions and errors to provide better feedback   
  •         // to the developer   
  •         try {   
  • //調(diào)用initInternal()方法,初始化Struts框架內(nèi)的消息資源,如與系統(tǒng)日志相關(guān)的通知,警告,和錯誤消息.   
  • 1)initInternal();   
  •   
  • //調(diào)用ininOther()方法,從web.xml文件中加載ActionServlet的初始化參數(shù),如config參數(shù)   
  • 2)initOther();   
  •   
  • //調(diào)用initServlet()方法,從web.xml文件中加載ActionServlet的URL映射信息.同時還會注冊web.xml文件和Struts配置文件所使用的DTD文件,這些DTD文件用戶驗證web.xml和struts配置文件的語法.其中方法里的 digester類負(fù)責(zé)解析web.xml,對字符串servletMapping屬性進行初始化   
  • 3) initServlet();   
  •   
  • //把ActionServlet實例放到ServletContext里   
  • getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);   
  •   
  • //初始化一個factory,用于創(chuàng)建moduleConfig   
  • initModuleConfigFactory();   
  •   
  • //,加載并解析默認(rèn)struts配置文件/WEB-INF/struts-config.xml,同時創(chuàng)建MoudleConfig實例,放到ServletContext中   
  • 4)ModuleConfig moduleConfig = initModuleConfig("", config);   
  •   
  • //加載并初始化默認(rèn)子應(yīng)用模塊的消息資源;講解MessageResources對象,把它存儲在ServletContext中.   
  • 5)initModuleMessageResources(moduleConfig);   
  •   
  • //加載并初始化默認(rèn)子應(yīng)用模塊的數(shù)據(jù)源,如果在struts配置文件中沒有定義<data-sources >元素,忽略這一流程.   
  • 6)initModuleDataSources(moduleConfig);   
  •   
  • //加載并初始化默認(rèn)子應(yīng)用的所有插件   
  • 7)initModulePlugIns(moduleConfig);   
  •   
  • //凍結(jié)moduleConfig(,在方法返回之前不能修改它,否則將拋出異常)   
  • moduleConfig.freeze();   
  •            
  • //如果還有其他子應(yīng)用模塊,將重復(fù)4-7步   
  •       Enumeration names = getServletConfig().getInitParameterNames();   
  •             while (names.hasMoreElements()) {   
  •                 String name = (String) names.nextElement();   
  •                 if (!name.startsWith("config/")) {   
  •                     continue;   
  •                 }   
  •                 String prefix = name.substring(6);   
  •                 moduleConfig = initModuleConfig   
  •                     (prefix, getServletConfig().getInitParameter(name));   
  •                 initModuleMessageResources(moduleConfig);   
  •                 initModuleDataSources(moduleConfig);   
  •                 initModulePlugIns(moduleConfig);   
  •                 moduleConfig.freeze();   
  •      }   
  •   
  • //將各個子模塊應(yīng)用(除了默認(rèn)的)的前綴存到一個字符數(shù)組中,并放到servletcontext中   
  • this.initModulePrefixes(this.getServletContext());   
  • //釋放創(chuàng)建的用于讀取配置文件的digester實例,釋放內(nèi)存   
  •             this.destroyConfigDigester();   
  •         } catch (UnavailableException ex) {   
  •             throw ex;   
  •         } catch (Throwable t) {   
  •             // The follow error message is not retrieved from internal message   
  •             // resources as they may not have been able to have been    
  •             // initialized   
  •             log.error("Unable to initialize Struts ActionServlet due to an "  
  •                 + "unexpected exception or error thrown, so marking the "  
  •                 + "servlet as unavailable.  Most likely, this is due to an "  
  •                 + "incorrect or missing library dependency.", t);   
  •             throw new UnavailableException(t.getMessage());   
  •         }       
  • }  
  •        將各個子模塊應(yīng)用(除了默認(rèn)的)的前綴存到一個字符數(shù)組中,并放到servletcontext中,對于默認(rèn)的子應(yīng)用模塊,在appclication范圍內(nèi)存放他的MoudleConfig實例的key為“org.apache.struts.action.MODULE”,其他模塊如/account,存放的key為org.apache.struts.action.MODULE/account,消息,數(shù)據(jù)源和插件等部分存在servletcontext的key和上述方法類似,不在說明.


    二.ActionServlet的process方法
    當(dāng)ActionServlet接受到HTTP請求后,在doget()或doPost()方法中都會調(diào)用process()方法來處理請求.

  •  public void doGet(HttpServletRequest request,   
  •               HttpServletResponse response)   
  •         throws IOException, ServletException {   
  •   
  •         process(request, response);   
  •   
  • }   

  •   public void doPost(HttpServletRequest request,   

  •                HttpServletResponse response)   
  •         throws IOException, ServletException {   
  •   
  •         process(request, response);   
  •   
  • }   
  • 下面是process方法,它看上去并不復(fù)雜,但他調(diào)用的其他方法比較復(fù)雜. 
     protected void process(HttpServletRequest request, HttpServletResponse response)   

  •         throws IOException, ServletException {   
  •         //根據(jù)request里的信息從servletContext里找到相應(yīng)的子模塊ModuleConfig,和它下面的MessageResources,并放到request里,使其他組件可以方便的供request里取得應(yīng)用配置信息和消息資源.   
  •         ModuleUtils.getInstance().selectModule(request, getServletContext());   
  • //取出MoudleConfig實例config   
  •         ModuleConfig config = getModuleConfig(request);   
  •     //根據(jù)config里這個子模塊的信息,從servletcontext里,取出這個子模塊的RequestProcessor實例   
  •         RequestProcessor processor = getProcessorForModule(config);   
  •     //如果processor實例為空,就新建一個.同時放到servletcontext里.   
  •         if (processor == null) {   
  •            processor = getRequestProcessor(config);   
  •         }   
  • //調(diào)用RequestProcessor的process方法處理,   
  •         processor.process(request, response);   
  •     }  

  • 三. 擴展ActionServlet
    從Struts1.1開始,為減輕ActionServlet的負(fù)擔(dān),多數(shù)功能已經(jīng)移到RequestProcessor類中,所以基本不用擴展ActionServlet

    如果需要創(chuàng)建自己的ActionServlet,則可以創(chuàng)建一個它的子類.覆蓋init()方法(或其他方法),可以寫一些自己的操作,但要先調(diào)用super.init();
    定義如下的類:

  • package sample;    
  • public class ExtendedActionServlet extends ActionServlet {    
  •         public void init() throws ServletException {    
  •                super.init();    
  •                //do some operations    
  •                ……………    
  •         }    
  • }   


  • 擴展完類后,還應(yīng)該在web.xml文件中如下配置:

  • <servlet>    
  •         <servlet-name>sample</servlet-name>    
  •         <servlet-class>sample.ExtendedActionServlet</servlet-class>    
  • </servlet>    
  •     
  • <servlet-mapping>    
  •        <servlet-name>sample</servlet-name>    
  •        <url-pattern>/action/*<url-pattern> 



  • 上面的/action/*表示負(fù)責(zé)處理所有以/action為前綴的URL,后面的/表示轉(zhuǎn)義
    posted on 2009-04-05 11:10 lanxin1020 閱讀(193) 評論(0)  編輯  收藏 所屬分類: struts1
    主站蜘蛛池模板: 黄色毛片免费观看| 日韩大片免费观看视频播放| 中文在线免费观看| 亚洲第一网站男人都懂| 理论片在线观看免费| 免费a级毛片视频| 一级毛片免费播放试看60分钟| 亚洲 小说区 图片区 都市| 高潮内射免费看片| 国产精品亚洲精品日韩已方| 久久国产免费直播| 国产精品亚洲а∨无码播放| 免费人成在线观看网站品爱网| 久久久久亚洲精品无码蜜桃| 午夜性色一区二区三区免费不卡视频| 亚洲欧洲高清有无| 成年女人免费视频播放77777| 亚洲av无码专区在线观看亚| 免费人妻av无码专区| 丝瓜app免费下载网址进入ios| 亚洲成AV人片一区二区密柚| 国产精品免费观看| 亚洲成AV人片在WWW| 久久亚洲精品无码观看不卡| 99久久国产免费中文无字幕| 国产亚洲精品影视在线| 日本大片在线看黄a∨免费| 一区二区视频免费观看| 亚洲人成网站影音先锋播放| AV免费网址在线观看| 久久亚洲国产午夜精品理论片| 99在线在线视频免费视频观看| 亚洲乱色伦图片区小说| 国产亚洲精品精品国产亚洲综合| 91香焦国产线观看看免费| 中文字幕亚洲精品无码| 国产亚洲精品拍拍拍拍拍| 69式国产真人免费视频| 一区二区三区在线免费观看视频| 亚洲国产精品线在线观看| 免费一级毛片清高播放|