1. 程式人生 > >Struts2基本配置

Struts2基本配置

訪問HelloWorld應用的路徑的設定

HelloWorldAction檔案:

package cn.itcast.primer;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{

    public String execute() throws Exception {
        System.out.println("HelloWorldAction ************* execute()");
        return
"success"; } }

struts.xml

 <package name="primer" namespace="/primer"   extends="struts-default">
      <action name="helloWorldAction" class="cn.itcast.primer.HelloWorldAction">
        <result name="success" type="dispatcher">/primer/success.jsp</result>
      </action
>
</package>

在struts2中,訪問struts2中action的URL路徑由兩部份組成:
包的名稱空間+action的名稱
例如: 訪問本例子HelloWorldAction的URL路徑為: /primer/helloWorldAction.action (注意:完整路徑為:http://localhost:埠/內容路徑/primer/helloWorldAction.action)。另外我們也可以加上.action字尾訪問此Action。

 <package name="primer" namespace=“/primer“   extends="struts-default">
      <action name="helloWorldAction" class="cn.itcast.primer.HelloWorldAction">
        <result name="success" type="dispatcher">/success.jsp</result>
      </action>
 </package>

指定多個struts配置檔案

在大部分應用裡,隨著應用規模的增加,系統中Action的數量也會大量增加,導致struts.xml配置檔案變得非常臃腫。為了避免struts.xml檔案過於龐大、臃腫,提高struts.xml檔案的可讀性,我們可以將一個struts.xml配置檔案分解成多個配置檔案,然後在struts.xml檔案中包含其他配置檔案。下面的struts.xml通過元素指定多個配置檔案:

<struts>
    <include file="struts-user.xml"/>
    <include file="struts-order.xml"/>
</struts>

通過這種方式,我們就可以將Struts 2的Action按模組新增在多個配置檔案中。

struts.xml檔案配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

    <!-- 引入自定義配置檔案 -->
    <include file="cn/itcast/primer/struts_primer.xml"></include>

</struts>

自定義配置檔案struts_primer.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
        <!-- /primer/helloWorldAction.action
        package:包
            * name:包名,唯一的,必選項
            * namespace:名稱空間,唯一的,相當於房間號。可選項,省略情況下是"/"。頁面中請求連線的前半部分
            * extends:繼承
                * extends="struts-default":struts2框架底層提供的核心包struts2-core-2.3.3.jar下的struts-default.xml檔案
                * 為什麼要繼承這個struts-default.xml檔案?
                    * 因為struts2框架底層提供的struts-default.xml聲明瞭所有的攔截器和攔截器棧,
                         知道在struts2框架執行時執行struts-default.xml檔案中的攔截器棧。
                    * 如果不繼承struts-default.xml檔案,就沒有辦法使用struts2框架提供的所有攔截器
     -->

    <package name="primer" namespace="/primer" extends="struts-default">
        <!-- 
            如果找不到對應的action名的時候,配置預設要執行的action 
                * name:指定action的名稱
        -->
        <default-action-ref name="helloWorldAction"></default-action-ref>


        <!-- 
            action:
                * name:對應頁面中請求連線的後面半部分
                * class:對應要執行的類的完整路徑
         -->


         <action name="helloWorldAction" class="cn.itcast.primer.HelloWorldAction">
             <!-- 
                result:結果型別
                    * name:對應的是執行的類的方法的返回值
                        public String execute() throws Exception {
                            System.out.println("HelloWorldAction ************* execute()");
                            return "success";
                        }
                    * 後半部分的文字內容:要轉向到的頁面
             -->
            <result name="success">/primer/success.jsp</result>
        </action>

        <!-- 
            沒有為action指定class
                * 在struts2框架底層的struts-default.xml檔案中,配置了預設執行的類
                    com.opensymphony.xwork2.ActionSupport
                        public String execute() throws Exception {
                            return SUCCESS;
                        }
                * 實際上,預設執行的是底層提供的ActionSupport類的execute()方法
                * result結果型別,預設是根據struts2框架底層提供的ActionSupport類的execute()方法返回值,進行跳轉
         -->
        <action name="actionNoClass">
            <result name="success">/primer/success.jsp</result>
        </action>

    </package>

</struts>

自定義配置檔案需要放置在對應的包內,如圖所示:
這裡寫圖片描述
struts.xml檔案配置中還需要引入自定義配置檔案

Action名稱的搜尋順序

test.jsp檔案:

<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags"   prefix="s"%>
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
    </head>
  <body>
       入門的路徑:<br>  
      <a href="${pageContext.request.contextPath}/primer/helloWorldAction.action">helloWorld</a><br>


       測試Action名稱的搜尋順序:<br>
        <a href="${pageContext.request.contextPath}/primer/primer/aaa/primer/helloWorldAction.action">helloWorld</a><br>
        <a href="${pageContext.request.contextPath}/primer/primer/helloWorldAction.action">helloWorld</a><br>
        <a href="${pageContext.request.contextPath}/primer/helloWorldAction.action">helloWorld</a><br>

        沒有為action指定class<br>
           <a href="${pageContext.request.contextPath}/primer/actionNoClass.action">helloWorld</a><br>


      測試struts2 輸出沒有名稱空間helloworld:<br>
        <a href="${pageContext.request.contextPath}/primer/userAction.action">helloWorld</a><br>






  </body>
</html>

這裡寫圖片描述

  1. 測試第一個超連結
    這裡寫圖片描述
  2. 測試第二個超連結
    這裡寫圖片描述
  3. 測試第三個超連結
    這裡寫圖片描述
  4. 測試第四個超連結
    這裡寫圖片描述
  5. 測試第五個超連結
    這裡寫圖片描述
  6. 測試第六個超連結
    這裡寫圖片描述

2.首先尋找namespace為/path1/path2/path3的package,
如果存在這個package,則在這個package中尋找名字為test的action,
如果不存在這個package則轉步驟3;

3.尋找namespace為/path1/path2的package,
如果存在這個package,則在這個package中尋找名字為test的action,
如果不存在這個package,則轉步驟4;

4.尋找namespace為/path1的package,
如果存在這個package,則在這個package中尋找名字為test的action,
如果仍然不存在這個package,就去預設的namaspace的package下面去找名
字為test的action(預設的名稱空間為空字串“/” ),
如果還是找不到,頁面提示找不到action。

Action配置中的各項預設值

問題如果沒有為action指定class,預設是com.opensymphony.xwork2.ActionSupport執行ActionSupport中的execute方法 ,由struts-default.xml檔案<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />決定

<package name="primer" namespace="/primer" extends="struts-default">

<!-- 
    沒有為action指定class
        * 在struts2框架底層的struts-default.xml檔案中,配置了預設執行的類
        com.opensymphony.xwork2.ActionSupport
        public String execute() throws Exception {
            return SUCCESS;
           }
    * 實際上,預設執行的是底層提供的ActionSupport類的execute()方法
    * result結果型別,預設是根據struts2框架底層提供的ActionSupport類的execute()方法返回值,進行跳轉
 -->
    <action name="actionNoClass">
        <result name="success">/primer/success.jsp</result>
    </action>
</package>
  1. 如果沒有為action指定class,預設是ActionSupport。
  2. 如果沒有為action指定method,預設執行action中的execute() 方法。ActionSupport的execute方法裡面就一句話return “success”;
  3. 如果沒有指定result的name屬性,預設值為success。
    問題:如果請求的路徑查詢不到action的情況下,程式執行會丟擲異常 ,可以通過配置當找不到action的情況下,會執行預設的action
<package name="primer" namespace="/primer" extends="struts-default">
<!-- 
    如果找不到對應的action名的時候,配置預設要執行的action 
        * name:指定action的名稱
-->
<default-action-ref name="helloWorldAction"></default-action-ref>

</package>

ActionSupport

ActionSupport類是預設的 Action 類. 在編寫 Action 類時, 通常會對這個類進行擴充套件

這裡寫圖片描述

Struts 2處理的請求字尾

StrutsPrepareAndExecuteFilter是Struts 2框架的核心控制器,它負責攔截由<url-pattern>/*</url-pattern>指定的所有使用者請求,當用戶請求到達時,該Filter會過濾使用者的請求。預設情況下,如果使用者請求的路徑不帶字尾或者字尾以.action結尾,這時請求將被轉入Struts 2框架處理,否則Struts 2框架將略過該請求的處理。

根據配置檔案:struts2-core-2.3.31.jar包下的 org.apache.struts2/default.properties檔案定義的常量決定
struts.action.extension=action,,
這裡寫圖片描述
這裡寫圖片描述

預設處理的字尾是可以通過常量”struts.action.extension“進行修改的,如下面配置Struts 2只處理以.do為字尾的請求路徑:

<struts>
    <constant name="struts.action.extension" value="do"/>
</struts>

struts.xml檔案:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 
        constant:配置常量
            * name:指定的是struts2框架底層提供的default.properties資原始檔中配置的"常量"
            * value:指定的是配置常量的值
            * 在struts.xml檔案中,配置的常量的值會覆蓋底層提供的default.properties資原始檔中配置的常量的值

        * 配置struts2框架的頁面中請求連線的字尾名,如果指定多個的話,用","隔開
        * 如果在struts.xml中和struts.properties資原始檔中同時進行配置,struts.properties的配置起作用
        * 因為常量可以在多個配置檔案中進行定義,所以我們需要了解下struts2載入常量的搜尋順序:
            1 struts-default.xml
            2 struts-plugin.xml
            3 struts.xml
            4 struts.properties(自己建立)
            5 web.xml
     -->
    <!-- <constant name="struts.action.extension" value="do,love"></constant> -->




    <!-- 引入自定義配置檔案 -->
    <include file="cn/itcast/primer/struts_primer.xml"></include>



</struts>

細說常量定義

常量可以在struts.xml或struts.properties中配置,建議在struts.xml中配置,兩種配置方式如下:
1.在struts.xml檔案中配置常量

<struts>
    <constant name="struts.action.extension" value="do"/>
</struts>

2.在struts.properties中配置常量, (struts.properties檔案放置在src下)

struts.action.extension=do

因為常量可以在多個配置檔案中進行定義,所以我們需要了解下struts2載入常量的搜尋順序:
1 struts-default.xml
2 struts-plugin.xml
3 struts.xml
4 struts.properties
5 web.xml
如果在多個檔案中配置了同一個常量,則後一個檔案中配置的常量值會覆蓋前面檔案中配置的常量值.

常用的常量介紹

  • 指定預設編碼集,作用於HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的輸出
    <constant name="struts.i18n.encoding" value="UTF-8"/>

  • 該屬性指定需要Struts 2處理的請求字尾,該屬性的預設值是action,即所有匹配*.action的請求都由Struts2處理。
    如果使用者需要指定多個請求字尾,則多個字尾之間以英文逗號(,)隔開 <constant name="struts.action.extension" value="do"/>

  • 設定瀏覽器是否快取靜態內容,預設值為true(生產環境下使用),開發階段最好關閉
    <constant name="struts.serve.static.browserCache" value="false"/>
  • 當struts的配置檔案修改後,系統是否自動重新載入該檔案,預設值為false(生產環境下使用),開發階段最好
    <constant name="struts.configuration.xml.reload" value="true"/>

  • 開發模式下使用,這樣可以打印出更詳細的錯誤
    <constant name="struts.devMode" value="true" />

  • 預設的檢視
    <constant name="struts.ui.theme" value="simple" />

  • 與spring整合時,指定由spring負責action物件的
    <constant name="struts.objectFactory" value="spring" />

  • 該屬性設定Struts 2是否支援動態方法呼叫,該屬性的預設值是true。如果需要關閉動態方法呼叫,則可設定該屬性為 false
    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>

  • 上傳檔案的大小限制
    <constant name="struts.multipart.maxSize" value=“10701096"/>

    struts.xml檔案配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 
        constant:配置常量
            * name:指定的是struts2框架底層提供的default.properties資原始檔中配置的"常量"
            * value:指定的是配置常量的值
            * 在struts.xml檔案中,配置的常量的值會覆蓋底層提供的default.properties資原始檔中配置的常量的值

        * 配置struts2框架的頁面中請求連線的字尾名,如果指定多個的話,用","隔開
        * 如果在struts.xml中和struts.properties資原始檔中同時進行配置,struts.properties的配置起作用
        * 因為常量可以在多個配置檔案中進行定義,所以我們需要了解下struts2載入常量的搜尋順序:
            1 struts-default.xml
            2 struts-plugin.xml
            3 struts.xml
            4 struts.properties(自己建立)
            5 web.xml
     -->
    <!-- <constant name="struts.action.extension" value="do,love"></constant> -->

    <!-- 配置國際化資原始檔修改時,是否重新載入。預設是false為不載入,true是載入 -->
    <!-- <constant name="struts.i18n.reload" value="true"></constant> -->

    <!-- 配置struts2框架的配置檔案修改時,是否重新載入。預設是false為不載入,true是載入 -->
    <!-- <constant name="struts.configuration.xml.reload" value="true"></constant> -->

    <!-- 
        配置struts2框架的模式
            * 預設值是false,是生產模式
            * true是開發模式,需要更多的除錯資訊
                ### includes:
                ### - struts.i18n.reload = true
                ### - struts.configuration.xml.reload = true
     -->
    <constant name="struts.devMode" value="true"></constant>

    <!-- 配置動態方法呼叫,設定成不開啟。預設是true是開啟狀態;false是不開啟狀態 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>

    <!-- 
        配置所有資原始檔,省略字尾名,如果配置多個資原始檔時,用","隔開。不僅是國際化資原始檔
        * 型別轉換器的錯誤提示資原始檔
     -->
    <constant name="struts.custom.i18n.resources" 
            value="cn.itcast.converter.converter,
                    cn.itcast.i18n.resources">
    </constant>

    <!-- 配置檔案上傳的總大小 -->
    <constant name="struts.multipart.maxSize" value="2097152000"></constant>

    <!-- 引入自定義配置檔案 -->
    <include file="cn/itcast/primer/struts_primer.xml"></include>


</struts>