注:本文系做者在看了浪曦的風中葉老師的struts2視頻的我的總結,但願能幫助廣大struts2的初學者。
這講是接着上講的內容
這講主要講一些struts2攔截器的一些細節方面東西,但頗有用。
首先修改上講中的文件test.jsp,弄一張表單:
代碼以下:
html
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> web
<% apache
String path = request.getContextPath(); tomcat
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; jsp
%> ui
<%@ taglib prefix="s" uri="/struts-tags" %> this
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> spa
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<s:form action="test_interceptor">
<s:textfield name="username" label="username"></s:textfield>
<s:submit name="submit"></s:submit>
</s:form>
</body>
</html>
再在action中配置一個輸入驗證的文件 Test_InterceptorAction-validation.xml (如何配置請看前面幾節的內容,這裏再也不說了)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>username is required</message>
</field-validator>
</field>
</validators>
項目結構爲:
好了,顯然,經過以上配置,理論上能夠若是表單中username域爲空時,會有錯誤提示的
但是依舊成功提交,這是爲何呢?
這是因爲在struts.xml文件中咱們對action插入了自定義的interceptor以後,沒有將sturts2默認的攔截器插入action(struts2規定:若是action沒有插入任何interceptor存在時。默認插入一個叫dafaultStack的攔截器棧)
因此,這裏,咱們要手動插入之
修改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>
<package name="interceptor1" extends="struts-default">
<!-- 定義攔截器 -->
<interceptors>
<interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor"></interceptor>
</interceptors>
<!-- 配置action -->
<action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">
<result name="success">/success.jsp</result>
<result name="input">/test.jsp</result>
<!-- 將聲明好的攔截器插入action中 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<!--因爲咱們插入了自定義的interceptor。因此必須手動插入struts2的默認interceptor-->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
好了 如今在試試看 「username isrequired」
其實還有以下幾種方法導入默認的defaultStack
方法一:定義一攔截器棧,將defaultStack放入自定義的攔截器棧中去
struts2.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>
<package name="interceptor1" extends="struts-default">
<!-- 定義攔截器 -->
<interceptors>
<!-- 定義本身的攔截器 -->
<interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor"></interceptor>
<!--定義本身的攔截器棧 -->
<interceptor-stack name="myStack">
<!-- 將攔截器放入棧 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 配置action -->
<action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">
<result name="success">/success.jsp</result>
<result name="input">/test.jsp</result>
<!-- 將聲明好的自定義攔截器棧插入action中 -->
<interceptor-ref name="myStack"></interceptor-ref>
</action>
</package>
</struts>
方法二: 自定義一個默認攔截攔截器。代碼以下,注意註釋:
<?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>
<package name="interceptor1" extends="struts-default">
<!-- 定義攔截器 -->
<interceptors>
<!-- 定義本身的攔截器 -->
<interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor"></interceptor>
<!--定義本身的攔截器棧 -->
<interceptor-stack name="myStack">
<!-- 將攔截器放入棧 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 配置默認的攔截器棧 -->
<default-action-ref name="myStack"></default-action-ref>
<!-- 配置action -->
<action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">
<result name="success">/success.jsp</result>
<result name="input">/test.jsp</result>
<!-- 此時這裏無需插入任何攔截器 -->
</action>
</package>
</struts>
好,接下去講將將怎樣爲攔截器配置參數:
此時,必須修改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>
<package name="interceptor1" extends="struts-default">
<!-- 定義攔截器 -->
<interceptors>
<!-- 定義本身的攔截器 -->
<interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor">
<param name="test">success</param> <!-- 這裏配置攔截器的參數 -->
</interceptor>
<!--定義本身的攔截器棧 -->
<interceptor-stack name="myStack">
<!-- 將攔截器放入棧 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 配置默認的攔截器棧 -->
<default-action-ref name="myStack"></default-action-ref>
<!-- 配置action -->
<action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">
<result name="success">/success.jsp</result>
<result name="input">/test.jsp</result>
<!-- 此時這裏無需插入任何攔截器 -->
</action>
</package>
</struts>
而後修改攔截器 MyIntercepror.java 代碼以下:
package cn.edu.hdu.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyInterceptor implements Interceptor {
//因爲定義攔截器的時候爲攔擊添加了參數,因此這裏要爲攔截器添加對應實例字段
private String test; // 這個變量必須和配置文件中的對應的字段
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
public void destroy() {
System.out.println("destroy");
}
public void init() {
System.out.println("攔截器已經被加載");
System.out.println(this.getTest()); //將這個參數的值打印出來
}
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("調用intercept方法");
String result = invocation.invoke(); // invocation.invoke()方法檢查是否還有攔截器 有的話繼續調用餘下的攔截器 沒有了 執行action的業務邏輯
return result;
}
}
好了,重啓一下tomcat,控制檯看到什麼了。
另外,在使用攔截器的是時候也能夠在定義這個參數的value,結果是,覆蓋定義時候的value值
以下
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>
<package name="interceptor1" extends="struts-default">
<!-- 定義攔截器 -->
<interceptors>
<!-- 定義本身的攔截器 -->
<interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor">
<param name="test">success</param> <!-- 這裏配置攔截器的參數 -->
</interceptor>
<!--定義本身的攔截器棧 -->
<interceptor-stack name="myStack">
<!-- 將攔截器放入棧 -->
<interceptor-ref name="myInterceptor">
<param name="test">success when use it</param> <!-- 此處是在使用的時候對其再次進行一個 -->
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 配置默認的攔截器棧 -->
<default-action-ref name="myStack"></default-action-ref>
<!-- 配置action -->
<action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">
<result name="success">/success.jsp</result>
<result name="input">/test.jsp</result>
<!-- 此時這裏無需插入任何攔截器 -->
</action>
</package>
</struts>
再次重啓tomcat 看到了吧
附件中有源碼
Struts2核心 攔截器(初識攔截器)——— ... | struts2 文件上傳與下載 (初始文件上傳的 ...
interceptor1.rar (3.2 MB)
下載次數: 219
評論 共 4 條 請登陸後發表評論
挺好的,有了大體的瞭解了
代碼格式有點亂啊。支持一下。
label 寫道
寫得很好 繼續哦 呵呵
ok
寫得很好 繼續哦 呵呵