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>
- 測試第一個超連結
- 測試第二個超連結
- 測試第三個超連結
- 測試第四個超連結
- 測試第五個超連結
- 測試第六個超連結
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>
- 如果沒有為action指定class,預設是ActionSupport。
- 如果沒有為action指定method,預設執行action中的execute() 方法。ActionSupport的execute方法裡面就一句話return “success”;
- 如果沒有指定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>