[toc]
三大组件
servlet , filter,listener
使用注解
@WebServlet
@WebListener
@WebFIlter
三个注解是servlet3.0提出的完全可以替代这个web.xml
servlet
servlet 一般和jsp使用,
@WebServlet(name = "ServletTest1",urlPatterns = "/say")
public class ServletTest1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
// 和普通的servlet相同的使用
}
}
或者使用配置@Configration
@Bean
public ServletRegistrationBean servletRegistrationBean1() {
return new ServletRegistrationBean(new MyServlet(), "/servlet/myServlet");// ServletName默认值为首字母小写,即myServlet
}
filter
@WebFilter(urlPatterns = "/*",filterName = "filterTest")
public class FilterTest implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)servletRequest;
HttpServletResponse resp=(HttpServletResponse)servletResponse;
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
interceptor
- 创建过程:
1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
3、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。
public class InterceptorTest implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
// 写入处理程序 true 代表可以通过, false代表无法通过
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
// 添加
@Configuration
public class webMveConf extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new InterceptorTest()).addPathPatterns("/jia");
super.addInterceptors(registry);
}
}
方法介绍:
– preHandle方法:进入Handler方法之前执行。可以用于身份认证、身份授权。比如如果认证没有通过表示用户没有登陆,需要此方法拦截不再往下执行(return false),否则就放行(return true)。
– postHandle方法:进入Handler方法之后,返回ModelAndView之前执行。可以看到该方法中有个modelAndView的形参。应用场景:从modelAndView出发:将公用的模型数据(比如菜单导航之类的)在这里传到视图,也可以在这里同一指定视图。
– afterCompletion方法:执行Handler完成之后执行。应用场景:统一异常处理,统一日志处理等。
注意
对于上面的servlet类的调用来说,
我使用时 filter 可以定向到servlet类并调用成功, 但是interceptor只能调用到@Controller的声明的@RequestMapping 里面
然后使用@@RequestMapping测试优先级是filter先调用 然后才是interceptor
区别
从以上分析可以看到过滤器和拦截器实现的方式的不同. Filter是利用了方法的调用(入栈出栈)完成整个流程, 而Interceptor是利用了for循环完成了整个流程.
Filter的实现比较占用栈空间, 在Filter多的情况下可能会有栈溢出的风险存在.
Interceptor的实现逻辑更加的清晰简单
Filter组件更加的通用, 只要支持java servlet的容器都可以使用, 而Interceptor必须依赖于Spring
Filter的优先级是高于Interceptor, 即请求是先到Filter再到Interceptor的, 因为Interceptor的实现主体还是一个servlet
发表回复