学堂 学堂 学堂公众号手机端

原力计划SpringMVC的请求处理流程及核心组件

lewis 1年前 (2024-04-13) 阅读数 13 #技术

前言:SpringMVC请求处理流程,核心组件,主要注解等知识是面试中经常被问到的问题,简单看了下之前看的视频的笔记,并结合自己的理解写下了这篇博客,希望能加深自己的印象以及帮助的诸位小伙伴儿们爛爛

如果有什么需要改进的地方还请大佬斧正

文章目录SpringMVC的请求处理流程


SpringMVC通过前端控制器(DispatcherServlet)拦截并处理用户请求

1.前端发送请求被前端控制器DispatcherServlet拦截
2.前端控制器调用处理器映射器HandlerMapping对请求的URL进行解析,解析之后返回调用给前端控制器
3.前端控制器调用处理器适配器处理调用链
4.处理器适配器HandlerAdapter基于反射通过适配器设计模式完成处理器(控制器Handler)的调用处理用户请求
5.处理器适配器HandlerAdapter将控制器返回的视图和数据信息封装成ModelAndView响应给前端控制器
6.前端控制器调DispatcherServlet调用视图解析器ViewResolver对ModelAndView进行解析,将解析结果(视图资源和数据)响应给前端控制器
7.前端控制器调用视图view组件将数据进行渲染,将渲染结果(静态视图)响应给前端控制器
8.前端控制器响应用户请求
SpringMVC的核心组件

DispatcherServlet 前端控制器、总控制器

作用:接收请求,调用其他组件处理用户的请求,协同各组件工作、响应请求

HandlerMapping 处理器映射器

作用:负责根据用户请求的URL找到对应的处理器Handler,在SpringMVC中会有很多请求,每个请求都需要一个Handler处理,具体接收到一个请求之后使用哪个Handler进行处理需要处理器映射器来匹配可配置 SpringMVC提供多个处理器映射的实现,可以根据需要进行配置

HandlerAdapter 处理器适配器

作用:按照处理器映射器解析的用户请求的调用链,通过适配器模式完成Handler的调用

Handler 处理器/控制器

由工程师根据业务的需求进行开发作用:处理请求

ModelAndView 视图模型

作用:用于封装处理器返回的数据以及相应的视图ModelAndView = Model + View

ViewResolver 视图解析器

作用:对ModelAndView进行解析可配置 SpringMVC提供多个视图解析器的实现,可以根据需要进行配置

View 视图

作用:完成数据渲染处理器映射器

不同的处理器映射器对URL处理的方式也不相同,使用对应的处理器映射器之后我们的前端请求规则也需要发生相应的变化

SpringMVC提供的处理器映射器:

BeanNameUrlHandlerMapping 根据控制器的ID访问控制器SimpleUrlHandlerMapping 根据控制器配置的URL访问(默认)

配置处理器映射器:

在SpringMVC的配置文件中通过bean标签声明处理器映射器

配置BeanNameUrlHandlerMapping

   <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>

配置SimpleUrlHandlerMapping

  <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/aaa">bookController</prop>
            <prop key="/bbb">studentController</prop>
        </props>
    </property>
</bean>
视图解析器

Spring提供了多个视图解析器:

UrlBasedViewResolverInternalResourceViewResolver

UrlBasedViewResolver 需要依赖jstl

添加JSTL的依赖

  <dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

配置视图解析器

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>

InternalResourceViewResolver

   <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"/>
    <property name="suffix" value=".jsp"/>
</bean>
SpringMVC的注解

@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径,用在方法上表示父类路径后面的内容。

@Controller
@RequestMapping("book")
public class  BookController  { 

    /*接收请求行数据*/
    @RequestMapping("/add") // 请求路径:/boot/add
    public String addBook(String name, String author, double price,HttpServletRequest request){ 
        System.out.println("---book add");

        request.setAttribute("key1","value1");
        request.setAttribute("book",new Book(1,"Java","老张",2.22));
        return "tips";
    }

    @RequestMapping("/add2")  //请求路径:/boot/add2
    public ModelAndView addBook2(String name, String author, double price){ 

        ModelAndView modelAndView = new ModelAndView("/tips.jsp");
        modelAndView.addObject("key2","value2");
        modelAndView.addObject("book",new Book(1,"C++","老张",2.22));
        return modelAndView;
    }
}

@RequestBody:注解实现接收http请求的json数据, 主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据) ,如果参数时放在请求体中,application/json传入后台的话,那么后台要用@RequestBody才能接收到, 即将json转换为java对象

@ResponseBody: @ResponseBody是作用在方法上的 ,@ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据, 即注解实现将conreoller方法返回对象转化为json对象响应给客户 。

@Resource和@Autowired:自动装配,@Resource和@Autowired都是做bean的注入时使用, @Autowired是Spring的注解,可以标注在属性上、方法上和构造器上,来完成自动装配 。默认是根据类型,spring自动将匹配到的属性值进行注入,而@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入,并且@Resource默认是名称查找

@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数

@RequestMapping("/user/{id}")
public String deleteById(@PathVariable("id") String id){ 
    System.out.println("通过id删除用户,id为:" +id);// 访问的时候只需要访问/user/所要删除的id即可,如.../user/1。
    return "success";
}

版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门