拦截器
FirstInterceptor.java
package com.jxust.springmvc.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class FirstInterceptor implements HandlerInterceptor {
/**
* 渲染视图之后被调用 ,释放资源
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("[FirstInterceptor] afterCompletion");
}
/**
* 调用目标方法之后,渲染视图之前
* 可以对请求域中的属性和视图作出修改
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("[FirstInterceptor] postHandle");
}
/**
* 该方法在目标方法之前被调用
* return true 则继续调用后续的拦截器和目标方法
* return false 当前和后续的拦截器都不会执行
* 可以考虑做权限,日志,事务等 ,乱码处理
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("[FirstInterceptor] preHandle");
/*arg0.setCharacterEncoding("utf-8");//设置请求的字符编码
//对用户是否登录进行判断
if(arg0.getSession().getAttribute("user")==null){
//没有登录,跳转到login.jsp
arg0.getRequestDispatcher("/login.jsp").forward(arg0, arg1);;
return false;
}*/
return true;
}
}
SecondInterceptor.java
package com.jxust.springmvc.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class SecondInterceptor implements HandlerInterceptor {
/**
* 渲染视图之后被调用 ,释放资源
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("[SecondInterceptor] afterCompletion");
}
/**
* 调用目标方法之后,渲染视图之前
* 可以对请求域中的属性和视图作出修改
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("[SecondInterceptor] postHandle");
}
/**
* 该方法在目标方法之前被调用
* return true 则继续调用后续的拦截器和目标方法
* return false 当前和后续的拦截器都不会执行
* 可以考虑做权限,日志,事务等
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("[SecondInterceptor] preHandle");
return true;
}
}
拦截器配置
.
.
<!--配置自定义的拦截器 -->
<mvc:interceptors>
<bean class="com.jxust.springmvc.interceptors.FirstInterceptor"></bean>
<!-- 配置拦截器(不)作用的路径 -->
<mvc:interceptor>
<mvc:mapping path="/emps"/>
<mvc:exclude-mapping path="/hello"/>
<bean class="com.jxust.springmvc.interceptors.SecondInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
.
.
return false ,则指定的方法(或所有)将不能执行
执行顺序
像收费站的模式,依次通过收费站1,收费站2,返回的时候,先通过收费站2,在通过收费站1,多个类似。
3个方法的作用顺序,正序,反序,反序
[FirstInterceptor] preHandle
[SecondInterceptor] preHandle
[SecondInterceptor] postHandle
[FirstInterceptor] postHandle
[SecondInterceptor] afterCompletion
[FirstInterceptor] afterCompletion
---------------------------------------------
如果 SecondInterceptor的preHandle为false
[FirstInterceptor] preHandle
[SecondInterceptor] preHandle
[FirstInterceptor] afterCompletion
如果其中一个拦截器设置了preHandler为return false,就不需要释放资源了
return true的拦截器,需要释放资源
拦截器和过滤器的区别
- 过滤器Filter依赖于Servlet容器,基于回调函数,过滤范围大,可以过滤请求和资源等
拦截器Interceptor 依赖于框架容器,基于反射机制,只过滤请求
拦截器的作用:可以处理Web应用中请求的一些通用性问题,共性问题在拦截器中处理,可以减少重复代码,便于维护
回调函数
⑴定义一个回调函数;
⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。
声明一个函数给调用者,发生特定条件时执行的某个行为,行为就是该声明的函数的执行。
之所以把函数交给调用者,主要是依靠它的特定功能(检测某个事件发生等等);商店买东西,没货,我留电话,到货通知我,就是类似的流程。
当程序跑起来时,一般情况下,应用程序(application program)会时常通过API调用库里所预先备好的函数。但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)。…….
反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
动态语言的特点
程序运行时,允许改变程序结构或变量类型