一、SpringMVC 中的 MVC 思想是什么?
MVC(Model-View-Controller)是一种软件设计模式,常用于构建Web应用程序。在Spring MVC中,MVC思想指的是将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。
1. 模型(Model):模型代表应用程序的数据和业务逻辑。它负责处理数据的读取、更新和存储等操作,并为控制器提供数据。
2. 视图(View):视图是用户界面的一部分,负责展示数据给用户。它通常使用HTML、CSS和JavaScript来呈现数据,并向用户提供交互功能。
3. 控制器(Controller):控制器是模型和视图之间的协调者,处理用户的请求,并调用适当的模型来处理业务逻辑,然后选择合适的视图来展示数据给用户。控制器还处理用户和应用程序之间的交互,例如响应用户的表单提交。
MVC思想的核心概念是将应用程序的不同部分分离,以实现代码的重用性、可维护性和可扩展性。通过将数据、业务逻辑和用户界面分开,MVC模式使开发人员可以更好地组织和管理复杂的Web应用程序。在Spring MVC中,通过使用注解和配置来定义模型、视图和控制器,以实现应用程序的逻辑。
二、SpringMVC 的执行流程是怎样的?
由上图所示,MVC 的执行流程如下:
1、客户端发送请求到 DispatcherServlet 中央控制器
2、调用处理器映射器 HandlerMappering
3、访问拦截器 HandlerInterceptor
4、如果拦截器放行,通过处理器适配器调用具体的处理器
5、调用处理器 controller
6、处理器返回 Model and View 给处理器适配器
7、处理器适配器将 Model and view 返回给中央控制器 DispatcherServlet
8、中央控制器将 model and view 在视图解析器中进行解析
9、视图解析器解析完毕之后将 view 返回给中央控制器
10、中央控制器将视图渲染在页面上
11、最后将页面结果相应给用户
三、SpringMVC 的常用注解有哪些?
Spring MVC中常用的注解包括以下几种:
1. @Controller:用于标识控制器类,处理请求并返回视图。
2. @RequestMapping:用于映射请求URL到处理器方法。可以在类级别或方法级别使用,用于指定请求URL的路径。
3. @GetMapping:简化的@RequestMapping,用于处理GET请求。
4. @PostMapping:简化的@RequestMapping,用于处理POST请求。
5. @PutMapping:简化的@RequestMapping,用于处理PUT请求。
6. @DeleteMapping:简化的@RequestMapping,用于处理DELETE请求。
7. @PathVariable:用于从URL中获取变量值,可将URL中的某一部分映射到方法的参数上。
8. @RequestParam:用于从请求参数中获取变量值。
9. @RequestBody:用于将请求体的内容绑定到方法的参数上。
10. @ResponseBody:用于将方法的返回值直接作为响应体内容返回给客户端。
11. @ModelAttribute:用于将请求参数绑定到对象上,并将对象添加到模型中。
12. @Valid:用于验证绑定对象,并触发验证器进行数据验证。
13. @InitBinder:用于初始化数据绑定器,可以用来自定义数据绑定的规则。
14. @ExceptionHandler:用于处理控制器中出现的异常,可以针对特定的异常类型进行处理。
15. @ControllerAdvice:结合@ExceptionHandler注解在一个类中定义全局异常处理器。
16. @@CrossOrigin:开启跨域。
以上是Spring MVC中常用的注解,它们提供了便捷的方式来处理和映射请求,简化了控制器的编写和配置工作。
四、SpringMVC 如何进行异常处理?
在Spring MVC中进行异常处理可以通过以下几种方式:
1. 全局异常处理器:可以使用@ControllerAdvice注解,结合@ExceptionHandler注解在一个类中定义全局异常处理器。在这个类中,可以定义多个方法,每个方法使用@ExceptionHandler注解来处理不同的异常类型。当发生异常时,全局异常处理器会根据异常类型选择对应的方法来处理异常,并返回自定义的错误页面或错误信息。
2. 控制器异常处理:在控制器类或指定方法上使用@ExceptionHandler注解来处理异常。当该控制器或方法发生指定的异常时,会调用对应的@ExceptionHandler方法来处理异常,并返回自定义的错误页面或错误信息。
3. 异常处理器返回JSON数据:可以在全局异常处理器或控制器的@ExceptionHandler方法上使用@ResponseBody注解,将处理的结果以JSON数据的形式返回给客户端。这适用于前后端分离的情况下。
4. 使用@ResponseStatus注解:可以在自定义异常类上使用@ResponseStatus注解,指定特定的HTTP状态码和原因短语。当抛出该异常时,Spring MVC会自动返回相应的HTTP响应。
5. 异常处理器接口:实现HandlerExceptionResolver接口,自定义异常处理器,重写resolveException方法来处理异常。可以根据具体的异常类型,选择不同的异常处理策略。
@Component
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
/**
*
* @param httpServletRequest request对象
* @param httpServletResponse response对象
* @param o 出现异常的Controller对象
* @param e 异常
* @return
*/
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o,
Exception e) {
//1、可以通过异常的类型,来做出不同处理
// if(e instanceof LongException){
// modelAndView.setViewName("error");
// }else if(e instanceof OrderException){
// modelAndView.setViewName("error");
// }else if(e instanceof PayException){
// modelAndView.setViewName("error");
// }
//2、前端分离项目。通过响应流进行进行响应
//httpServletResponse.getWriter().write(json)
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("error");
//打印异常信息
e.printStackTrace();
return modelAndView;
}
}
无论采用哪种方式,异常处理器都可以处理控制器层面的异常,并对异常进行统一的处理和响应。通过合理的异常处理,可以提高应用程序的健壮性和用户体验。
五、SpringMVC 如何配置拦截器,拦截器和过滤器之间的区别是什么?
在Spring MVC中配置拦截器可以通过以下步骤:
1. 创建拦截器类:创建一个实现HandlerInterceptor接口的拦截器类,实现preHandle、postHandle和afterCompletion方法,用于在请求处理前、请求处理后和视图渲染完成后执行相应的操作。
public class LoginInterceptor implements HandlerInterceptor { //AOP
@Override
public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
System.out.println("进入到Handler之前执行【进行拦截操作】");
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if(loginUser == null){
response.sendRedirect(request.getContextPath()+"/pages/login.jsp");
return false;
}
return true; //是否放行 false表示不放行 true放行
}
@Override
public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("进入到Handler之后执行【进行后续操作】");
}
@Override
public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("当请求成功之后数据渲染完成执行【资源释放】");
}
}
2. 配置拦截器:在配置文件中(如XML配置文件或Java配置类)配置拦截器。可以通过实现WebMvcConfigurer接口并重写addInterceptors方法,或者使用@Configuration和@Bean注解配置拦截器,将拦截器添加到拦截器链中。
@Configuration //表示当前类是一个配置类
public class MyWebConfig implements WebMvcConfigurer {
@Autowired
//配置的拦截器类
private LoginInterceptor loginInterceptor;
//文件上传配置
//添加虚拟路径,相同于通过一个路径来访问本地磁盘上的内容
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/image/**")
.addResourceLocations("file:D:\\upload\\");
}
@Override
//跨域配置
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") //请求的资源 /**表示所有资源 、
.allowedOrigins("*") //允许指定的源能访问
.allowedHeaders("*") //允许携带的请求头
.allowedMethods("*"); //允许的请求方式
// 注意:当设置允许携带Cookie不允许将指定源设置为所有
}
@Override
//拦截器配置
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor) //添加拦截器类
.excludePathPatterns("/")
//.addPathPatterns("/**") //添加拦截的路径
.excludePathPatterns("/user/**");//添加排除路径
// .addPathPatterns("/shoppingCarts/**")
// .addPathPatterns("/orders/**");
}
}
3. 设置拦截路径:在配置文件中指定需要拦截的路径或URL模式,可以使用ant风格或正则表达式,以指定哪些请求需要被该拦截器拦截。
<!-- SpringMVC拦截器配置(可以设置多个拦截器,顺序有关系,从前往后依次过滤)-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 设置拦截的路径 (可以设置多个) /* 只能拦截/下的路径,不能拦截子路径 /**表示所有请求 -->
<mvc:mapping path="/**"/>
<!-- 排除拦截的路径 (可以设置多个) -->
<mvc:exclude-mapping path="/user/login"/>
<bean class="com.qf.controller.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器和过滤器之间的区别如下:
1. 触发时机:拦截器是在请求处理的前后触发,可以对请求进行预处理和后处理;而过滤器是在请求到达Servlet之前或响应返回客户端之前触发。
2. 对象范围:拦截器是针对Handler(Controller)级别的,它只能拦截处理器方法的调用;而过滤器是对Servlet容器级别的,它可以拦截整个请求响应链。
3. 依赖关系:拦截器依赖于Servlet容器,例如Spring MVC中的DispatcherServlet;而过滤器是独立于Servlet容器的,可以在任何符合Servlet规范的容器中使用。
4. 功能定位:拦截器主要用于业务逻辑的处理,可以在请求前或请求后进行处理、日志记录、权限校验等;而过滤器主要用于请求过滤,可以对请求和响应进行过滤、处理编码、安全验证等。
总之,拦截器和过滤器都是用于在Web应用中对请求进行处理的组件,但它们的触发时机、对象范围和功能定位不同。在实际开发中,可以根据具体需求选择使用拦截器还是过滤器。