隨筆-21  評論-29  文章-0  trackbacks-0
           

          StrutsMVC組件
                  組件包括:ActionServlet Action Classes Action Mapping(此處包括ActionForward)、ActionForm Bean
          Struts中的MVC

                  1
          、模型(Model):本質(zhì)上來說在StrutsModel是一個商業(yè)邏輯類,開發(fā)者實現(xiàn)商業(yè)邏輯。
                  2
          、視圖(View):View是由與控制器Servlet配合工作的一整套JSP定制標簽庫構(gòu)成,利用他們可以快速建立應(yīng)用系統(tǒng)的界面。
                  3
          、控制器(Controller):前端控制器是一個Servlet。它將客戶端請求轉(zhuǎn)發(fā)到相應(yīng)的后端控制器ActionForm類。
          ActionServlet(中心控制器)
          ——參看APIDOC
                
          定義:繼承自javax.servlet.http.HttpServlet類,是中心控制器(總控制器)。它提供一個中心位置來處理全部的終端請求。
                
          作用:接受請求、填充數(shù)據(jù)、派發(fā)請求、響應(yīng)用戶  
              配置:在web配置文件web.xml中聲明。

          <servlet>
                 
          <servlet-name>action</servlet-name>
                 
          <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
                 
          <init-param>
                     
          <param-name>config</param-name>
                     
          <param-value>/WEB-INF/struts-config.xml</param-value>
                 
          </init-param>
                 
          <load-on-startup>0</load-on-startup>
              
          </servlet>

              
          <servlet-mapping>
                 
          <servlet-name>action</servlet-name>  
                 
          <url-pattern>*.do</url-pattern>
              
          </servlet-mapping>

          Action 
            

          APIDOC:An Action is an adapter between the contents of an incoming HTTP request and the corresponding business logic that should be executed to process this request. The controller (RequestProcessor) will select an appropriate Action for each request, create an instance (if necessary), and call the execute method.
            問題:Action是什么時候初始化的?服務(wù)啟動的時候,還是接收到用戶第一次請求的時候?
          AddStudentAction中加入以下代碼(加入其構(gòu)造方法)

          public AddStudentAction(){
                  System.out.println(
          "in AddStudentAction constructor");
              }

          重新部署后觀察頁面和控制器


          以上證明:Action發(fā)出該Action請求,不是在讀取配置時初始化的!
          再打開另外一個瀏覽器,新建一個會話,發(fā)現(xiàn)該語句只打印一次,即證明Action只初始化一次!

          APIDOC:Actions must be programmed in a thread-safe manner, because the controller will share the same instance for multiple simultaneous requests. This means you should design with the following items in mind:  

          • Instance and static variables MUST NOT be used to store information related to the state of a particular request. They MAY be used to share global resources across requests for the same action.
          • Access to other resources (JavaBeans, session variables, etc.) MUST be synchronized if those resources require protection. (Generally, however, resource classes should be designed to provide their own protection where necessary.

          注意:Action的線程安全性,不能多個請求共享一個Action實例。
          怎樣實現(xiàn)Action的安全性編程?
             注意不要用實例變量或者類變量共享只是針對某個請求的數(shù)據(jù)
             注意資源操作的同步性。
          應(yīng)用:可以統(tǒng)計一個Action訪問次數(shù)。(設(shè)計一個實例變量count 其在調(diào)用時加1)
          新建一個CountAction類,其繼承自Action類


          在struts-config.xml中注冊  即加入如下代碼
          <action path="/countAction" type="cn.itcast.CountAction"></action>
          編輯CountAction代碼 如下

          package cn.itcast;

          import java.io.PrintWriter;

          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          import org.apache.struts.action.Action;
          import org.apache.struts.action.ActionForm;
          import org.apache.struts.action.ActionForward;
          import org.apache.struts.action.ActionMapping;

          public class CountAction extends Action {
              
              
          private Integer count = 0 ;
              
          public ActionForward execute(ActionMapping mapping, ActionForm form,
                      HttpServletRequest request, HttpServletResponse response)
                      
          throws Exception {
                  
                  
          synchronized (count){
                  count
          ++ ;
                  }

                  PrintWriter out 
          = response.getWriter();
                  out.println(
          "count="+count);        
                  
          return null ;
              }


          }

          重新部署應(yīng)用 http://localhost:8080/strutstest//countAction.do 實現(xiàn)了計數(shù)功能





          有n個請求就會執(zhí)行n個對應(yīng)的execute方法,但這n個execute方法同時操作count變量,要注意線程安全!

          posted on 2009-05-02 22:14 特立獨行 閱讀(259) 評論(0)  編輯  收藏 所屬分類: Struts框架
          主站蜘蛛池模板: 辽宁省| 玉龙| 云和县| 镶黄旗| 马公市| 伊宁市| 贵州省| 江阴市| 林口县| 长沙市| 镇宁| 竹北市| 南投市| 丹凤县| 岚皋县| 宝鸡市| 始兴县| 吉安县| 南投市| 遵义县| 郯城县| 彰武县| 金昌市| 台前县| 涡阳县| 安西县| 新邵县| 体育| 凯里市| 汉沽区| 乐安县| 兴文县| 武陟县| 佛山市| 元朗区| 呼伦贝尔市| 东乌珠穆沁旗| 夏邑县| 三台县| 威宁| 长武县|