一、獲取struts2前端
二、選擇經常使用jar包web
path:Struts文件下/lib/...apache
經常使用jar包有session
三、導入jar包到項目下app
導入到WebRoot下的WEB-INF/lib,然後buildPathjsp
四、配置filter(web.xml)工具
五、創建Action(三種方式,類名規範:類的結尾為Action,eg: DefaultAction)ui
5.1.一、創建一個類繼承ActionSupport類(最好)url
5.1.二、複寫方法(返回值為String並且拋出一個異常)spa
5.2.一、直接創建一個普通類
5.2.二、在struts中配置就ok了
5.3.一、創建一個類繼承Action接口
5.3.二、複寫方法(返回值為String並且拋出一個異常)
5.四、配置Struts.xml文件,注意,該文件必須放在src文件夾下,且命名正確
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 使用動態方法調用時所需配置 --> <constant name="struts.devMode" value="true"></constant> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> <!-- name:配置包名 extends=struts-default為固定 --> <!-- 虛擬資源路徑 eg:若namespace="/xxx" 則要訪問此package下的action,url為webPath/xxx/actionName --> <package name="MyPackage" namespace="/" extends="struts-default"> <!-- 動態調用時配置 --> <global-allowed-methods>這裡寫入*允許被動態調用的方法名,如Login</global-allowed-methods> <!--配置action name->url-pattern method->調用action中指定的一個方法 --> <action name="LoginAction" class="com.struts.web.UserAction" method="execute"> <!--依據execute的返回值來決定跳轉(默認為請求轉發) 配置type決定重定向--> <result name="success" type="redirect">/index.jsp</result> <result name="error">/index.jsp</result> </action> <!-- 動態方法調用(根據url中*的名稱來調用UserAction中對應的方法) eg: url=webRoot/LoginAction_Login時會調用UserLogin下的Login方法 --> <action name="LoginAction_*" class="com.struts.web.UserAction" method="{1}"> </action> </package> </struts>
六、參數傳遞(接收參數)
6.一、屬性驅動方式
在action裏聲明對應參數的字段,生成對應的getter和setter,struts會自動獲取request域中同名的參數
6.二、類驅動方式(不推薦)
在action裏聲明屬性所屬的類(不用實例化),生成對應的getter和setter,如:User(有username和password屬性並且實現getter和setter方法)
在前端form表單中對應屬性input的name屬性需為,如:name="user.username"
6.三、封裝參數(推薦)
繼承ModelDriven<要封裝的pojo類>接口,複寫getModel()方法:返回實例化的類(注意要先把要封裝的類實例化,且這個類要有getter和setter)
(與servlet區別,servlet的數據封裝是通過導入BeanUtils工具包對對象進行封裝,方便數據類型轉換)
七、傳遞參數(ActionContext)
ActionContext的數據結構是Map,存儲了一下(對象:對象地址)
request、response、servletContext(application)、session、attr域、param域、valueStack。。。
//經常使用方法
ActionContext.getContext().put(key, value) == servlet中 request.setAttribute(key, value) //get同理
ActionContext.getContext().getSession() 獲取session,返回Map對象,使用put、get對應存取
ActionContext.getContext().getApplication() 獲取servletContext,返回Map對象,使用put、get對應存取
PS:ActionContext的生命週期:每次請求都會創建一個與請求對應的ActionContext對象,請求處理完,ActionContext就會被銷毀
通過ActionContext的子類ServletActionContext能夠獲得原生的request、response
八、action的方法規範:
一、返回值是String(也能夠是void)
二、沒有參數
三、用public修飾
九、ognl(升級版的jstl)的使用
一、再jsp文件中加上<%@taglib uri="/struts-tags" prefix="s"%>
二、經常使用標籤:
2.一、循環
<s:iterator value=" 做用域中(存的某個對象)的鍵名 " var=" 給每一次循環的內容用一個變量表示 ">
循環體:
獲取對象的某個值<s:property value=" 對象中對應的屬性名,如UserName "/>
</s:iterator>
2.二、判斷:
<s:if test=" 邏輯判斷 "></s:if><s: else></s:else>
2.三、獲取對象中的某個字段
<s:propety value="#ObjectName.屬性名(有對應的getter)"/>(# == ActionContext.getContext())
因爲它實際上是用ActionContext去取值,那麼就會有做用域前後問題:pageContext --> HttpSession --> ServletContext
十、action獲取request中值的三種方法:
屬性驅動:
表單獲取數據(屬性)---->struts(params攔截器)---->ognl---->valueStack---->對應action屬性值
對象驅動
表單獲取數據(ObjectName.屬性)---->struts(params攔截器)---->ognl---->valueStack---->對應action裏的對象---->對象的屬性
模型驅動
表單獲取數據(屬性)---->struts(params攔截器)---->ognl---->valueStack------>直接找root中對應的對象(在action中已實例化,modelDriver將實例化的對象壓入ValueStack)--->對象中的屬性名
十二、Action原理
request ---> 前端控制器(FC) ---> struts(攔截器) ---> action與jsp數據交互的媒介:valueStack(root棧、actionContext、ognl引擎) ---> struts建立action ----> 當全部的攔截器(一、二、3)攔截完後 ---> 將action壓入root棧 ---> 執行action ---> 反向執行攔截器(三、二、1)---> FC建立result結果集 ---> 轉發或重定向
1三、result結果集(輸出的處理):
每一個result是一個類,每一個類都實現了共同的接口Result,struts2預置了10種類型的result,它們被定義在struts-default.xml(在package的extends=「structs-default」就是聲明繼承struts-default,繼承了才能使用result標籤)中
四種經常使用type:
dispatcher轉發:默認
chain:轉發到action
redirect:重定向
redirectAction:重定向到Action
1四、攔截器(攔截器只能控制訪問Action,不能控制訪問jsp)實現:
第一種(推薦):
建立:建立一個類繼承MethodFilterInterceptor
複寫String doIntercept(ActionInvocation invocation)方法(放行 invocation.invoke())
第二種:
建立:建立一個類實現Intercept接口
實現String intercept(ActionInvocation invocation)方法(放行同樣)
配置(注意:package中配置是有順序要求的):
Content Model : (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, default-
class-ref?, global-results?, global-allowed-methods?, global-exception-mappings?, action*)
<!-- name:配置包名 extends=struts-default為固定 --> <!-- 虛擬資源路徑 eg:若namespace="/xxx" 則要訪問此package下的action,url為webPath/xxx/actionName --> <package name="MyPackage" namespace="/" extends="struts-default"> <interceptors> <!-- 註冊攔截器 --> <interceptor name="myIntercept" class="com.struts.intercept.MyIntercept"></interceptor> <!-- 註冊攔截器棧 --> <interceptor-stack name="myStack"> <!-- 引入本身建立的攔截器 --> <interceptor-ref name="myIntercept"> <!-- 配置不通過此攔截器的方法(login方法不只過攔截器) --> <param name="excludeMethods">login</param> </interceptor-ref> <!-- 引入struts自己的攔截器(20) --> <interceptor-ref name="defalutStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 指定包中的默認攔截器棧(不指定則用struts的默認) --> <default-interceptor-ref name="myStack"></default-interceptor-ref> <!-- 配置全局結果集(配合攔截器) --> <global-results> <result name="toLogin" type="redirect">/login.jsp</result> </global-results>