一、前言
之前便了解过,Struts 2的核心控制器是一个Filter过滤器,负责拦截所有的用户请求,当用户请求发送过来时,会去检测struts.xml是否存在这个action,如果存在,服务器便会自动帮我们跳转到指定的处理类中去处理用户的请求,基本流程如下:
该流程笔者理解是基本流程,。如果有不对的地方,请下方留言。我会改正。谢谢;
好,接着往下讲:
注意:在struts.xml中,配置文件必须有该请求的处理类才能正常跳转,同时,返回SUCCESS字符串的类,必须继承ActionSupport,如果你没有继承,那么就返回"success",同样能够跳转到jsp逻辑视图,但是必须确保你struts.xml有<result name="success">xx.jsp</result>,该标签,具体操作在上一篇文章有介绍过简单例子。
1.1、了解拦截器
什么是拦截器,它的作用是什么?
拦截器,实际上就是对调用方法的改进。
作用:动态拦截对Action对象的调用,它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
拦截器的执行顺序:
在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。
二、实际操作
2.1、自定义拦截器
新建一个类继承AbstractInterceptor。
package com.Interceptor; import java.util.Date; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyInterceptor extends AbstractInterceptor { private String name;//该属性与struts.xml中的<param name="name">简单拦截器</param>一致,也就是说该name的值是简单拦截器 public void setName(String name) { this.name = name; } //拦截action请求 @Override public String intercept(ActionInvocation arg0) throws Exception { //取得被拦截的action LoginAction action = (LoginAction)arg0.getAction(); System.out.println(name+":拦截器的动作------"+"开始执行登录action的时间为:"+new Date()); long start = System.currentTimeMillis(); /* * ActionInvocation.invoke()就是通知struts2接着干下面的事情 * 比如 调用下一个拦截器 或 执行下一个Action * 就等于退出了你自己编写的这个interceptor了 * 在这里是去调用action的execute方法,也就是继续执行Struts2 接下来的方法*/ String result = arg0.invoke(); System.out.println(name+":拦截器的动作------"+"执行完登录action的时间为:"+new Date()); long end = System.currentTimeMillis(); System.out.println(name+":拦截器的动作------"+"执行完该action的时间为:"+(end-start)+"毫秒"); System.out.println(result); //输出的值是:success return result; } } /** * 该页面的效果如下: * 简单拦截器:拦截器的动作------开始执行登录action的时间为:Mon Oct 24 19:06:17 CST 2016 用户名:admin,密码:123 简单拦截器:拦截器的动作------执行完登录action的时间为:Mon Oct 24 19:06:18 CST 2016 简单拦截器:拦截器的动作------执行完该action的时间为:1130毫秒 success * */
在struts.xml中配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!--简单的拦截器 --> <package name="Interceptor" extends="struts-default" namespace="/ac"> <!-- 跳转前拦截 --> <interceptors> <!-- 声明简单的过滤器 --> <interceptor name="Inter" class="com.Interceptor.MyInterceptor"> <!--传递name的参数 --> <param name="name">简单拦截器</param> </interceptor> </interceptors> <action name="loginaction" class="com.Interceptor.LoginAction"> <result name="success">/Interceptor/welcome.jsp</result> <result name="input">/Interceptor/error.jsp</result> &l