JavaEE框架學習筆記——struts篇

文章部分內容整理自郭永鋒視頻教學內容!   

目錄

1、struts配置文件的加載順序

2、struts框架執行流程

3、動作類的三種寫法

4、result元素type屬性取值

5、動作類中的servlet api訪問(兩種方式)

6、Action接收請求參數的方式

7、自定義攔截器

8、解決自定義攔截器後struts默認攔截器失效問題

9、防止表單重複提


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框架執行流程

  1. tomcat啓動,加載web.xml
  2. 實例化並初始化過濾器
  3. 加載struts.xml配置文件
  4. 客戶端發送請求:hello
  5. 請求到達過濾器
  6. 截取請求的動作名稱name,並在struts.xml中找到對應動作
  7. 找到動作後實例化動作類
  8. 調用對應的動作方法method,方法有返回值
  9. 根據返回值找到name取值對應的結果視圖,即對應的success.jsp頁面
  10. 響應瀏覽器,展示結果

3、動作類的三種寫法

  1. 直接在寫個Action類,不需要繼承任何類,然後在struts.xml中配置
  2. 寫個Action類實現Action接口,然後實現excute方法
  3. 寫個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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章