Struts2的拦截器
1. 实现拦截器的两种方法:
一般情况下建议实现Abstracinterceptor类,不用重写init和destory方法。
1.1 实现interceptor接口
- void init():初始化拦截器所需要的资源
- void destroy():释放在init()中分配的资源
- String interceptor(ActionInovation ai) throws Exception
- 实现拦截器功能
- 利用ActionInovation参数获取拦截器状态
- 返回result字符串作为逻辑视图
1.2 继承AbstractInterceptor类
- 提供了init()和destroy()的空实现
- 只需实现interceptor()方法即可
2. 执行一个拦截器步骤:
- 创建一个类继承AbstractInterceptor
- 实现interceptor()方法
- 在xml文件中注册拦截器,并在要拦截的action中引用该拦截器
3. 拦截器实例
3.1拦截器实现执行时间统计
在timer.action中执行一些列动作,配置拦截器,计算处timer.action的执行时间,并在控制台输出
java类
===================TimerAction==========================
package com.bart.action;
import com.opensymphony.xwork2.ActionSupport;
public class TimerAction extends ActionSupport {
@Override
public String execute() throws Exception {
for(int i=0;i<500;i++){
if(i%2==0)
System.out.println("i的值是:"+i);
}
return SUCCESS;
}
}
===================InterceptorOne==========================
/*
* 拦截器实现计算执行action花费的时间
* */
package com.bart.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class InterceptorOne extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//1.执行action之前
long start=System.currentTimeMillis();
//2.执行下一个拦截器,如果已经是最后一个,则执行目标action
String result = invocation.invoke();
//3.执行action之后
long end=System.currentTimeMillis();
System.out.println("执行action共花费:"+(end-start)+"ms");
return result;
}
}
timer_interceptor.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="default" namespace="/" extends="struts-default">
<!-- 注册拦截器 -->
<interceptors>
<interceptor name="timerInterceptor" class="com.bart.interceptor.InterceptorOne">
</interceptor>
</interceptors>
<action name="timer" class="com.bart.action.TimerAction">
<result>/success.jsp</result>
<!-- 为Action显示引用拦截器后,默认的拦截器defaultStack不再生效,
需要手工引用。而且从顺序角度去讲,最好把默认的拦截器写在自定义拦
截器上面 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 引用拦截器 -->
<interceptor-ref name="timerInterceptor"></interceptor-ref>
</action>
</package>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
</struts>
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>
<include file="timer_interceptor.xml"></include>
<constant name="struts.action.extension" value="html,jsp,do"></constant>
</struts>
运行Tomcat服务器,浏览器输入http://localhost:8080/Struts2Demo1/timer.action
之后会执行timer.action同时拦截器timerInterceptor拦截器动作,并计算出运行时间输出。
控制台输出
i的值是:0
i的值是:2
...
i的值是:498
执行action共花费:102ms
拦截器实现后台管理界面
创建一个后台管理界面,只有登录成功后,才能访问到。
- 创建manage.jsp,并在login.xml中配置相关action
- LoginAction实现SessionAware接口,并在login()方法中处理相关逻辑,当用户名密码都正确时,session.put(“xxx”,object);
- 创建ManageInterceptor类,在interceptor()方法中处理相关逻辑
- login.xml中注册拦截器,可以创建自定义拦截器栈,把默认的拦截器放在前面,自定义拦截器放在后面
- 在manage的action标签中引用拦截器或者自定义的拦截器栈
java类
=====================LoginAction.java============================
package com.bart.action;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import po.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class LogInAction extends ActionSupport implements ModelDriven<User>,SessionAware{
/* 第 3 种方法*/
private User user = new User();
private Map<String, Object>session=user.getSession();
//重写SessionAware的方法
public void setSession(Map<String, Object> arg0) {
this.session=arg0;
}
public String logIn(){
if ("admin".equals(user.getUsername())&&"123".equals(user.getPassword())) {
session.put("logName", user.getUsername());
return SUCCESS;
}else{
session.put("loginError", "用户名或密码错误");
return ERROR;
}
}
//重写的接口的方法,返回提交的对象
public User getModel() {
// TODO Auto-generated method stub
return user;
}
}
=====================ManageInterceptor.java============================
package com.bart.interceptor;
import java.util.Map;
import javax.servlet.jsp.PageContext;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class ManageInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext context = ActionContext.getContext();
Map<String, Object> session = context.getSession();
if(session.get("logName")!=null){
String result = invocation.invoke();
return result;
}else
return "login";
}
}
login.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="default" namespace="/" extends="struts-default" >
<!-- 注册拦截器 -->
<interceptors>
<interceptor name="manageInterceptor" class="com.bart.interceptor.ManageInterceptor"></interceptor>
<!-- 自定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="manageInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 创建manage.jsp的action -->
<action name="manage" >
<result>/WEB-INF/jsp/manage.jsp</result>
<result name="login">/login.jsp</result>
<!-- 使用自定义的拦截器栈 -->
<interceptor-ref name="myStack"></interceptor-ref>
</action>
<action name="LogInAction" method="logIn" class="com.bart.action.LogInAction" >
<result>/success.jsp</result>
<result name="input">/login.jsp</result>
<result name="error">/login.jsp</result>
</action>
</package>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
</struts>
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>
<include file="login.xml"></include>
<constant name="struts.action.extension" value="html,jsp,do"></constant>
</struts>
manage.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=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 'manage.jsp' starting page</title>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
这是后台管理界面,只有登录成功的用户才能访问! <br>
</body>
</html>
运行Tomcat服务器,在登陆界面输入用户名和密码admin和123,登陆成功之后,
地址栏输入:http://localhost:8080/Struts2Demo1/manage.action即可进入manage界面