拦截器是Struts2的一个重要特性。Struts2框架的大多数核心功能都是通过拦截器来实现的,像避免表单重复提交、类型转换、对象组装、验证、文件上传等,都是在拦截器的帮助下实现的。拦截器之所以称为“拦截器”,是因为它可以在Action执行之前和执行之后拦截调用。
案例:
HelloAction.java
package action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String add(){
message="Hello";
return SUCCESS;
}
public String delete(){
message="Hello";
return SUCCESS;
}
@Override
public String execute() throws Exception {
message="Hello";
return SUCCESS;
}
}
MyInterceptor.java
package util;
import java.util.Date;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println(name+"调用之前"+new Date());
long start=System.currentTimeMillis();
String result=invocation.invoke();
long end=System.currentTimeMillis();
System.out.println(name+"调用之后"+new Date());
System.out.println("用时"+(end-start));
return result;
}
}
MethodInterceptor.java
package util;
import java.util.Date;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MethodInterceptor extends MethodFilterInterceptor {
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println(name+"调用之前" + new Date());
long start = System.currentTimeMillis();
String result = invocation.invoke();
long end = System.currentTimeMillis();
System.out.println(name+"调用之后" + new Date());
System.out.println("用时" + (end - start));
return result;
}
}
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>
<package name="hello" namespace="/hello" extends="struts-default">
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="myinterceptor" class="util.MyInterceptor">
<param name="name">简单1拦截器</param>
</interceptor>
<interceptor name="myinterceptor" class="util.MethodInterceptor">
<param name="name">简单2拦截器</param>
</interceptor>
</interceptors>
<action name="*" class="action.HelloAction" method="{1}">
<result name="success">
/index.jsp
</result>
<interceptor-ref name="myinterceptor">
<param name="name">1</param>
</interceptor-ref>
<interceptor-ref name="myinterceptor">
<!-- excludeMethods-------要排除的方法。 includeMethods--------要拦截的方法。 -->
<param name="excludeMethods">add,delete</param>
<param name="includeMethods">execute</param>
<param name="name">2</param>
</interceptor-ref>
</action>
</package>
</struts>
调用excludeMethods(要排除的方法)中的方法:执行结果为
调用includeMethods(要拦截的方法)中的方法execute执行为:
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!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>
${message}
</form>
</body>
</html>