Struts2學習筆記 - Part.01

1.關於Struts2中的struts.xml文件中action設置html

         <!-- 它是一個通用action,此處的*代表它能夠處理任意的請求-->
         <action name="*" >                                                      <!-- 此處的{1}表明前面第一個星號所匹配的字串 -->
             <result name="success">/WEB-INF/content/{1}.jsp</result>            <!--跳轉到*(所表明的任意字符)號頁面-->    
         </action>
             
         <!-- 它是一個匹配*Action*的action-->
         <action name="*Action*" >                                               <!-- 此處的{1}表明前面第一個星號所匹配的字串 -->
             <result name="success">/WEB-INF/content/{1}_{2}.jsp</result>        <!--跳轉匹配*Action*的頁面-->
         <!--例如,輸入/test/abcActionxyz跳轉頁面爲/test//WEB-INF/content/abc_xyz.jsp -->
         </action>

                                        <!-- 該action負責處理loginPro的請求,                                         指定method,則由method的方法處理,                                         沒有指定method,由LoginProAction的execute()方法處理 -->       <action name="loginPro"       class="org...XX.action.LoginproAction"       method="xyz"></action>

 

 

2.安裝Struts2的web

  (1)拷JAR包。app\struts2-blank.war\WEB-INF\lib下的全部JAR包;sql

  (2)修改web.xml文件an。加載Struts 2的核心Filter;瀏覽器

  (3)在classes目錄下增長一個Struts 2的配置文件:struts.xml(struts2-blank.war下的struts.xml拷入便可);cookie

3.Struts2的開發步驟:session

  (1)先定義一個能發送請求的頁面:app

      能夠是超連接,也能夠是表單;(個別狀況下用戶能夠直接以GET方法發送請求)jsp

  (2)開發Action類(Action的三個要求):模塊化

      Struts2 對Action並無過多的要求,只要求:編碼

      A. 推薦實現Action接口,或繼承ActionSupport類;

        ActionSupport實現了Action接口,它增長了一些類型轉換支持、輸入校驗支持等功能。

        並且它實現execute()方法,該方法直接返回SUCCESS;

      B. 爲每一個請求參數都提供Field,併爲之提供相應的setter和getter方法;

        爲須要傳到頁面的處理結果也定義Field,並提供對應的setter和getter方法。

        Struts2不會區分Action裏的哪一個Field用於封裝請求參數,哪一個Field用於封裝處理結果。

        對系統而言,封裝請求參數的Field和封裝處理結果的Field徹底平等;

      C. 該Action類應該有無參數的構造器(默認爲execute)

      D. 返回值必須是String;

      E. (重複強調)Action的處理方法不能有形參聲明;

   (3) 配置Action

      全部的Action都要放在Package裏配置;

      <action.../>元素一般有以下經常使用屬性:

      -name:指定該Action處理哪一個請求;

      -class:制定該Action對應的處理類;

      -method:指定使用Action的哪一個方法來處理用戶請求,默認值爲execute();

     併爲處理返回的字符串,指定相應的物理視圖<result name="">"/*.jsp"</result>

 

    /************************************

      Action接口與ActionSupport

      Action接口中定義了5個字符串常量(ERROR"error",INPUT"input",LOGIN"login",NONE"none",SUCCESS"success"),

      和一個execute()抽象方法;

    ************************************/

4.Struts2詳細運行機制:

  (1)瀏覽器發送請求:abc.action(-action後綴能夠保留,也能夠省略);

  (2)瀏覽器發送的請求,首先被StrutsPrepareAndExecuteFilter攔截

    --由於咱們在web.xml中指定StrutsPrepareAndExecuteFilter來過濾全部的用戶請求;

  (3)StrutsPrepareAndExecuteFilter會去建立Action實例;

      例如(簡介):咱們請求abc.action,StrutsPrepareAndExecuteFilter會搜索struts.xml文件中name爲abc的Action配置,

      根據class屬性,「使用反射」來建立Action實例;

      例如(詳解):

      //假如該Filter收到abc.action的請求,經過解析struts.xml獲取類名

      String clazzProp="MyAction";

      //反射:經過類名爲參數反射,獲取Action類對應的Class對象

      Class actionClazz=Class.forName(clazzProp);

      //用反射建立了Action的實例(要求Action類有無參數構造器

      Object actionInst=actionClazz.newInstance();

  (4)調用

      Map<String,String> paramMap=request.getParameterMap() //返回全部的請求參數;

      使用循環(String paramName:em)

      {

      //獲得請求參數名對應的setter方法

      Action類.getMethod("set"+paraName的首字母大寫);

      Method setter=actionClazz.getMethod("set"+paramName.substring(0,1).toUpperCase()

              +paramName.substring(1),String.class);

      //獲得請求參數對應的值

      String paramValue=paramMap.get(paramName);

      //以Action實例爲調用者,調用setter方法,把請求參數值做爲參數值傳入

      setter.invoke(actionInst,paramVaue);    /*invoke的使用舉例與解釋:

                               *String result = (String)method.invoke(obj ,sql);

                               *執行obj的method方法(參數爲sql),返回String類型結果 */

     }

  (5)再次經過反射來調用method屬性所指定的方法;

      返回一個字符串;

  (6)根據strut.xml文件中的<result.../>元素的name以及物理視圖資源,

      跳轉到實際的視圖資源;

 

 ===============如何在action中訪問Servlet API===============

總有些時候,須要訪問Servlet API

好比須要把數據存入session、Application,或添加cookie:response.addCookie()

Struts2提供了兩種方式訪問Servlet API:

  僞訪問:藉助於ActionContext

      ActionContext提供了getSession  -模擬訪問Http Session

                getApplication -模擬訪問Appication

  真訪問:(好比要添加Cookie):藉助於ServletActonContext(須要導入HttpServletResponse包)

      ServletActonContext提供了以下靜態方法:

        - static PageContext       getPageContext()
        - static HttpServletRequest   getRequest()
        - static HttpServletResponse   getResponse()
        - static ServletContext      getServletContext()

=================Struts2常量配置=================

  Struts2常量,也叫Struts2屬性,做用:控制整個Struts2的應用特性;

  一個常量名 指定一個常量值,配置方式有3種:

    - 在web.xml中:每一個常量要4行:

      <!-- 經過Filter配置初始化參數,就可配置Struts2的常量 -->

      <init-param>

        <param-name>常量名</param-name>

        <param-value>常量值</param-value>

      </init-param>

    - 在struts.xml文件配置(推薦)

      <constant name="常量名" value="常量值"/>  --每行配置一個常量

    - 額外增長一個struts.properties配置文件

      常量名=常量值                 --每行配置一個常量

   /*****************經常使用常量********************

    <!-- 編碼格式 -->
    <constant name="struts.i18n.encoding" value="UTF-8" />
    <!-- 上傳文件大小限制設置 -->
    <constant name="struts.multipart.maxSize" value="-1" />
    <!-- 把它設置爲開發模式,發佈時要設置爲false -->
    <constant name="struts.devMode" value="true" />
  
  其餘:Struts2經常使用的constant總結

  ********************************************/

==============Struts2包含其餘配置文件及包配置=================

include其餘配置文件
  企業開發--模塊化開發
  - 開發階段:每一個人都維護本身的配置文件
  - 銷售階段:軟件作成模塊化:
    <struts>
      <!-- 包含了其餘配置文件 -->
      <include file="struts-books.xml"></include>
      <!-- 指定了namespace爲/users,覺得着該包下面全部的Action都處於/user空間下 -->
      <package name="books" extends="struts-default" namespace="books">
        <action>
          <result>***</result>
        </action>
      </package>
    </struts>

  /****************************

    Struts的配置文件,包括:

    Struts-default.xml  - Struts2的核心包使用該配置文件;

    Struts-plugin.xml   - Struts2的插件包使用該配置文件;

    Struts.xml      - Struts2應用使用該配置文件;

    Struts-abc.xml    - 這種其餘的配置文件,必須被include纔會加載

  ****************************/
  配置包:
  每一個package元素定義了一個包配置。定義package元素時能夠指定以下幾個屬性:
  - name:必填屬性,指定該包的名字,該名字是該包被其餘包引用的key;
  - extends:可選屬性,該屬性指定該包繼承其餘包,繼承其餘包能夠繼承其餘包中的Action定義、攔截器定義等;
  - namespace:可選屬性,定義該包的命名空間;
  - abstract:可選屬性,指定該包是不是一個抽象包,抽象包中不能包含Action定義;

===================struts2的結果配置===================

  邏輯試圖名與物理視圖的關係,是經過<result.../>元素來管理
  標準的result格式:
    <result name="" type="">
      <param></param>      //param輸入屬性元素,例:<param name="location">物理視圖的位置</name>
      <param></param>     
      ...
    </result>

    //能夠簡化爲以下(經常使用):

    <result name="邏輯視圖名" type="視圖類型">物理視圖的位置</result>

 

  支持以下屬性
    - name:指定邏輯視圖名;默認是success;
    - type:指定所使用的物理視圖模型;
      dispatcher(默認值),相對應的是redirect(重定向)

      ...
      (其餘在struts-default.xml文件中的struts-default抽象包中result-type)

/*********************************
forward與redirect的區別?
  forward:依然是一次請求,地址欄的URL沒有變化,請求參數和請求屬性都不會丟失;
  redirect:從新發送一次新請求(就跟直接在地址欄輸入新URL,並回車的效果是同樣的)
        地址欄的URL會改變,請求參數和請求屬性所有都丟失;

*********************************/

  常見的結果類型:
    chain     - Action處理完用戶請求後,轉發到下一個Action繼續處理。
             造成鏈式處理;
    dispatcher   - 默認值
             轉發到JSP頁面
    redirect     - 直接"重定向"到新的URL,會生成一次新的請求,原有的請求參數、請求屬性都會丟失。
             與默認的dispatcher對應;
    plainText      - 直接顯示視圖頁面的源代碼;
    stream      - 直接生成"二進制"流做爲相應;

  全局result與局部result:
    result元素放在action,就是局部result;
    result元素放在global-results,就是全局result;
   儘可能少用全局result — 只有在多個Action都具備某個通用性質的result時,才考慮使用全局result;

  動態結果:     在定義物理視圖資源時,能夠直接使用OGNL表達式,因此這個物理視圖資源能夠動態的改變;     動態方法調用(DMI Dyna Method Invocation)     用處不是特別大,大體瞭解就行    功能:能夠在提交請求時,直接提交給Action的指定方法;     就在頁面上指定請求地址爲:action名字!方法名     - 代表將請求提交給指定Action的指定方法處理

相關文章
相關標籤/搜索