天天看點

五、Struts2 配置檔案 -- 使用者配置檔案(二)

一、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