周末真的是懶到心慌。。。。。。 本文是在完整s2sh項目基礎上添加的,不太瞭解s2sh項目構建的朋友可以先參考一下這幾篇文章: eclipse環境下基於tomcat-7.0.82構建struts2項目 eclipse環境下基於已構建struts2項目整合spring+hibernate 基於已構建S ...
周末真的是懶到心慌。。。。。。
本文是在完整s2sh項目基礎上添加的,不太瞭解s2sh項目構建的朋友可以先參考一下這幾篇文章:
eclipse環境下基於tomcat-7.0.82構建struts2項目
eclipse環境下基於已構建struts2項目整合spring+hibernate
基於已構建S2SH項目配置全註解方式簡化配置文件
首先簡單說明一下為什麼需要在s2sh項目中配置題目所述三項:
1.struts2動態調用:
如果不配置動態調用,我們只能在一個action中調用一個預設excute()方法,每請求調用一個方法就需要編寫一個action,這樣就會加大開發的工作量,因此這是剛需。
2.Servlet過濾器
Servlet過濾器我們可以理解為一個獨立的web組件,它攔截請求和響應,以便查看、提取或以某種方式操作正在客戶機和伺服器之間交換的數據。過濾器是通常封裝了一些功能的 Web 組件,這些功能雖然很重要,但是對於處理客戶機請求或發送響應來說不是決定性的。
3.struts2攔截器
struts2攔截器是是其核心,攔截器可以讓我們在action和result執行之前或者之後完成一些操作,比如許可權驗證,未登陸的用戶不被允許訪問某些資源等。
過濾器與攔截器的區別
首先過濾器是基於servlet的基礎上進行的操作,是屬於全局的,可過濾到所有請求資源,包括.css等文件,而攔截器是基於struts2的,只能過濾到請求action的方法。
相同點,二者的實現都可看作是模塊化的,可理解為是aop的一種策略。
配置步驟:
第一步:配置struts2動態調用
在struts.xml配置文件中的<struts></struts>節點內聲明struts2支持動態調用、並規定匹配怎樣的字元交給struts2進行處理,代碼如下:
<!-- 讓struts2支持動態方法調用 以感嘆號方式調用action中的多個方法 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- 所有匹配*.action、do的請求都由struts2處理 --> <constant name="struts.action.extension" value="action,do" />
第二步:配置servlet過濾器
過濾器的配置需要我們實現servlet的Filter介面,並實現其抽象方法destroy()、doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2)、init(FilterConfig arg0),三個方法含義分別是初始化、過濾操作、銷毀,接著需要我們在web.xml進行聲明自定義過濾器,因為web.xml才是servlet的第一容器,給出自定義過濾器代碼如下:
package wjt.com.test.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class CharacterFilter implements Filter{ @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { System.out.println("過濾器..."); arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
修改後的web.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>SSHDemo</display-name> <!-- spring的監聽器配置開始 --> <!-- spring監聽器的作用:提供實例(IOC) --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--過濾非法字元,該配置必須在最前面 --> <filter> <filter-name>characterFilter</filter-name> <filter-class>wjt.com.test.filter.CharacterFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <!-- 指定過濾器映射 --> <filter-name>characterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 將請求路徑交由struts過濾 --> <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> </web-app>
第三步:配置struts2攔截器
struts2的攔截器介面有多個,根介面也包含初始化、執行攔截操作、銷毀三個抽象方法,這裡我們繼承MethodFilterInterceptor抽象類,該類內部已經對初始化和銷毀的方法進行了實現,因此只需要實現執行攔截操作的抽象方法即可,當然如果有初始化和銷毀操作,我們這裡也可以對其進行定義覆蓋父類同名方法的實現,代碼如下:
package wjt.com.test.interceptor; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; /** * 自定義方法攔截器 * * @author Together * */ public class MethodInterceptor extends MethodFilterInterceptor{ /** * */ private static final long serialVersionUID = 1L; @Override protected String doIntercept(ActionInvocation arg0) throws Exception { System.err.println("攔截器生效..."); String action=(String) ServletActionContext.getRequest().getSession().getAttribute("action"); System.out.println("action:"+action); StringBuffer requstPath=ServletActionContext.getRequest().getRequestURL(); System.out.println("requstPath:"+requstPath); System.err.println("攔截器結束..."); return arg0.invoke(); } }
配置struts.xml文件,使攔截器生效,配置如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"><!-- 這裡要和struts2版本號統一 --> <struts> <!-- 告知Struts2運行時使用Spring來創建對象 --> <constant name="struts.objectFactory" value="spring" /> <!-- 讓struts2支持動態方法調用 以感嘆號方式調用action中的多個方法 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- 所有匹配*.action、do的請求都由struts2處理 --> <constant name="struts.action.extension" value="action,do" /> <package name="default" namespace="/" extends="struts-default"> <interceptors> <!-- 先定義攔截器 --> <interceptor name="myInterceptor" class="wjt.com.test.interceptor.MethodInterceptor"> <!-- 指定系統初始化給攔截器的參數 --> <!-- <param name="hello">吳靜濤</param> --> </interceptor> <!-- 加到自己設置的攔截器棧裡邊去 --> <interceptor-stack name="myStack"> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 改變系統預設的攔截器,改成自己的預設攔截器,並且一個系統只能有一個預設的攔截器,這樣這個攔截器棧會預設應用到所有的Action上去 --> <default-interceptor-ref name="myStack" /> </package> </struts>
配置action實現類,若使對action實現類的請求經過自定義攔截器的處理,需要我們對其添加@ParentPackage("default"),該註解添加到action類名上方,作為action的第一註解存在。
測試:
到這裡題目所屬三項配置就完畢了,啟動項目並請求action後截圖如下所示表示配置成功:
這裡只給出簡單配置,讀者朋友最好還是在理解原理的前期下使用,本人還是剛畢業小白,對原理的理解還不夠深,還沒能達到陳述原理的水平,有不合理的地方還請大家指出。