1.过滤器和拦截器的区别
过滤器(Filter):可以拦截html、jsp、servlet等各种路径。
拦截器(Interceptor):只能拦截Action。
2. Servlet 和 Action的区别
Servlet:默认在第一次访问时创建Servlet对象,单实例。
Action:每次访问都会创建对象,多实例。
3.自定义拦截器
实现MethodFilterInterceptor接口,重写doIntercept()
myAction.java
package zh.action.demo;
import com.opensymphony.xwork2.ActionSupport;
public class MyAction extends ActionSupport{
public String fun1(){
System.out.println("MyAction...fun1...");
return SUCCESS;
}
public String fun2(){
System.out.println("MyAction...fun2...");
return SUCCESS;
}
public String fun3(){
System.out.println("MyAction...fun3...");
return SUCCESS;
}
}
myInterceptor.java
package zh.action.demo;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyInterceptor extends MethodFilterInterceptor{
/**
* 实现MethodFilterInterceptor接口,重写抽象方法
*/
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("我是拦截器MyInterceptor!!!");
return invocation.invoke();// 此方法返回值为"success"
}
}
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.i18n.encoding" value="UTF-8"></constant>
<package name="demo1" namespace="/" extends="struts-default">
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="myInterceptor" class="zh.action.demo.MyInterceptor"></interceptor>
</interceptors>
<action name="myAction_*" class="zh.action.demo.MyAction" method="{1}">
<!-- 注册拦截器,并配置不拦截的方法 -->
<interceptor-ref name="myInterceptor">
<param name="excludeMethods">fun1,fun2</param>
</interceptor-ref>
<!-- 注册了自定义拦截器,就不会执行默认拦截器,因此需要添加默认拦截器栈 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 配置结果视图页面,方式为 转发 -->
<result name="success" type="dispatcher">/interceptor.jsp</result>
</action>
</package>
</struts>
interceptor.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
<h1 style="color:orange;">嗨!正在学习Struts2...</h1>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置Struts的拦截器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
访问:http://localhost:8080/Struts1/myAction_fun1.action,fun1方法不被拦截。
先在控制台输出:
然后转发到interceptor.jsp
访问:http://localhost:8080/Struts1/myAction_fun2.action,fun2方法不被拦截。
先在控制台输出:
然后转发到interceptor.jsp
访问:http://localhost:8080/Struts1/myAction_fun3.action,fun3方法被拦截。
先在控制台输出:
然后转发到interceptor.jsp