1. 程式人生 > >[Struts2] 配置檔案struts.xml和web.xml詳解

[Struts2] 配置檔案struts.xml和web.xml詳解

 配置檔案struts.xml和web.xml。

其實要使Struts2可以工作,配置很簡單,套模板就好了。而且基本與版本無關。

如,只要struts2需要的基本jar包已經引入,那麼直接配置一下web.xml和struts.xml檔案。

web.xml中包含:

<filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
此處web.xml的簡單載入struts2核心驅動(過濾器),沒有其它配置。
然後新增一個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="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.i18n.reload" value="true" />
    <constant name="struts.configuration.xml.reload" value="true" ></constant>
-->
    <package name="main" namespace="/" extends="struts-default">
<!--//異常配置
        <default-action-ref name="index" />

        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>

        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>
        </global-exception-mappings>  -->
    </package>
	
</struts>
只要滿足以上格式即可。

好了,現在具體來說一說xml檔案的配置項具體含義。

首先,web.xml

<filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
定義filter,此處載入struts2過濾器。
<filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>
定義web伺服器通知項,即,符合“/*”的URL請求都交給命名為“struts2”的過濾器(即,org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter)處理。

web.xml配置以上兩個屬性節點就可以載入struts2框架了。

然後,struts.xml,這個配置項比較多。

形如:<constant name="" value=""/>

<constantname="struts.i18n.reload"value="true"/> 

配置是否在每次HTTP請求到達時都重新載入資原始檔,看到“i18n”我以為是編碼或者國際化配置呢,預設為false,生產階段也就需要false。設定為true之後,web伺服器(tomcat)會快取,啟動是會丟擲“couldn't clear tomcat cache”。

<constantname="struts.devMode"value="true"/> 

開發階段配置,在web伺服器出錯時會盡量打印出來,一樣也是生產階段設定為false,避免後臺結構被人發現。

<constant name="struts.configuration.xml.reload"value="true"/>

 配置檔案修改後是否自動重新部署到伺服器,開發階段需要設定為true,否則需要不時重啟伺服器。
<constantname="struts.custom.i18n.resources"value="globalMessages"/>

 載入國際化配置檔案,多個配置檔案則用“,”隔開。
<constantname="struts.action.extension"value="action,,"/>

 預設請求字尾,多個使用","隔開。
<constant name="struts.i18n.encoding" value="UTF-8" />

指定Web應用的預設編碼集,相當於呼叫 HttpServletRequest的setCharacterEncoding方法。
<constant name="struts.serve.static.browserCache " value="true" /> 

設定瀏覽器是否快取靜態內容,預設值為true(生產環境下使用),開發階段最好關閉,方便除錯。
<constant name="struts.configuration" value="org.apache.struts2.config.DefaultConfiguration"/> 

指定載入struts2配置檔案管理器,預設為org.apache.struts2.config.DefaultConfiguration,開發者可以自定義配置檔案管理器,該類要實現Configuration介面,可以自動載入struts2配置檔案。
<constant name="struts.enable.SlashesInActionNames" value="false"/> 

該屬性設定Struts 2是否允許在Action名中使用斜線,該屬性的預設值是false。如果開發者希望允許在Action名中使用斜線,則可設定該屬性為true,儘可能不配置這個,很麻煩。
<constant name="struts.ui.theme" value="xhtml"/> 

該屬性指定檢視標籤預設的檢視主題,該屬性的預設值是xhtml,可以為simple,xhtml或ajax。
<constant name="struts.ui.templateDir" value="template"/> 

該屬性指定檢視主題所需要模板檔案的位置,該屬性的預設值是template,即預設載入template路徑下的模板檔案。
<constant name="struts.ui.templateSuffix" value="ftl"/> 

該屬性指定模板檔案的字尾,該屬性的預設屬性值是ftl。該屬性還允許使用ftl、vm或jsp,分別對應FreeMarker、 Velocity和JSP模板,模板使用即可,一本就是ftl字尾,沒有什麼影響。
<constant name="struts.url.http.port" value="80"/> 

該屬性指定Web應用所在的監聽埠。該屬性通常沒有太大的用處,只是當Struts 2需要生成URL時(例如Url標籤),該屬性才提供Web應用的預設埠,此處的埠和web伺服器的埠不一樣,但是不衝突,不在同一級別,不用擔心,後臺服務太多可以這樣配置,但是不是叢集大概也用不到了。
<constant name="struts.url.includeParams" value="none|get|all"/> 

該屬性指定Struts 2生成URL時是否包含請求引數。該屬性接受none、get和all三個屬性值,分別對應於不包含、僅包含GET型別請求引數和包含全部請求引數。
<constant name="struts.dispatcher.parametersWorkaround" value="false"/> 

對於某些Java EE伺服器,不支援HttpServlet Request呼叫getParameterMap()方法,此時可以設定該屬性值為true來解決該問題。該屬性的預設值是false。對於 WebLogic、Orion和OC4J伺服器,通常應該設定該屬性為true。
<constant name="struts.locale" value="zh_CN"/> 

預設的國際化地區資訊。
<constant name="struts.multipart.maxSize" value="2097152"/> 

multipart請求資訊的最大尺寸(檔案上傳用,該屬性指定Struts 2檔案上傳中整個請求內容允許的最大位元組數)。
<constant name="struts.multipart.parser" value="cos"/> 

該屬性指定處理 MIME-type multipart/form-data,檔案上傳(cos、pell、jakarta)專為multipart請求資訊使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器介面(檔案上傳用)。
<constantname="struts.convention.result.path"value="/"/> 

定義檢視資源的根目錄
<constantname="struts.configuration.xml.reload"value="true"/>

此配置之後,所有訪問都需要全路徑。


大概就是以上的簡單配置,哇,太多了。還有一些可能到網站關閉那天也用不到的配置,就沒有列出來了。

然後,

在Struts2框架中是通過包來管理action、result、interceptorinterceptor-stack等配置資訊的。

<package name="" namespace="" extends="">
</package>

name: package的標示符,唯一標記一個package。

namespace:名稱空間,影響訪問的action請求路徑,如namespace="/user",package下有login,register等action,那麼訪問login時需要/user/login來訪問。

Struts2中如果沒有為某個包指定名稱空間,該包使用預設的名稱空間,預設的名稱空間總是""。

extends:繼承,需要繼承struts的struts-default。當一個包通過配置extends屬性繼承了另一個包的時候,該包將會繼承父包中所有的配置,包括action、result、interceptor等。

由於包資訊的獲取是按照配置檔案的先後順序進行的,所以父包必須在子包之前被定義。

還有一個abstract屬性,用於宣告package屬性為抽象包,然後其它package繼承此package即可。

<action name="" method="" class="">
<result name="" type=""></result>
</action>

action:

name: 請求名稱,加上namespace就是請求路徑。

method: 接到請求後執行的方法,預設執行execute(此處表示沒有method屬性)。

class: 處理方法所在的類,預設為Action(如果沒有配置此屬性)。

還有一個不常用的屬性,converter,Action的型別轉換器。

result:

name: Action返回結果,預設為SUCCESS("success").

type: 返回的型別,預設為dispatcher。

action中可以使用萬用字元。

請求萬用字元和返回結果均可使用,如,

<action name="user_*_*" method="user{2}" class="com.gopain.{1}">
<result name="type_{2}">/{2}_page.jsp</result>
</action>

假如請求為,user_UserAction_login(不考慮namespace),其中 action中{1} 為UserAction,{2}為login,此請求會執行com.gopain.UserAction$userlogin().如果返回值為”type_login“,則會跳轉到login_page.jsp頁面。

此處只是舉例,站點不宜這樣配置請求。但是對於action的name配置很實用,不要奢望一個action配置完整個站點(雖然也可以實現,而且對於訪問沒有太多影響),十分不利於管理。

再列幾個常用配置:

<default-action-ref name="index"/> 
當我們在配置Action的時候,如果沒有為某個Action指定具體的class值時,系統將自動引用<default-class-ref>標籤中所指定的類。在Struts2框架中,系統預設的class為ActionSupport,該配置我們可以在xwork的核心包下的xwork-default.xml檔案中找到。
<default-action-ref>

如果在請求一個沒有定義過的Action資源時,系統就會丟擲404錯誤。這種錯誤不可避免,但這樣的頁面並不友好。我們可以使用<default-action-ref>來指定一個預設的Action,如果系統沒有找到指定的Action,就會指定來呼叫這個預設的Action。

<default-interceptor-ref>

該標籤用來設定整個包範圍內所有Action所要應用的預設攔截器資訊。事實上我們的包繼承了struts-default包以後,使用的是Struts的預設設定。我們可以在struts-default.xml中找到相關配置:
<default-interceptor-refname="defaultStack"/>

在實際開發過程中,如果我們有特殊的需求是可以改變預設攔截器配置的。當時一旦更改這個配置,“defaultStack”將不再被引用,需要手動追加。

具體配置項很多,用到再追加也可以。