拦截器 进阶 struts2
注:本文系作者在看了浪曦的风中叶老师的struts2视频的个人总结,希望能帮助广大struts2的初学者。
这讲是接着上讲的内容
这讲主要讲一些struts2拦截器的一些细节方面东西,但很有用。
首先修改上讲中的文件test.jsp,弄一张表单:
代码如下:
Jsp代码
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<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代码
<?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代码
<?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代码
<?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代码
<?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代码
<?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 代码如下:
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代码
<?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>
Struts2核心 拦截器(初识拦截器)——— ... | struts2 文件上传与下载 (初始文件上传的 ...
interceptor1.rar (3.2 MB)
下载次数: 219
查看图片附件
评论 共 4 条 请登录后发表评论
挺好的,有了大致的了解了
代码格式有点乱啊。支持一下。
label 写道
写得很好 继续哦 呵呵
ok
写得很好 继续哦 呵呵