1、自定义拦截器有两种实现方法:
(1)实现Interceptor接口 ,如:DefineInterceptor2.java
(2)继承 AbstractInterceptor抽象类 ,如:DefineInterceptor1.java
2、实现步骤:
(1)定义拦截器类,实现Interceptor接口 或者继承 AbstractInterceptor抽象类
(2)在struts.xml定义拦截器(在package标签下的interceptors标签里面写interceptor)
(3)在action标签中使用interceptor-ref标签,调用自定义的拦截器
3、注意事项:
(1)在action标签中调用自定义的拦截器的时候,要多调用defaultStack拦截器,不然自定义拦截器类那里就会收不到传入参数的值,导致最后参数会变成null或者model中的初始化值
(2)在自定义拦截器类中,如果不执行invoke()方法,那么后续的拦截器和action方法将不会被调用
(3)调用invoke()方法的返回值可以用到自定义拦截器类的intercept()方法的返回值上
4、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">
<struts>
<constant name="struts.custom.i18n.resources" value="i18n"/>
<package name="default" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="DInterceptor" class="com.demo.sshtest.DefineInterceptor"></interceptor>
<interceptor name="DInterceptor2" class="com.demo.sshtest.DefineInterceptor2"></interceptor>
</interceptors>
<action name="testAction" class="com.demo.sshtest.TestAction">
<interceptor-ref name="DInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result>/result.jsp?DInterceptor1</result>
</action>
<action name="testAction2" class="com.demo.sshtest.TestAction">
<interceptor-ref name="DInterceptor2"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result>/result.jsp?DInterceptor2</result>
</action>
</package>
</struts>
5、index.jsp 调用页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>submit</title>
</head>
<body>
<!--
1、自定义拦截器有两种实现方法:
(1)实现Interceptor接口 ,如:DefineInterceptor2.java
(2)继承 AbstractInterceptor抽象类 ,如:DefineInterceptor1.java
2、实现步骤:
(1)定义拦截器类,实现Interceptor接口 或者继承 AbstractInterceptor抽象类
(2)在struts.xml定义拦截器(在package标签下的interceptors标签里面写interceptor)
(3)在action标签中使用interceptor-ref标签,调用自定义的拦截器
3、注意事项:
(1)在action标签中调用自定义的拦截器的时候,要多调用defaultStack拦截器,不然自定义拦截器类那里就会收不到传入参数的值,导致最后参数会变成null或者model中的初始化值
(2)在自定义拦截器类中,如果不执行invoke()方法,那么后续的拦截器和action方法将不会被调用
(3)调用invoke()方法的返回值可以用到自定义拦截器类的intercept()方法的返回值上
-->
<s:debug></s:debug>
<s:form method="POST" action="testAction">
<s:textfield name="name" label="NAME"></s:textfield>
<s:submit></s:submit>
</s:form>
<s:form method="POST" action="testAction2">
<s:textfield name="name" label="NAME"></s:textfield>
<s:submit></s:submit>
</s:form>
</body>
</html>
页面没什么好说的,写了两个form,用来测试两个通过不同实现方式实现的拦截器。还有,结果页面是result.jsp,是可空白的页面
6、TestAction.java 只是一个model类
package com.demo.sshtest;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport{
private static final long serialVersionUID = 1L;
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String execute() throws Exception {
System.out.println("name:"+getName());
return super.execute();
}
}
7、DefineInterceptor.java 通过继承AbstractInterceptor实现的拦截器类
package com.demo.sshtest;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class DefineInterceptor extends AbstractInterceptor{
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("1 invocation.invoke-----start");
String result = arg0.invoke();
System.out.println(result);
System.out.println("1 invocation.invoke-----end");
return result;
}
}
8、DefineInterceptor2.java 通过实现Interceptor接口,实现的拦截器类
package com.demo.sshtest;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class DefineInterceptor2 implements Interceptor{
private static final long serialVersionUID = 1L;
@Override
public void destroy() {
System.out.println("destory");
}
@Override
public void init() {
System.out.println("init");
}
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("2 invocation.invoke-----start");
String result = arg0.invoke();
System.out.println(result);
System.out.println("2 invocation.invoke-----end");
return result;
}
}
实现Interceptor接口的话,需要把init()和destroy()方法也写以下,一个是用来进入自定义拦截器类的时候,初始化你需要初始化的东西,一个是清理用的,比如关闭数据库连接之类的
9、运行效果
1的那一段是调用通过继承AbstractInterceptor实现的拦截器
2的那一段是调用通过实现Interceptor接口实现的拦截器
10、项目目录
11、demo
https://download.csdn.net/download/qq_22778717/10320991