文章部分內容整理自郭永鋒視頻教學內容!
目錄
1、struts配置文件的加載順序
順序 |
配置文件名 |
所在位置 |
說明 |
1 |
default.properties |
struts2-core-2.3.15.3.jar\org\apache\struts2 |
不能修改 |
2 |
struts-default.xml |
struts2-core-2.3.15.3.jar |
不能修改 |
3 |
strtuts-plugin.xml |
在struts2提供的插件jar包中 |
不能修改 |
4 |
struts.xml |
我們的應用中 |
可以修改的:推薦 |
5 |
struts.properties |
我們的應用中 |
可以修改的 |
6 |
web.xml |
我們的應用中 |
可以修改的,可以給過濾器配置參數 |
2、struts框架執行流程
- tomcat啓動,加載web.xml
- 實例化並初始化過濾器
- 加載struts.xml配置文件
- 客戶端發送請求:hello
- 請求到達過濾器
- 截取請求的動作名稱name,並在struts.xml中找到對應動作
- 找到動作後實例化動作類
- 調用對應的動作方法method,方法有返回值
- 根據返回值找到name取值對應的結果視圖,即對應的success.jsp頁面
- 響應瀏覽器,展示結果
3、動作類的三種寫法
- 直接在寫個Action類,不需要繼承任何類,然後在struts.xml中配置
- 寫個Action類實現Action接口,然後實現excute方法
- 寫個Action類繼承ActionSuport類【推薦使用這種方式】
4、result元素type屬性取值
dispatcher |
(默認值)使用請求轉發,轉向一個頁面。 |
redirect |
使用重定向,轉向一個頁面。 |
chain |
轉發到另一個相同名稱空間的動作 轉發到不同名稱空間的動作 |
redirectAction |
重定向到另一個相同名稱空間的動作 重定向到不同名稱空間的動作 |
5、動作類中的servlet api訪問(兩種方式)
- 通過ServletActionContext獲取 【推薦使用】
public class TestAction extends ActionSupport{
public String test(){
//獲取servlet 的api方式
//第一種方式:通過ServletActionContext
//1.response
HttpServletResponse response = ServletActionContext.getResponse();
//2.request
HttpServletRequest request = ServletActionContext.getRequest();
//3.session
HttpSession session = request.getSession();
//4.application【ServletContext】
ServletContext application = ServletActionContext.getServletContext();
//NONE不跳轉,也就是不用找result標籤
return NONE;
}
}
-
通過注入方式:先讓Action實現兩個接口ServletRequestAware,ServletResponseAware,ServletContextAware
public class Test2Action extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
HttpServletResponse response;
HttpServletRequest request;
ServletContext application;
public String test(){
//第二種方式:通過實現接口,讓struts自動注入
/**
* Aware:注入,調用方法,注入參數
*/
System.out.println(request);
System.out.println(response);
System.out.println(application);
//NONE不跳轉,也就是不用找result標籤
return NONE;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
@Override
public void setServletContext(ServletContext context) {
this.application = context;
}
}
6、Action接收請求參數的方式
- 通過servlet方式獲取
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getParameter("username");
- 通過Action模型驅動封裝參數【常用】
index.jsp |
UserAction.java |
7、自定義攔截器
- 創建個攔截器,繼承Abastract方法,實現intercept方法。其中invocation.invoke()是放行通過。
-
在struts.xml中配置攔截器,攔截器需要配置後纔可使用
8、解決自定義攔截器後struts默認攔截器失效問題
方法一: 把默認攔截器加到配置
方法二: 抽取一個攔截器分組
方法三: 修改默認的攔截器
修改的默認的攔截器後,所有的Action方法都會被攔截,而登錄方法是不需要攔截的
解決需要通過AbstractInterceptor類的子類入手,通過查看發現,該類還有一個子類是抽象的,可以通過MethodFilter過濾方法,如圖:
解決步驟:
修改攔截器的繼承結構 |
修改struts.xml文件,註冊過濾方法 |
上面遺留的問題:我們在聲明時配置了哪些方法需要攔截,哪些方法不需要攔截。但是在沒有寫動作類和動作方法之前,我們不確定方法名叫什麼。
解決辦法:我們在寫action需要使用攔截器的時候再給它注入參數。
9、防止表單重複提
(1)Servelt的表單重複提交的一種解決方案:驗證碼。服務器端對比驗證碼一致後從session中移除驗證碼,若對比驗證碼不一致則代表重複提交。
(2)Struts的表單重複提交解決方案
方法一:使用重定向
方法二:使用<s:token/>生成令牌配合tokensession攔截器
jsp |
Struts.xml |