主要内容:
- 自定义拦截器
- 使用struts2自带的拦截器
一、自定义拦截器
这里讲自定义拦截器主要是为了理解struts2的一些原理,在实际开发中可能很少用到自定义拦截器。
(工程struts2_3500_my_interceptor
)
首先实现一个基本的功能
TestAction.java
package com.bjsxt.action;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
private String username;
private String password;
public String login() throws Exception {
return "success";
}
public String input() {
return "input";
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
然后我们去访问这个action,访问完之后返回到一个页面。
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.devMode" value="true"></constant>
<package name="test" namespace="/" extends="struts-default" >
<interceptors>
<interceptor name="my" class="com.bjsxt.interceptor.MyInterceptor"></interceptor>
</interceptors>
<action name="test" class="com.bjsxt.action.TestAction">
<result>/test.jsp</result>
<interceptor-ref name="my"></interceptor-ref>
<!-- 如果不加原来默认的拦截器,那么自定义拦截器就会将其覆盖,所以默认的拦截器需要加上 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
我们在访问此action的过程中使用一个拦截器
MyInterceptor.java
package com.bjsxt.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyInterceptor implements Interceptor {
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invovation) throws Exception {
long start = System.currentTimeMillis();
String r = invovation.invoke();
long end = System.currentTimeMillis();
System.out.println("action time = " + (end - start));
return r;
}
}
说明:拦截器的功能很简单,就是打印拦截器使用的时间,注意继承Interceptor
接口。拦截器定义好之后我们还需要在配置文件中进行配置:
<interceptors>
<interceptor name="my" class="com.bjsxt.interceptor.MyInterceptor"></interceptor>
</interceptors>
这里是配置拦截器,但是配置了拦截器还要让其起作用,这里我们要在特定的action中进行配置:
<interceptor-ref name="my"></interceptor-ref>
<!-- 如果不加原来默认的拦截器,那么自定义拦截器就会将其覆盖,所以默认的拦截器需要加上 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
需要知道的是我们需要将默认的拦截器也要配置,不然会被覆盖。
然后我们访问action就会看到打印的信息。
二、使用token拦截器控制重复提交
在将JavaEE基础的时候我们将过防止重复提交的方法,就是往session中存入一个隐藏字段,然后在后台进行比较。这里struts2中也是使用的这个方法,但是这个拦截器没有配置到默认拦截器中,因为使用的很少,我们看看如何使用。(工程struts2_3600_token_interceptor
)
首先我们访问InputAction
package com.bjsxt.action;
import com.opensymphony.xwork2.ActionSupport;
public class InputAction extends ActionSupport {
@Override
public String execute() throws Exception {
return super.execute();
}
}
然后会返回到input.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>test</title>
</head>
<body>
<form action="user" method="post">
name:<input name="name">
age:<input name="age">
<input type="submit" value="add">
<s:token></s:token>
</form><br>
</body>
</html>
提交的时候访问UserAction
package com.bjsxt.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String name;
private int age;
@Override
public String execute() throws Exception {
System.out.println("a user added!");
return super.execute();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
基本过程就是这样,我们看配置文件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.devMode" value="true"></constant>
<package name="test" namespace="/" extends="struts-default">
<action name="input" class="com.bjsxt.action.InputAction">
<result>/input.jsp</result>
</action>
<action name="user" class="com.bjsxt.action.UserAction">
<result>/addOK.jsp</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="token"></interceptor-ref>
<result name="invalid.token">/error.jsp</result>
</action>
</package>
</struts>
可以看到我们是在action的返回结果后面配置了
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="token"></interceptor-ref>
<result name="invalid.token">/error.jsp</result>
这样就可以使用token拦截器进行防止表单重复提交了,我们可以在试验的时候查看源代码,可以看到相关的隐藏字段。