Struts基礎

Struts簡介及用處

Struts是MVC一種控制器,替代Servlet
Struts功能:
1.接收用戶請求
2.封裝請求參數
3.自動數據綁定:會把Action中的屬性自動傳到頁面
4.調用Model對請求進行處理
5.簡化web開發
6.對請求進行響應:
7.獲取session,appliction
頁面跳轉:
轉發  重定向
chain:轉發到Struts的某個方法
redirectAction:重定向到Struts的某個方法

執行流程:

Struts中的控制器分爲:
1.核心控制器:只需要配置
就是一個Filter:(在web.xml中配置) StrutsPrepareAndExecuteFilter
/*

<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>
請求首先進入核心控制器,加載Struts組件:
default.properties
struts-default.xml

struts.xml:

配置了url和業務控制器之間的映射關係

<?xml version="1.0" encoding="UTF-8"?>
<!-- 導入struts.dtd文件 
	dtd:xml標籤定義文件
-->
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<!-- constant:常量
		配置常量 -->
	<!-- 開啓開發者模式  -->
	<constant name="struts.devMode" value="true"></constant>
	<constant name="struts.action.extension" value="action,do,av,"></constant>
	<!-- 修改文件上傳最大長度 -->
	<constant name="struts.multipart.maxSize" value="99999999999"></constant>
	
	<package name="myinterceptors" extends="struts-default">
		<interceptors>
			<!-- 聲明攔截器 -->
			<interceptor name="sexenerger" class="myinterceptors.SexEnegerInterceptor"></interceptor>
			<!-- 聲明攔截器棧  -->
			<interceptor-stack name="mystack">
				<!-- 一個攔截器可以引用別的攔截器棧  -->
				<!-- 注意:自定義的攔截器棧首先引入defaultStack:
					繼承Struts功能
				 -->
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="sexenerger"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<!-- 通過配置默認攔截器棧來使用 -->
		<default-interceptor-ref name="mystack"></default-interceptor-ref>
	</package>
	
	<package name="loginInterceptor" extends="struts-default">
		<interceptors>
			<!-- 聲明攔截器 -->
			<interceptor name="loginLJ" 
				class="myinterceptors.LoginInterceptor">
				<!-- excludeMethods:放行的請求
					多個請求之間使用, 
					excludeMethods:放行的方法名
					-->
				<param name="excludeMethods">multiEXE,tologin,toregist,login,regist</param>	
			</interceptor>
			<!-- 聲明攔截器棧 -->
			<interceptor-stack name="mystack2">
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="loginLJ"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<!-- 指定默認攔截器  -->
		<default-interceptor-ref name="mystack2"></default-interceptor-ref>
		<!-- 配置全局視圖 -->
		<global-results>
			<result name="login">/WEB-INF/login.jsp</result>
		</global-results>
	</package>
    <!-- 配置了url和業務控制器之間的映射關係
		一個struts.xml中可以有多個package
		一個package就是一個邏輯分組
		注意package的name值不能重複
		一個package可以extends(擴展)別的package
		一般情況,extends="struts-default"
		namespace="/請求路徑":配置什麼樣的請求可以進入該package
		/:所有請求 
		/abc:/應用名/abc下的子請求
		/abc/avList.av
	 -->
	<package name="up" namespace="/user" extends="loginInterceptor">
	    <!-- action name:子請求路徑  -->
		<action name="to*" class="myaction.UserAction"
			method="to{1}">
			<!-- result name:Action方法的返回值:
				默認使用轉發 
				通過設置type屬性值,設置跳轉方式
			 -->
			<result>/WEB-INF/{1}.jsp</result>	
		</action>
		<action name="regist" class="myaction.UserAction"
			method="regist">
			<!-- <interceptor-ref name="mystack"></interceptor-ref> -->
			<result name="success">/WEB-INF/login.jsp</result>	
			<result name="error">/WEB-INF/regist.jsp</result>	
		</action>	
		<action name="login" class="myaction.UserAction"
			method="login">
			<result name="success" type="redirectAction">
				<param name="namespace">/user</param>
				<param name="actionName">tohelloNiTuo</param>
			</result>	
		</action>
	</package>
	
</struts>
2.業務控制器:
專門處理用戶請求的一個Java類,它就是一個普通的Java類
Struts建議繼承ActionSupport

執行流程:
---->核心控制器----->
加載struts組件:
default.properties
struts-default.xml
struts.xml(Struts主配置文件)
--->業務控制器

Struts與Servlet API解耦的訪問方式

注意:這種方式獲取返回值爲Map,只能進行put值和取值

第一步:提供了三個Map對象訪問request、session、application作用域
第二步通過ActionContext獲取三個Map對象
          Object get("request")
          Map getSession()
          Map getApplication()

struts2耦合的訪問 Servlet API的方式

通過ServletActionContext 可以直接訪問session applicaton,request作用域
HttpSession session =
                ServletActionContext.getRequest().getSession();
使用Struts取Session、application中的數據要指定Scope
${sessionScope}
${applicationScope}

Struts開發步驟

1.添加jar包,struts-blank lib下的所有jar
2.在web.xml中配置Struts核心控制器:
StrutsPrepareAndExecuteFilter
3.在src根目錄創建struts.xml(Struts的主配置文件):
配置了url和業務控制器之間的映射關係
4.編寫業務控制器:就是一個Java類
XXXAction
處理的請求的方法:
1.public 
2.無參
3.返回值只能是String

struts攔截器

struts-default.xml中配置了很多struts攔截器
interceptor 
例如:
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
一個攔截器對應一個功能,struts靠組合攔截器實現了各種複雜功能
攔截器組合:攔截器棧

一般情況,自定義的package
都extends="struts-default":
繼承struts攔截器,繼承了struts的功能
注意:
package的extends可以傳遞

struts的url:
package namespace+action的name

Struts的核心功能全部靠攔截器實現:
一個功能對應一個攔截器
攔截器:攔截請求,在進入Action之前攔截,return之後再攔截
自定義攔截器:
在進入某個Action之前或Action執行之後需要添加功能,以此擴展struts的功能
1.1繼承AbstractInterceptor:默認全攔截
重寫interceptor方法
1.2在struts.xml中配置攔截器
注意:一旦配了自定義攔截器,默認攔截器失效
2.繼承MethodFilterInterceptor
MethodFilterInterceptor是AbstractInterceptor子類
它可以指定攔截哪些方法:includeMethods
還可以指定不攔截哪些方法:excludeMethods
多個方法中間用,分隔

異常原因

No result defined for struts.xml action myaction.ActionDemo and result av
struts.xml action標籤中 未找到業務控制器返回值對應的result標籤

業務控制器方法返回值和頁面名之間的映射:
在struts.xml action標籤中添加result標籤

Struts如何向頁面傳值

在Action中
把要傳的數據添加爲Action的屬性
並且必須有get方法
數據的作用域相當於request

Struts跳轉技術

result標籤 type屬性值:
1.dispatcher:默認轉發頁面
2.redirect:重定向頁面
3.chain:轉發到Action
4.redirectAction:重定向到Action
5.stream:用於文件上傳

ValueStack:值棧

一個Action對象對應一個ValueStack,
ValueStack中存儲Action對象中的數據

Action的生命週期:

一次請求:
生:Struts核心控制器接收到請求後,通過加載struts.xml文件
確定需要實例化的Action對象
活:請求處理期間
死:請求處理完畢

Action如何接收請求參數:

1.有幾個請求參數就在Action中添加幾個屬性,並提供set/get方法

2.按請求參數名封裝出一個Java類
  在Action使用該類的對象做屬性
  注意:
  1.頁面的name="Action中的對象名.請求參數名"
  2.Struts會在接收請求時自動創建該對象

3.Action 實現 ModelDriven<T>接口
按請求參數名封裝出一個Java類
在Action使用該類的對象做屬性
注意:
1.頁面name屬性值無需改動
2.Action中必須手動new出該對象
3.getModel(){
	return 對象名;
}

總結:
使用Struts會自動進行類型轉化
類的屬性名一定要和請求參數名一致

chain:
<param name="namespace">要跳轉Action的namespace</param>
<param name="actionName">要跳轉Action的ActionName</param>

redirectAction:
<param name="namespace">要跳轉Action的namespace</param>
<param name="actionName">要跳轉Action的ActionName</param>
注意:
使用的是動態方法調用:
通過actionName定位到相應的方法

<action name="*" method="{1}">
	<result name="{1}">{1}.jsp</result>
</action>
*:通配符,表示任意字符
{n}:第幾個*對應的字符  n從1開頭


繼承ActionSupport的好處:
1.有默認調用的方法:
action標籤可以不指定調用方法
默認調用execute方法:
返回值:SUCCESS 
result標籤的name屬性默認值爲"success"

2.封裝了很多功能

Struts執行流程:

1.請求進入Struts核心控制器,StrutsPreparedAndExcecuteFilter
2.加載Struts組件:
default.properties   struts-default.xml
3.加載struts.xml:
url和Action之間的映射,確定請求去哪個Action的哪個方法進行處理
4.通過Action的方法的返回值查詢對應的result
5.根據result的type確定以何種方法進行跳轉
6.展示視圖

注意:多個package可以使用一個業務控制器(Action)
package就是一個邏輯分組

Struts ajax:

1.添加jackson.jar和struts-json-plugin.jar
2.struts.xml 中 package extends="json-default"
3.在Action類中添加map對象做屬性
4.Action類中使用ObjectMapper
  把map序列化爲JSONString
5.  <result type="json">
		<param name="root">map的名字</param>
	</result>

OGNL:
Object Graphic Navigation Language:
對象導航語言
通過Struts標籤在頁面取值,進行邏輯判斷

值棧ValueStack:一個Action擁有一個值棧
存放Action中的所有數據,包括Action對象本身
ValueStack中有一個root對象:
通過根對象可以查詢別的對象
值棧數據的作用域:一次請求

OGNL何時加#:
直接取值不加#
取內部值時需加#
取session #session.key ${sessionScope.key}
取application #application.key 
${applicationScope.key}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章