1. 程式人生 > >Struts2自學入門(四)——簡單攔截器

Struts2自學入門(四)——簡單攔截器

</pre>攔截器的作用:<p></p><p></p><pre id="best-content-873952657" accuse="aContent" class="best-text mb-10" style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: 'Microsoft YaHei', arial, 'courier new', courier, 宋體, monospace; white-space: pre-wrap; word-wrap: break-word; line-height: 29px; color: rgb(51, 51, 51); min-height: 55px; background-color: rgb(255, 255, 255);"><span style="font-size:14px;"><span style="white-space:pre">	</span>攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。攔截是AOP的一種實現策略。 </span>

一、攔截器預定義

在package標籤下定義:

	<interceptors>
			<interceptor name="MyInterceptor" class="com.java1234.interceptor.MyInterceptor"></interceptor>
			<interceptor name="LoginInterceptor" class="com.java1234.interceptor.LoginInterceptor"></interceptor>

	</interceptors>
class指向自己寫的攔截器類:

二、攔截器類

public class LoginInterceptor implements Interceptor {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("MyInterceptor destroy");

	}

	@Override
	public void init() {
		// TODO Auto-generated method stub
		System.out.println("MyInterceptor init");
	}

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		
		
		System.out.println("在Action執行之前");
<pre name="code" class="java">		ActionContext actionContext=invocation.getInvocationContext();
		Map<String,Object> session = actionContext.getSession();

Object currentUser=session.get("currentUser");String result=null;if(currentUser!=null){result = invocation.invoke();}else{HttpServletRequest request=(HttpServletRequest)invocation.getInvocationContext().get(ServletActionContext.HTTP_REQUEST);request.setAttribute("error", "請先登入!");result="error";}System.out.println("在Action執行之後");return result;}
需要繼承  com.opensymphony.xwork2.interceptor.Interceptor; 其中destory是銷燬方法,init是初始化方法, intercept是主要的執行方法 :
<span style="white-space:pre">	</span>ActionContext actionContext=invocation.getInvocationContext();
		Map<String,Object> session = actionContext.getSession();
在Struts2裡通過 ActionContext可以獲得Session 如上。
<span style="white-space:pre">	</span>result=invocation.invoke();

表示Action繼續往下執行並獲得其返回引數。返回引數可以在攔截器類裡進行修改,執行不同的返回結果。

三、在Action裡配置攔截器

要想把自己寫的攔截器配置給Action 如下:

  		<action name="hello" class="com.java1234.action.HelloWorldAction" >
  			<result name="success">success.jsp</result>
  			<interceptor-ref name="MyInterceptor"></interceptor-ref>
  			<interceptor-ref name="defaultStack"></interceptor-ref>
  		</action>
其中:defaultStack 是Struts自帶的預設攔截器。攔截器是按從上往下順序執行。

像登入攔截器這種使用頻繁的可以設定成全域性的攔截器棧 如下:

<span style="white-space:pre">		</span><interceptors>
<span style="white-space:pre">			</span><interceptor-stack name="myStack">
				<interceptor-ref name="LoginInterceptor"></interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>
			
			</interceptor-stack>
		</interceptors>
<span style="white-space:pre">		</span><default-interceptor-ref name="myStack"></default-interceptor-ref>
如果某個Action不需要使用這個全域性的攔截器棧可以在Action里加入預設攔截器
  			<interceptor-ref name="defaultStack"></interceptor-ref>
這樣一來Action就會執行自己的攔截器而不會執行全域性的。

而且需要使用到全域性攔截器的 如下就可以使用:

  		  <action name="girl" class="com.java1234.action.GirlAction" >
  			<result name="success">success.jsp</result>
  			<result name="error">error.jsp</result>
  		</action>