一、Struts2 所有配置加載順序
1.在web.xml中配置了StrutsPrpareAndExecuteFilter過濾器。
過濾器的作用就是初始化Struts2。
2.過濾器會自動加載配置檔案,配置檔案的加載順序:
struts-default.xml
定義了Struts需要的Bean,以及攔截器、resultType類型等。
struts-plugin.xml
struts.xml
使用者自定義的配置檔案。配置action以及攔截器等
struts.properties
使用者自定義的配置檔案(不必須)。
配置的參數會覆寫defualt.properties中的常量。
二、web.xml配置
2.1 web.xml (配置struts核心過濾器)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 引入struts核心過濾器 -->
<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>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
2.2 struts2的啟動的原因
在web.xml配置strutsPrepareAndExecuteFilter過濾器。
該過濾器的作用:
1.伺服器啟動時,會自動初始化過濾器。
初始化struts2的架構。
2.攔截使用者請求。執行struts内置的action執行鍊。
三、struts.xml 配置
1.struts.xml 主要用于配置action.
2.該配置檔案放在demo/src/struts.xml 目錄。
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="user" extends="struts-default" namespace="/">
<action name="login" class="cn.itcast.b_execute.UserAction" method="login">
<result name="login">/index.jsp</result>
</action>
</package>
</struts>
3.1 配置解析
package節點 定義一個包。
包作用:管理action。(通常,一個業務模闆用一個包)
name 包的名字; 包名不能重複;
extends 目前包繼承自哪個包
在struts中,包一定要繼承struts-default
struts-default在struts-default.xml中定的包
abstract=true
表示目前包為抽象包。抽象包中不能定義action,隻能被繼承使用。
如:
<package name="basePackage" extends="struts-default" abstract="true"></package>
<package name="user" extends="basePackage">
namespace 名稱空間,預設為"/"
作為路徑的一部分
通路路徑= http://localhost:8080/項目/名稱空間/ActionName
action節點 配置請求路徑與Action類的映射關系
name 請求路徑名稱
class 請求處理的aciton類的全名。
預設值為struts-default.xml中指定的類。
method 請求處理方法。
預設值=execute。
該方法預設傳回值為success。
result節點
name 跳轉标記,action處理方法的傳回值。
type 跳轉的結果類型。 該值得類型在struts-default.xml中已經設定。
預設值為redirect。
标簽體 标簽體中指定跳轉的頁面
3.2 package節點
3.2.1 package節點的作用
1. package包的作用管理action。
2. package包的name名稱不能重複。
3. 抽象的package包作用:主要用于指定自定義的攔截器、攔截器鍊。
讓其他package來繼承使用。
3.2.2 package節點的抽象
1.抽象包的作用:
我們可以自定義抽象的package節點,來定義自己的攔截器、攔截器棧等。
自定義抽象的package節點可以供其他package節點來繼承,使用自定義的攔截器棧等,
2.抽象包中不能有action的定義,否則運作時期報錯
3.2.3 package節點的繼承
1.使用者自定義的struts.xml的package節點必須直接或間接的繼承struts-default.xml中
定義的name為struts-default的package節點。
否則會報錯。
2.package節點繼承的作用
package包繼承的作用
struts-default.xml是struts的核心檔案。
該配置檔案中的package包定義了struts内置的攔截器、攔截器鍊等。這是struts的核心功能。
是以struts要求,使用者自定義的package包必須繼承 struts-default.xml配置檔案中的package包。
如果不繼承,就會報錯。
案例:package節點的繼承
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 自定義抽象的package節點,作用:自定義攔截器、攔截器棧,給别人繼承來使用 -->
<package name="myPackage" extends="struts-default" abstract="true">
<interceptors>
<interceptor-stack name="test">
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
</package>
<!-- 繼承自己定義的抽象的package包 -->
<package name="xxxx1" extends="myPackage">
<action name="hello" class="org.jsoft.action.HelloAction" method="hello">
<result name="success">/s.jsp</result>
</action>
</package>
</struts>
3.3 配置namespace,實作請求路徑分層
1.package節點的namespace預設為/
2.請求的路徑分層
+++ 在servlet中,通路路徑= http://localhost:8080/項目/url-pattern
實作請求路徑的分層,隻需設定url-pattern即可。
eg:
url-pattern: /test/hello
通路路徑: http://localhost:8080/demo/test/hello
+++ 在struts中,通路路徑= http://localhost:8080/項目/名稱空間/ActionName
實作請求路徑的分層,隻需設定namespace即可。
3.3.1 案例1
通路hello資源,請求路徑為
http://localhost:8080/demo/hello
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--
namespace 名稱空間,預設為"/"
作為路徑的一部分
通路路徑= http://localhost:8080/項目/名稱空間/ActionName
-->
<package name="xxxx1" extends="struts-default" namespace="/">
<action name="hello" class="org.jsoft.action.HelloAction" method="hello">
<result name="success">/s.jsp</result>
</action>
</package>
</struts>
3.3.2 案例2
通路hello資源,請求路徑為
http://localhost:8080/demo/nn/mm/hello
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--
namespace 名稱空間,預設為"/"
作為路徑的一部分
通路路徑= http://localhost:8080/項目/名稱空間/ActionName
-->
<package name="xxxx1" extends="struts-default" namespace="/nn/mm">
<action name="hello" class="org.jsoft.action.HelloAction" method="hello">
<result name="success">/s.jsp</result>
</action>
</package>
</struts>
3.4 配置多配置檔案
使用struts.xml引入不同包下的xml配置檔案。
3.4.1 總配置檔案 struts.xml(demo/src/struts.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 總配置檔案,引入其他所有的配置檔案 -->
<include file="/org/jsoft/action/Hello.xml"></include>
<include file="/org/jsoft/demo/demo.xml"></include>
</struts>
3.4.2 配置檔案 hello.xml(demo/src/org/jsoft/hello/hello.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--
namespace 名稱空間,預設為"/"
作為路徑的一部分
通路路徑= http://localhost:8080/項目/名稱空間/ActionName
-->
<package name="xxxx1" extends="struts-default" namespace="/">
<action name="hello" class="org.jsoft.action.HelloAction" method="hello">
<result name="success">/s.jsp</result>
</action>
</package>
</struts>
3.4.2 配置檔案 demo.xml(demo/src/org/jsoft/demo/demo.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--
namespace 名稱空間,預設為"/"
作為路徑的一部分
通路路徑= http://localhost:8080/項目/名稱空間/ActionName
-->
<package name="xxxx2" extends="struts-default" namespace="/">
<action name="demo" class="org.jsoft.demo.DemoAction" method="hello">
<result name="success">/s.jsp</result>
</action>
</package>
</struts>
3.5 配置Action,實作請求路徑與Action的映射
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="upload" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="redirect">/upload.jsp</result>
</action>
</package>
</struts>
+++ action 标簽:配置請求路徑與action的映射。
name:請求路徑名稱,可以重複
class:action處理類。預設值在sttuts-default.xml中已經指定。
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
method:acton處理類中的處理方法。預設值為exectue()方法。
該方法預設傳回 success
+++ result 标簽: 配置方法傳回标記與跳轉路徑的映射。
name:傳回标記。
type:redircet 請求重定向(預設)
dispatcher 轉發
3.5.1 Action 配置的作用
設定請求路徑與action的映射關系。
過濾器接受請求,過濾器根據請求路徑找到對應的action。
3.5.2 result-type 配置
result-type的預設值為dispatcher (轉發)
1.重定向upload.jsp
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="upload" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="redirect">/upload.jsp</result>
</action>
</package>
2.轉發upload.jsp
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="upload" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="dispatcher">/upload.jsp</result>
</action>
</package>
3.重定向到action
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="helloAction" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="redirectAction">helloAction</result>
</action>
<action name="upload" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="redirectAction">helloAction</result>
</action>
</package>
3.6 配置常量,修改struts預設屬性
struts2的常量一般都是在default.xml中以及配置好了。
如果想要修改常量值,就需要在struts.xml中自行配置。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--
struts.i18n.encoding=UTF-8
struts.multipart.maxSize=2097152
struts.action.extension=action,,
struts.enable.DynamicMethodInvocation = true
struts.url.http.port = 80
-->
<!-- 0.請求資料的編碼 。作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的輸出-->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!-- 1.限制檔案上傳的最大值 -->
<constant name="struts.multipart.maxSize" value="1000000"></constant>
<!-- 2.修改struts預設通路字尾名 -->
<constant name="struts.action.extension" value="hlp,,"></constant>
<!-- 3.動态方法調用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<!-- 4.修改xml自動重新加載 -->
<constant name="struts.configuration.xml.reload" value="true"></constant>
<!-- 5.設定浏覽器是否緩存靜态内容,預設值為true(生産環境下使用),開發階段最好關閉 -->
<constant name="struts.serve.static.browserCache" value="false"/>
<!--6.當struts的配置檔案修改後,系統是否自動重新加載該檔案,預設值為false(生産環境下使用),開發階段最好打開 -->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- 7.開發模式下使用,這樣可以列印出更詳細的錯誤資訊 -->
<constant name="struts.devMode" value="true" />
<!--8.與spring內建時,指定由spring負責action對象的建立 -->
<constant name="struts.objectFactory" value="spring" />
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="upload" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="redirect">/upload.jsp</result>
</action>
</package>
</struts>
3.6.1 修改Struts中通路字尾
+++ Struts中預設通路字尾
Struts1 中預設通路字尾是 *.do
Struts2 中預設通路字尾是 *.action
通路字尾的作用:通路的url路徑字尾名可加可不加,action的配置不變
+++ 修改Struts的通路字尾(在struts.xml中通過常量修改)
<constant name="struts.action.extension" value="hlp,do,"></constant>
指定通路字尾為hlp
value="hlp,do," 通路字尾是hlp/do/不帶字尾
value="hlp,do" 通路字尾隻能是hlp或do
value="hlp" 通路字尾隻能是hlp
例子
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--
namespace 名稱空間,預設為"/"
作為路徑的一部分
通路路徑= http://localhost:8080/項目/名稱空間/ActionName
-->
<package name="xxxx1" namespace="/user" extends="struts-default" >
<action name="login" class="org.jsoft.action.HelloAction" method="login">
<result name="login">/login.jsp</result>
</action>
</package>
</struts>
通路測試:
通路測試:
localhost:8080/demo/user/login 成功
localhost:8080/demo/user/login.action 成功
url路徑測試
<!-- 不加字尾通路 -->
<a href="./user/login">login</a> 成功
<!-- 加字尾通路 -->
<a href="./user/login.action">login</a> 成功
案例2
struts.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 2.修改struts動态方法調用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="upload" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="redirect">/upload.jsp</result>
</action>
</package>
</struts>
通路:
展示效果:
通路 localhost:8080/demo/upload
通路 localhost:8080/demo/uploa.hlp
兩種方式一緻。
展示效果:
<a href="./upload"> 下載下傳</a>
<a href="./upload.hlp"> 下載下傳</a>
兩種方式一緻。
3.6.2 開啟動态加載
1.在struts.xml中開啟動态方法調用,配置action時,不用指定方法
<!-- 開啟動态方法調用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="xxxx1" namespace="/" extends="struts-default" >
<action name="login" class="org.jsoft.action.HelloAction" method="login">
<result name="login">/login.jsp</result>
</action>
</package>
2.通路action時,路徑寫法
localhost:8080/demo/login!test
會調用login對應action類的test方法。
注意:動态方法調用,有點雞肋。不建議使用。有時候不滿足于場景。
比如:在前端使用動态方法傳參時無法傳參。
<a href="./emoAciton!list?name=12"></a> 這種寫法是錯誤的。
案例
struts.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 3.動态方法調用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="hello" class="org.jsoft.mrp.HelloAction" >
<result type="success">/index.jsp</result>
</action>
</package>
</struts>
HelloAction.java
public class HelloAction extends ActionSupport {
public String login() {
return "success";
}
public String register() {
return "success";
}
}
示例
展示效果:
通路 localhost:8080/demo/hello!login
調用helloAction的login方法
通路 localhost:8080/demo/register
調用helloAction的register方法
展示效果:
<a href="./hello!login"> 登入</a>
<a href="./hello!register"> 注冊</a>
3.6.3 設定擷取請求參數的編碼
該配置隻對post請求有效,如果get請求,則依舊亂碼。
原因:該配置實質上是req.setCharacterEncoding("UTE-8")。
它僅僅是設定了post請求的編碼内容。
<!-- 0.請求資料的編碼 。作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的輸出-->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
3.7 配置通配符,實作通配符映射
在struts中配置action資訊時,可以用*與{1}優化配置
3.7.1 多個路徑通路同一個Action的同一個方法 – 例子1
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx1" extends="struts-default" namespace="/">
<action name="user_*" class="org.jsoft.action.HelloAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
localhost:8080/demo/user_login , 會通路HelloAction的login方法。
localhost:8080/demo/user_test, 會通路HelloAction的test方法。
3.7.2 不同的路徑執行不同Action的相同方法 – 例子2
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx1" extends="struts-default" namespace="/">
<action name="user_*" class="org.jsoft.action.HelloAction" method="{1}">
<result name="success">/{1}.jsp</result>
</action>
</package>
</struts>
localhost:8080/demo/user_login , 會通路HelloAction的login方法。
通路成功跳轉到login.jsp
localhost:8080/demo/user_test, 會通路HelloAction的test方法。
通路成功跳轉到test.jsp
3.7.3 例子3
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx1" extends="struts-default" namespace="/">
<action name="user_*_*" class="org.jsoft.action.HelloAction" method="{2}">
<result name="{2}">/{2}.jsp</result>
</action>
</package>
</struts>
localhost:8080/demo/user_login_test , 會通路HelloAction的test方法。
通路成功跳轉到test.jsp
localhost:8080/demo/user_test_hello, 會通路HelloAction的hello方法。
通路成功跳轉到hello.jsp
3.8 配置全局跳轉視圖
1.在struts.xml中配置全局跳轉視圖。
<package name="xxxx1" extends="struts-default" namespace="/" >
<!-- 配置全局跳轉視圖 -->
<global-results>
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</global-results>
<!-- 配置action -->
<action name="login" class="org.jsoft.action.HelloAction" method="login">
<result name="login">/login.jsp</result>
</action>
</package>
2. 使用者通路action傳回結果标記。
首先會在action中查找對應的結果标記,沒有找到。
然後在設定的全局跳轉視圖中查找結果标記
例子:
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx1" extends="struts-default" namespace="/" >
<!-- 配置全局跳轉視圖 -->
<global-results>
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</global-results>
<!-- 配置action -->
<action name="login" class="org.jsoft.action.HelloAction" method="login">
<result name="login">/login.jsp</result>
</action>
</package>
</struts>
浏覽器
通路路徑: localhost:8080/demo/login
調用login對應的action中的method方法,方法傳回結果标記。
--> 首先在action配置中result中查找是否有比對的标記。
--> 如果沒有找到,然後在配置的全局跳轉視圖中查找。
3.9 配置全局異常處理
配置的全局異常結果标記隻會到全局視圖中查找。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx" extends="struts-default">
<!-- 全局視圖 -->
<global-results>
<result name="success">/index.jsp</result>
<result name="err1">/error/err1.jsp</result>
<result name="null">/error/null.jsp</result>
</global-results>
<!-- 全局異常:會到全局視圖中查過标記對應的頁面 -->
<global-exception-mappings>
<exception-mapping result="null" exception="java.lang.NullPointerException"></exception-mapping>
<exception-mapping result="err1" exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>
<!-- action執行個體交給spring建立 -->
<action name="emp_*" class="empAction" method="{1}">
<result name="list">/index.jsp</result>
</action>
</package>
</struts>
3.9 Struts2 特殊的路徑比對規則
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx1" namespace="/user" extends="struts-default" >
<action name="login" class="org.jsoft.action.HelloAction" method="login">
<result name="login">/login.jsp</result>
</action>
</package>
</struts>
+++ 測試
通路路徑: localhost:8080/demo/user/login 成功
通路路徑: localhost:8080/demo/user/a/b/c/login 成功
+++ 通路路徑: localhost:8080/demo/user/a/b/c/login 成功的原因分析?
Tomcat首先會檢視截取url路徑。
localhost 找到通路的機器
8080 找到通路的端口号
demo 找到通路的項目
/user/a/b/c 找到對象的名稱空間,沒有找到,繼續向下。
/user/a/b 找到對象的名稱空間,沒有找到,繼續向下。
/user/a 找到對象的名稱空間,沒有找到,繼續向下。
/user 找到對象的名稱空間,沒有找到,繼續向下。
/ 找到對象的名稱空間,
沒有找到,報錯。
找到了對應的名稱空間,然後查找name為login的action。
3.10 配置空Action
+++ 配置空Action:
<action name="test">
<result name="success" type="forward">/WEB-INF/index.jsp</result>
</action>
浏覽器通路 localhost:8080/demo/test。
它會直接通路name名稱為test的action,
由于class沒有配置,它會比對預設的class,即struts-default.xml中指定的class。
由于method沒有配置,是以他會執行指定class中的execute()方法。該方法預設傳回success結果标記。
+++ 空Action的作用:
WEB-INF下的目錄是安全目錄,即該目錄下的資源不能直接通路。
在Servlet中,我們必須通過前端頁面跳轉到Servlet,
再由Servlet轉發到WEB-INF下的資源。
在struts中,我們必須通過前端頁面跳轉到action,
再由action轉發到WEB-INF下的資源。
是以這時,我們使用這個空配置action,負責轉發,跳轉到WEB-INF下資源。
+++ 空Action的原理:
<action name="test">
<result name="success" type="forward">/WEB-INF/index.jsp</result>
</action>
class預設值在struts-defualt.xml中已經指定,
method預設值是execute。該方法預設傳回success。
是以可以直接跳轉到所指定的index.jsp.
+++ WEB-INF 安全目錄
在web開發中,為了資源的安全性,
浏覽器跳轉(重定向)是無法通路WEB-INF下面的資源。
隻有伺服器跳轉(轉發)才能通路到WEB-INF下面的資源。
3.11 Struts2 配置各項的預設值
<package name="xxxx1" namespace="/user" extends="struts-default" ></package>
1.package節點的name名稱不能為空。不能重複。
2.package節點的namespace預設為 /。
3.package節點必須繼承struts-default。
<action name="test"></action>
1.name:配置請求的資源名稱
2.class:預設值在struts-defult.xml中已經配置了。
===》struts-defult.xml:<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
3.method:預設值為execute()方法,
該方法預設傳回 success
例子:action空配置的執行流程
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx1" extends="struts-default" namespace="/" >
<!-- 配置全局跳轉視圖 -->
<global-results>
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</global-results>
<action name="test"></action>
</package>
</struts>
通路:
浏覽器通路 http://localhost:8080/struts/test
會自動跳轉到seccess.jsp。
例子:action空配置的作用
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="test">
<result name="success" type="forward">/WEB-INF/index.jsp</result>
</action>
</package>
</struts>
前台頁面通路test,然後直接跳轉到WEB-INF/index.jsp
3.12 resultType 資源跳轉
3.12.1 resultType 所有類型
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
</result-types>
3.12.2 轉發(resultType預設值)
轉發upload.jsp
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="upload" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="dispatcher">/upload.jsp</result>
</action>
</package>
轉發WEB-INF/upload.jsp
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="upload" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="dispatcher">/WEB-INF/upload.jsp</result>
</action>
</package>
3.12.3 重定向
重定向upload.jsp
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="upload" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="redirect">/upload.jsp</result>
</action>
</package>
重定向/WEB-INF/upload.jsp
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="upload" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="redirect">/WEB-INF/upload.jsp</result>
</action>
</package>
3.12.4 重定向到Action
切記:
跳轉的路徑不用加 /
即:
<action name="upload" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="redirectAction">helloAction</result>
</action>
3.重定向到action
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="helloAction" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="redirectAction">helloAction</result>
</action>
<action name="upload" class="org.jsoft.mrp.FileUploadAction" method="upload">
<result name="success" type="redirectAction">helloAction</result>
</action>
</package>
四、struts.properties 配置
4.1 struts.properties 配置檔案的作用
1.該配置檔案是不必須的。
2.用于定義使用者所需的常量。
3.用于定義struts内置的常量。
在此檔案定義的常量會覆寫struts.xml中配置的常量。
4.該配置檔案放在 demo/src/struts.properties 目錄。
4.2 struts.properties 配置檔案中定義的常量會覆寫struts.xml中配置的常量的原因?
1.struts2中配置檔案執行加載順序是
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties 4
2.由于struts.properties 是最後加載的。
是以在此檔案定義的常量會覆寫在struts.xml 中定義的常量。
4.3 struts.properties 配置
struts.action.extension=hh