SpringMVC的注解

举报
酸菜鱼. 发表于 2022/09/11 17:16:07 2022/09/11
【摘要】 SpringMVC的请求处理流程SpringMVC通过前端控制器(DispatcherServlet)拦截并处理用户请求1.前端发送请求被前端控制器DispatcherServlet拦截2.前端控制器调用处理器映射器HandlerMapping对请求的URL进行解析,解析之后返回调用给前端控制器3.前端控制器调用处理器适配器处理调用链4.处理器适配器HandlerAdapter基于反射通过...

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提供了多个视图解析器:

  • UrlBasedViewResolver
  • InternalResourceViewResolver
  • 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";
}

文章到这里就结束了,以后还会记录一些其他的知识,喜欢的大佬可以多多支持哦😉😉。
如果有什么疑问的地方请指出,诸佬们一起讨论🍻🍻
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。