JAVA八股文面试必会-基础篇-2.2 SpringMVC框架

2.2.1 Spring MVC的主要组件

  1. 前端控制器 DispatcherServlet(不需要程序员开发)作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间 的耦合度。
  2. 处理器映射器HandlerMapping(不需要程序员开发) 作用:根据请求的URL来查找Handler
  3. 处理器适配器HandlerAdapter注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器 HandlerAdapter才可以正确的去执行Handler。
  4. 处理器Handler(需要程序员开发)
  5. 视图解析器 ViewResolver(不需要程序员开发) 作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)
  6. 视图View(需要程序员开发jsp) View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)

2.2.2 简单介绍下SpringMVC执行流程

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器 , 组成一个处理器链 , 一并返回给DispatcherServlet
  4. DispatcherServlet 调用 HandlerAdapter处理器适配器;
  5. HandlerAdapter 经过适配调用具体处理器(Handler,也叫后端控制器)
  6. Handler执行完成返回ModelAndView
  7. HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析
  9. ViewResolver解析后返回具体View
  10. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
  11. DispatcherServlet响应用户

2.2.3 Spring MVC常用的注解有哪些

  1. @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上
  2. @RequestBody:注解实现接收http请求的json数据,将json转换为java对象
  3. @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户
  4. @Controller:控制器的注解,表示是表现层,不能用用别的注解代替
  5. @RestController : 组合注解 @Conntroller + @ResponseBody
  6. @PathVariable : 接收请求路径中的参数
  7. @RequestParam : 接收请求参数
  8. @RequestHeader : 接收请求头数据
  9. @ExceptionHandler : 用于全局异常处理器, 指定补货具体类型的异常
  10. @ControllerAdvice: 主要用来处理全局数据,一般搭配@ExceptionHandler使用 , 进行异常处理
  11. @RestControllerAdvice : 组合注解@ControllerAdvice + @ResponseBody
  12. @CookieValue : 获取请求中指定名称的cookie值
  13. @SessionAttribute : 获取带session中属性值
  14. @CrossOrigin : 设置CROS跨域访问

2.2.4 SpringMVC怎么样设置重定向和转发?

实现转发 :

  1. 控制器直接返回视图名称
/**
* 指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/pages/success.jsp
*/
@RequestMapping("/str")
public String respStr(){
    System.out.println("aaaaaaaaaaaa");
    return "success";
}
  1. 使用forward关键字
@RequestMapping("/forward")
public String forward(User user,HttpSession session) throws ServletException, IOException {
    //将数据保存到session中
    session.setAttribute("logined", user);
    return "forward:/WEB-INF/pages/success.jsp";
}
  1. 使用request请求对象实现转发
@RequestMapping("/str")
public void respStr(User user,  HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    System.out.println("aaaaaaaaaaaa");
    request.setAttribute("logined",user);
    request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
}

实现重定向 :

  1. 使用redirect关键字
@RequestMapping("/redirect")
public String redirect(User user,HttpSession session) throws ServletException, IOException {

    //将数据保存到session中
    session.setAttribute("logined", user);

    return "redirect:/index.jsp";
}
  1. 使用response对象实现重定向
@RequestMapping("/void")
public void respStr(User user,  HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    //业务操作...
    response.sendRedirect(request.getContextPath()+"/index.jsp");
}

2.2.5 拦截器和过滤器的区别

拦截器和过滤器都可以对请求进行拦截,都可以体现例如权限的检查、日志的记录等功能。但是有不同之处:

  1. 使用范围不同:拦截器是在SpringMVC提供的 , 拦截的是SpringMVC的控制器 , 而filter是Servlet规范规定的,是Servlet容器支持的 , 拦截的是所有的web资源
  2. 执行顺序不同:过滤器只能在web项目中使用,它的执行顺序是由web.xml文件中的配置决定的;而拦截器可以在任何Java类中使用,它的执行顺序是由Spring容器管理的

2.2.6 你们项目中异常是怎么控制的 ?

我们会根据不同的异常情况定义异常类 , 异常类实现RuntimeException接口 , 然后在需要进行异常处理的位置对外抛出对应异常

在项目中定义全局异常处理类 , 使用@ControllerAdvice  +  @ExceptionHandler 捕获指定异常 , 处理异常 , 向客户端响应提示信息

package com.heima.common.exception;


import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice  //控制器增强类
@Slf4j
public class ExceptionCatch {

    /**
     * 处理不可控异常
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseResult exception(Exception e){
        e.printStackTrace();
        log.error("catch exception:{}",e.getMessage());

        return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR);
    }

    /**
     * 处理可控异常  自定义异常
     * @param e
     * @return
     */
    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public ResponseResult exception(CustomException e){
        log.error("catch exception:{}",e);
        return ResponseResult.errorResult(e.getAppHttpCodeEnum());
    }
}

  • 31
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉迪恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值