1. SpringMVC的拦截器和过滤器的区别与联系
拦截器与过滤器的区别 :
拦截器是基于java的反射机制的,而过滤器是基于函数回调。
拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。
2. 面试官:谈谈过滤器和拦截器的区别
拦截器与过滤器的区别如下:
功能与作用范围:
执行时机与位置:
配置方式:
应用场景:
总结:拦截器和过滤器在Java Web开发中各有其独特的功能和应用场景。拦截器主要用于控制Action的执行流程,而过滤器则用于管理所有web资源请求。开发者应根据实际需求选择合适的技术进行应用。
3. SpringMVC的拦截器和过滤器的区别与联系
首先给介绍下过滤器和拦截器的区别:
(1)拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
(2)拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
(3)拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
(4)拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
(5)在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
(6)拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,
可以调用业务逻辑。
然后进行分析下:
1.过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处
理,并且在请求结束返回给前端这之间进行后期处理。
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("before...");
chain.doFilter(request, response);
System.out.println("after...");
}
chain.doFilter(request, response);这个方法的调用作为分水岭。事实上调用Servlet的doService()方法是在
chain.doFilter(request, response);这个方法中进行的。
2.拦截器是被包裹在过滤器之中的。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
a.preHandle()这个方法是在过滤器的chain.doFilter(request, response)方法的前一步执行,也就是在
[System.out.println("before...")][chain.doFilter(request, response)]之间执行。
b.preHandle()方法之后,在return ModelAndView之前进行,可以操控Controller的ModelAndView内容。
c.afterCompletion()方法是在过滤器返回给前端前一步执行,也就是在[chain.doFilter(request, response)]
[System.out.println("after...")]之间执行。
3.SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法
中执行的。所以过滤器、拦截器、service()方法,dispatc()方法的执行顺序应该是这样的如下图:
4. Java-springmvc 和struct2介绍(详解)
Java-SpringMVC 和 Struts2 介绍(详解)SpringMVCSpringMVC 是一个基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。它按照Model-View-Controller的设计模式将Web层进行职责解耦,把Web层进行解耦分成模型(Model)、视图(View)和控制器(Controller)三部分。SpringMVC通过一套MVC框架,将三者进行分离,使得开发者能够使用更加简洁明了的方式进行Web层的开发。
核心组件:
DispatcherServlet:前端控制器,负责接收请求并分发到相应的处理器。
HandlerMapping:处理器映射器,根据请求的URL找到对应的处理器。
HandlerAdapter:处理器适配器,将处理器包装成适配器,以便执行处理器。
ViewResolver:视图解析器,根据逻辑视图名解析成真正的视图对象。
执行流程:
客户端请求:用户发送请求到前端控制器DispatcherServlet。
HandlerMapping:DispatcherServlet通过HandlerMapping找到处理请求的处理器(Controller)。
HandlerAdapter:DispatcherServlet通过HandlerAdapter调用处理器进行业务处理。
处理器返回ModelAndView:处理器处理完业务后,返回一个ModelAndView对象,其中包含了视图名或视图对象和模型数据。
ViewResolver:DispatcherServlet通过ViewResolver解析视图名,找到真正的视图对象,进行视图渲染。
响应客户端:视图对象将渲染结果返回给客户端。
优势:
轻量级:SpringMVC是Spring框架的一部分,它使用了Spring的IoC容器和AOP(面向切面编程)等特性,使得开发更加简洁。
灵活性:SpringMVC提供了丰富的配置选项和扩展点,开发者可以根据需要进行自定义。
与Spring无缝集成:SpringMVC与Spring框架无缝集成,可以使用Spring的各种特性,如事务管理、依赖注入等。
支持多种视图技术:SpringMVC支持JSP、Velocity、Freemarker等多种视图技术,开发者可以根据需要选择合适的视图技术。
Struts2 是一个基于MVC设计模式的Web应用框架,它采用了拦截器的机制来处理用户的请求。Struts2是Struts1和WebWork技术的合并,它吸收了Struts1和WebWork两者的优势,成为了一个功能强大且易于扩展的Web框架。
MVC对应关系:
V(视图):JSP+OGNL。OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于在JSP页面中访问和操作对象图中的数据。
C(控制器):Action类。Action类负责接收用户请求、处理业务逻辑并返回结果。
M(模型):JavaBean+ModelDriven。JavaBean用于封装业务数据,ModelDriven接口用于将用户表单提交的数据封装到对应的JavaBean中。
核心组件:
struts.xml:Struts2的配置文件,用于配置Action、拦截器、结果类型等。
核心过滤器StrutsPrepareAndExecuteFilter:Struts2的核心过滤器,负责拦截用户请求并进行预处理和分发。
拦截器:Struts2提供了丰富的拦截器,用于在Action执行前后进行各种处理,如输入验证、权限检查等。
执行流程:
客户端请求:用户发送请求到服务器。
核心过滤器拦截:Struts2的核心过滤器StrutsPrepareAndExecuteFilter拦截用户请求。
预处理:核心过滤器进行预处理,如创建ActionContext和ValueStack对象,解析请求参数等。
找到Action:根据struts.xml配置文件找到对应的Action类。
执行拦截器:执行Action类之前,先执行配置的拦截器。
执行Action:执行Action类的方法,处理业务逻辑。
返回结果:Action方法处理完业务后,返回一个结果字符串,根据结果字符串找到对应的视图进行渲染。
响应客户端:视图对象将渲染结果返回给客户端。
优势:
强大的拦截器机制:Struts2提供了丰富的拦截器,开发者可以根据需要进行自定义拦截器,实现各种功能。
易于扩展:Struts2的插件机制使得开发者可以轻松地扩展框架的功能。
支持多种视图技术:Struts2支持JSP、Velocity、Freemarker等多种视图技术,开发者可以根据需要选择合适的视图技术。
与Spring等框架集成:Struts2可以与Spring等框架进行集成,实现更加灵活和强大的功能。
综上所述,SpringMVC和Struts2都是优秀的Java Web框架,它们各自具有独特的特点和优势。开发者在选择框架时,应根据项目的具体需求和团队的技术储备进行选择。