天天看點

struts2總結(四)--struts2攔截器使用struts2自定義的攔截器自己定義攔截器

來自:https://www.w3cschool.cn/struts_2/struts_interceptors.html

重點說明:

該照着本文參照,如果使用idea開發工具則該攔截器不能生效搞了一天才發現用eclipse照着文檔配置就可以生效了。本人使用的eclipse+tomcat1.7+jdk1.7能成功使用攔截器功能

使用struts2自定義的攔截器

在Struts2Hello World示例修改struts.xml檔案給它添加攔截器:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name="struts.devMode" value="true" />
   <package name="helloworld" extends="struts-default">
      <action name="hello" 
         class="cn.w3cschool.struts2.HelloWorldAction"
         method="execute">
         <interceptor-ref name="params"/>
         <interceptor-ref name="timer" />
         <result name="success">/HelloWorld.jsp</result>
      </action>
   </package>
</struts>
           

右鍵單擊項目名稱,然後單擊“Export”>“WAR File”建立WAR檔案。然後在Tomcat的webapps目錄中部署這個WAR檔案。最後,啟動Tomcat伺服器并嘗試通路URL http://localhost:8080/HelloWorldStruts2/index.jsp。結果如下圖所示:

struts2總結(四)--struts2攔截器使用struts2自定義的攔截器自己定義攔截器

現在,在給定文本框中輸入任意單詞,然後單擊Say Hello按鈕執行定義的action。如果你去檢視生成的日志,會看到以下文本: 

INFO: Server startup in 3539 ms
27/08/2011 8:40:53 PM 
com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Executed action [//hello!execute] took 109 ms.
           

這裡的最後一行是由timer攔截器生成的,是表示ation總共需要109ms來執行。

自己定義攔截器

建立攔截器類

我們接下來在Java Resources>src檔案夾中建立以下MyInterceptor.java檔案:

package cn.w3cschool.struts2;

import java.util.*;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class MyInterceptor extends AbstractInterceptor {

   public String intercept(ActionInvocation invocation)throws Exception{

      /* let us do some pre-processing */
      String output = "Pre-Processing"; 
      System.out.println(output);

      /* let us call action or next interceptor */
      String result = invocation.invoke();

      /* let us do some post-processing */
      output = "Post-Processing"; 
      System.out.println(output);

      return result;
   }
}
           

你可以發現,實際中action将通過攔截器使用invocation.invoke()調用執行,是以你可以根據你的需求做一些預處理和一些後處理。

架構本身通過第一次調用ActionInvocation對象的invoke()來啟動程序。每次調用invoke()時,ActionInvocation都會查詢其狀态,并執行下一個攔截器。當所有配置的攔截器都被調用時,invoke()将使得action本身被執行。以下圖表通過請求流顯示了所說的概念:

struts2總結(四)--struts2攔截器使用struts2自定義的攔截器自己定義攔截器

建立Action類

我們在Java Resources>src檔案夾下建立一個java檔案HelloWorldAction.java,其中包名為cn.w3cschool.struts2,内容如下:

package cn.w3cschool.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{
   private String name;

   public String execute() throws Exception {
      System.out.println("Inside action....");
      return "success";
   }  

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}
           

這是我們在前面的例子中看到的同一個類,我們有“name”屬性标準的getters和setter方法,以及傳回字元串“success”的execute方法。

建立視圖

讓我們在你的eclipse項目的WebContent檔案夾中建立下面的jsp檔案HelloWorld.jsp。

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
   Hello World, <s:property value="name"/>
</body>
</html>
           

建立首頁

我們還需要在WebContent檔案夾中建立index.jsp檔案,此檔案将用作初始的action URL,使用者可以單擊它以指令Struts 2架構調用HelloWorldAction類的定義方法并呈現HelloWorld.jsp視圖。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
   pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
   <h1>Hello World From Struts2</h1>
   <form action="hello">
      <label for="name">Please enter your name</label><br/>
      <input type="text" name="name"/>
      <input type="submit" value="Say Hello"/>
   </form>
</body>
</html>
           

在上述視圖檔案中定義的hello action将使用struts.xml檔案映射到HelloWorldAction類及其execute方法中。

配置檔案

現在我們需要注冊新的攔截器,然後調用它,因為我們在前面的例子中調用的是預設攔截器。要注冊一個新的攔截器,把<interceptors> ... </ interceptors>标簽直接放置在<package>标簽下的struts.xml檔案中即可。對于預設攔截器,你可以跳過此步驟,就像我們前面的示例中所做的那樣。但現在讓我們使用以下方法注冊新的:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name="struts.devMode" value="true" />
   <package name="helloworld" extends="struts-default">

      <interceptors>
         <interceptor name="myinterceptor"
            class="cn.w3cschool.struts2.MyInterceptor" />
      </interceptors>

      <action name="hello" 
         class="cn.w3cschool.struts2.HelloWorldAction" 
         method="execute">
         <interceptor-ref name="params"/>
         <interceptor-ref name="myinterceptor" />
         <result name="success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>
           

需要注意的是,你可以在<package>标簽内注冊多個攔截器,同時可以在<action>标簽内調用多個攔截器,也可以用不同的action調用同一個攔截器。

web.xml檔案需要在WebContent下的WEB-INF檔案夾下建立,如下所示:

<?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" 
   xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   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>Struts 2</display-name>
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>
           

右鍵單擊項目名稱,然後單擊“Export”>“WAR File”以建立WAR檔案。然後在Tomcat的webapps目錄中部署WAR檔案。最後,啟動Tomcat伺服器并嘗試通路URL http://localhost:8080/HelloWorldStruts2/index.jsp。将顯示如下圖檔:

struts2總結(四)--struts2攔截器使用struts2自定義的攔截器自己定義攔截器

現在,在給的定文本框中輸入任意單詞,然後單擊Say Hello按鈕執行定義的action。如果你檢視生成的日志,會在底部看到以下文本:

Pre-Processing
Inside action....
Post-Processing