<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)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

           Action類是用戶請求和業(yè)務(wù)邏輯之間的橋梁,每個Action充當(dāng)客戶的一項業(yè)務(wù)代理。在RequestProcessor類預(yù)處理請求時,在創(chuàng)建了Action的實例后,就調(diào)用自身的processActionPerform()方法,該方法再調(diào)用Action類的execute()。
    Action的excute()方法調(diào)用模型的業(yè)務(wù)方法,完成用戶請求,然后根據(jù)執(zhí)行結(jié)果把請求轉(zhuǎn)發(fā)給其他合適的WEB組件。

    一、Action類緩存

          struts應(yīng)用的生命周期中RequestProcessor只保證一個Action實例,所有的客戶請求都共享這個實例.所有請求可以同時執(zhí)行它的excute()方法。RequestProcessor類包含一個HashMap,作為存放所有Action實例的緩存。每個Action實例在緩存中存放的key為Action類名。在RequestProcessor類的processActionCreate()方法中,首先檢查在HashMap中是否存在Action實例,如果有直接使用,否則創(chuàng)建一個新的。創(chuàng)建Action實力的代碼位于同步代碼塊中,以保證只有一個線程創(chuàng)建Action實例,然后放在HashMap中。供其他線程使用。
    如下代碼
  • protected Action processActionCreate(HttpServletRequest request,   
  •                                        HttpServletResponse response,   
  •                                        ActionMapping mapping)   
  •       throws IOException 
  • {   
  •       // Acquire the Action instance we will be using (if there is one)   
  •       String className = mapping.getType();   
  •       if (log.isDebugEnabled()) 
  •      {   
  •           log.debug(" Looking for Action instance for class " + className);   
  •       }   
  •   
  •       // :TODO: If there were a mapping property indicating whether   
  •       // an Action were a singleton or not ([true]),   
  •       // could we just instantiate and return a new instance here?   
  •   
  •       Action instance = null;   
  •       synchronized (actions) 
  •      {   
  •           // Return any existing Action instance of this class   
  •           instance = (Action) actions.get(className);   
  •           if (instance != null)
  •          {   
  •               if (log.isTraceEnabled()) 
  •              {   
  •                   log.trace("  Returning existing Action instance");   
  •               }   
  •               return (instance);   
  •           }   
  •   
  •           // Create and return a new Action instance   
  •           if (log.isTraceEnabled()) 
  •          {   
  •               log.trace("  Creating new Action instance");   
  •           }   
  •              
  •           try
  •          {   
  •               instance = (Action) RequestUtils.applicationInstance(className);   
  •               // :TODO: Maybe we should propagate this exception   
  •               // instead of returning null.   
  •           } 
  •           catch (Exception e) 
  •          {   
  •               log.error(   
  •                   getInternal().getMessage("actionCreate", mapping.getPath()),   
  •                   e);   
  •                      
  •               response.sendError(   
  •                   HttpServletResponse.SC_INTERNAL_SERVER_ERROR,   
  •                   getInternal().getMessage("actionCreate", mapping.getPath()));                         
  •               return (null);   
  •           }         
  •           instance.setServlet(this.servlet);   
  •           actions.put(className, instance);   
  •       }   
  •   
  •       return (instance);   
  •   
  •   }  

     

    二.創(chuàng)建支持多線程的Action
    1.什么是線程安全的代碼
    在多線程環(huán)境下能正確執(zhí)行的代碼就是線程安全的。
    安全的意思是能正確執(zhí)行,否則后果是程序執(zhí)行錯誤,可能出現(xiàn)各種異常情況。

    2.如何編寫線程安全的代碼
    很多書籍里都詳細(xì)講解了如何這方面的問題,他們主要講解的是如何同步線程對共享資源的使用的問題。主要是對synchronized關(guān)鍵字的各種用法,以及鎖的概念。
    Java1.5中也提供了如讀寫鎖這類的工具類。這些都需要較高的技巧,而且相對難于調(diào)試。

    但是,線程同步是不得以的方法,是比較復(fù)雜的,而且會帶來性能的損失。等效的代碼中,不需要同步在編寫容易度和性能上會更好些。
    我這里強(qiáng)調(diào)的是什么代碼是始終為線程安全的、是不需要同步的。如下:
    1)常量始終是線程安全的,因為只存在讀操作。
    2)對構(gòu)造器的訪問(new 操作)是線程安全的,因為每次都新建一個實例,不會訪問共享的資源。
    3)最重要的是:局部變量是線程安全的。因為每執(zhí)行一個方法,都會在獨(dú)立的空間創(chuàng)建局部變量,它不是共享的資源。局部變量包括方法的參數(shù)變量。

    Servlet是在多線程環(huán)境下的。即可能有多個請求發(fā)給一個servelt實例,每個請求是一個線程。 struts下的action也類似,同樣在多線程環(huán)境下,你也必須編寫線程安全的Action類。
    保證線程安全的原則就是僅僅使用局部變量,謹(jǐn)慎使用實例變量(擁有狀態(tài)的實例,尤其是擁有業(yè)務(wù)對象狀態(tài)的實例). 如果要用到那些有狀態(tài)的實例,唯一和最好的辦法是在Action類中,僅僅在Action類的execute()方法中使用局部變量,對于每個調(diào)用execute()方法的線程,JVM會在每個線程的堆棧中創(chuàng)建局部變量,因此每個線程擁有獨(dú)立的局部變量,不會被其他線程共享.當(dāng)線程執(zhí)行完execute()方法后,它的局部變量就會被銷毀.
    如果Action類的實例變量是必須的話,需要采用JAVA同步機(jī)制(synchronized)對訪問共享資源的代碼塊進(jìn)行同步


    三、Struts的幾種Action
    Struts提供了一些現(xiàn)成的Action類,直接使用可以大大節(jié)省時間,如下
    ForwardAction
    可以轉(zhuǎn)發(fā)到其他web組件,僅僅提供一個轉(zhuǎn)發(fā)功能,不作處理。
    IncludeAction
    包含其他web組件。
    DiapatchAction
    通常一個Action只完成一個操作,用這個Action可以完成一組相關(guān)的操作。
    LookupDispatchAction
    他是DiapatchAction的子類,也可以定義多個方法,但主要用于一個表單里有多個按鈕,而這些按鈕又有一個共同的名字的場合。
    SwitchAction
    用于子模塊之間的切換。


    四.ActionForward類
    Action類的excute()方法返回一個ActionForward對象,它代表了web資源的邏輯抽象,這里的web資源可以是jsp頁面、Java servlet、或Action
    從excute返回ActionForward可以有兩種方法。
    1) 動態(tài)創(chuàng)建一個ActionForward實例
    return new ActionForward(”Failure”,”login.jsp”,true);
    2) 調(diào)用ActionMappin實例的findForward方法
    這個方法先從action級別找,然后在<global-forwards />級別找
    return mapping.findForward(“Failure”);

  • posted on 2009-04-05 11:19 lanxin1020 閱讀(192) 評論(0)  編輯  收藏 所屬分類: struts1
    主站蜘蛛池模板: 亚洲综合男人的天堂色婷婷| 亚洲AV无码一区东京热久久| 97se亚洲国产综合自在线| 99在线热视频只有精品免费| 国产成A人亚洲精V品无码性色| 国产黄色片免费看| 精品亚洲一区二区三区在线播放| 美女视频黄频a免费观看| 国产禁女女网站免费看| 青草久久精品亚洲综合专区| 国产伦精品一区二区三区免费迷| 人人狠狠综合久久亚洲| 亚洲成?Ⅴ人在线观看无码| 一个人看的在线免费视频| 亚洲熟妇丰满多毛XXXX| 免费在线看黄网站| 亚洲国产亚洲片在线观看播放 | 亚洲午夜福利在线观看| 国产免费网站看v片在线| 亚洲精品天天影视综合网| 91成人免费观看网站| 亚洲AV无码成人专区| 日韩免费一级毛片| 黄床大片免费30分钟国产精品| 亚洲人成无码网站| 亚洲啪啪免费视频| 亚洲成aⅴ人片久青草影院按摩| 日产国产精品亚洲系列| 日本免费在线观看| 久久国产亚洲精品| 精品亚洲一区二区三区在线观看| 1000部啪啪毛片免费看| 亚洲综合一区无码精品| 亚洲中文字幕视频国产| 1000部拍拍拍18勿入免费视频下载 | 亚洲男女性高爱潮网站| 在线观看免费精品国产| 中文字幕免费视频精品一| 精品亚洲成在人线AV无码| 亚洲精品无码专区2| 最近中文字幕完整免费视频ww|