文章目錄
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}