文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

史上最全的SpringMVC教程,终于整理出来了

2023-10-25 09:57

关注

1. 为啥要学 SpringMVC?

1.1 SpringMVC 简介

在学习 SpringMVC 之前我们先看看在使用 Servlet 的时候我们是如何处理用户请求的:

  1. 配置web.xml
                userServlet         com.xxl.controller.UserServlet                userServlet        /user      复制代码
  1. 继承 HttpServlet,实现 doGet 和 doPost 方法
public class UserServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {       // 这里用来处理用户的 get 请求       System.out.println("哈哈哈哈哈哈我头上有注解");    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        // 这里用来处理用户的 post 请求        System.out.println("接收到用户的 post 请求");    }}复制代码
  1. 获取请求参数
String name = request.getParameter("name");String age = request.getParameter("age");....复制代码

一顿操作下来,我们发现用 Servlet 处理用户的请求也太麻烦了吧。

每个 Servlet 都要继承 HttpServlet、重写两个方法,我们需要写一堆 getParameter() 方法来获取请求参数,而且还要做数据类型的转换。

那有没有一个别人封装好的工具或者是框架让我少写这些重复性的代码呢?

SpringMVC闪亮登场。

SpringMVC 是一种轻量级的、基于 MVC 的 Web 层应用框架,它属于 Spring 框架的一部分。SpringMVC 说白了就是对 Servlet 进行了封装,方便大家使用。

1.2 SpringMVC 优点

总之就是好用!

2. HelloWorld

这里我们先来开发一个基于 SpringMVC 的程序,感受一下 SpringMVC 的迷人特性。

2.1 新建基于 Maven 的 web 项目

2.2 加入依赖

    javax.servlet    javax.servlet-api    4.0.1    org.springframework    spring-webmvc    5.2.8.RELEASE    junit    junit    4.11    test复制代码

2.3 创建中央调度器

DispatcherServlet 是 SpringMVC 的中央调度器,它主要负责加载 SpringMVC 的配置。

从它的名字来看,他也属于一个 Servlet,遵守 Servlet 规范。所以我们需要在 web.xml 中创建 DispatcherServlet。

web.xml

                SpringMVC        org.springframework.web.servlet.DispatcherServlet                    contextConfigLocation            classpath:springmvc.xml                1                SpringMVC        /    复制代码

2.4 创建 SpringMVC 的配置文件

这里我们在 src/resources 资源目录下创建 SpringMVC的配置文件 springmvc.xml,该文件名字可以任意命名。

springmvc.xml:

复制代码

2.5 创建处理请求的处理器

TestController:

@Controllerpublic class TestController {  @RequestMapping("/hello")  public ModelAndView sayHello() {      ModelAndView mv = new ModelAndView();      mv.addObject("msg", "你好啊,李银河,我是王小波。");      mv.setViewName("/hello.jsp");      return mv;  }}复制代码

2.6 声明组件扫描器

我们在 springmvc.xml 中注册组件扫描器,

复制代码

2.7 创建 jsp 页面

2.8 配置视图解析器

我们需要在 springmvc.xml 中配置请求文件的路径和文件后缀。

    复制代码

2.9 修改处理器请求文件路径

因为我们指定了请求文件的后缀是 .jsp,所以这里可以省略。

2.10 配置 tomcat,启动项目测试

正在上传…重新上传取消正在上传…重新上传取消

正在上传…重新上传取消正在上传…重新上传取消

3. 请求

3.1 @RequestMapping

@RequestMapping 注解用来指定处理哪些 URL 请求。

3.1.1 注解常用属性

  1. value

value 用来表示请求的 url,可以省略不写

@RequestMapping(value = "/hello")复制代码

简写

@RequestMapping("/hello")复制代码
  1. method

method 用来表示请求方式,不写的话默认是 GET 请求。常用的请求方式:

POST、GET、PUT、DELETE复制代码

如果使用 method 属性,不能省略 value 属性。

@RequestMapping(value = "/hello",method = RequestMethod.GET)  public ModelAndView sayHello() {      ModelAndView mv = new ModelAndView();      mv.addObject("message", "你好啊,李银河,我是王小波。");      mv.setViewName("/hello");      return mv;}复制代码

3.1.2 标记位置

  1. 标记在类上面

一个系统包含很多模块,例如用户、商品、订单等模块。

我们需要为不同的模块定义不同的类,然后在类上面添加 @RequestMapping 注解,表示这个模块下面统一的请求路径:例如:

// 用户操作控制器@Controller@RequestMapping("/user")public class UserController {}// 订单操作控制器@Controller@RequestMapping("/order")public class OrderController {}...复制代码
  1. 标记在方法上面

每个模块都有很多方法,例如增删改查等。所以我们一般会在相应的方法上面添加 @RequestMapping 注解,表示请求这个模块下的某个方法,例如:

@Controller@RequestMapping("/user")public class UserController { @RequestMapping("/list")    public Object list() {      return null;    }    @RequestMapping(value = "/add",method = RequestMethod.POST)    public Object add() {        return null;    }    @RequestMapping(value = "/update",method = RequestMethod.POST)    public Object update() {        return null;    }    @RequestMapping(value = "/delete",method = RequestMethod.DELETE)    public Object delete() {        return null;    }}复制代码

所以当我们获取用户列表信息时,我们请求的后台接口的 url 就是:

ip地址:端口号/项目名/uset/list//例如:localhost:8080/ems/user/list复制代码

3.1.3 @RequestMapping 的缩写注解

方法上关于不同请求方式的注解都比较长,例如:

 @RequestMapping(value = "/add",method = RequestMethod.POST)复制代码

SpringMVC 为我们提供了简化写法:

GET请求:

@GetMapping("/list")复制代码

POST 请求:

@PostMapping("/login")复制代码

DELETE 请求:

@DeleteMapping("/delete/{id}")复制代码

PUT 请求

@PutMapping("/update")复制代码

3.2 接收请求参数

3.2.1 接收多个参数

@PostMapping("/login")public Result login(String username,String password) {        User user = userService.login(username, password);        return Result.success(user);    }复制代码

3.2.2 实体类作为参数

Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。

@PostMapping("/login")public Result login(User user){    User user = userService.login(user.getUsername(), user.getPassword);    return Result.success(user);}复制代码

3.2.3 @RequestParam 注解

使用 @RequestParam 可以把请求参数传递给请求方法。

属性:

  1. value:参数名
  2. required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常
  3. defaultValue: 默认值,当没有传递参数时使用该值
@PostMapping("/login")public Result login(@RequestParam String username, @RequestParam String password) {    User user = userService.login(username, password);    return Result.success(user);}复制代码

3.2.4 @PathVariable 注解

通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中。

URL 中的 {xxx} 占位符可以通过 @PathVariable("xxx")绑定到操作方法的入参中。

@DeleteMapping(value = "/delete/{id}")public Result delete(@PathVariable("id") int id) {    userService.remove(id);    return Result.success();}复制代码

3.3 解决中文乱码

请求参数如果含有中文,会出现中文乱码问题。我们可以通过在 web.xml 中配置字符过滤器来解决中文乱码问题。

   encodingFilter   org.springframework.web.filter.CharacterEncodingFilter               encoding            UTF-8                  forceEncoding            true      encodingFilter       response.setContentType("text/html;charset=utf8");    PrintWriter writer = response.getWriter();    writer.print("祝大家五一快乐");    writer.flush();    writer.close();}复制代码

5. 访问静态资源

我们在 web.xml 中配置 url-pattern 为 /,当我们请求项目的静态资源的时候,SpringMVC 的中央调度器会先根据处理器映射器寻找相应的处理器,结果没找到,所以请求静态资源会报 404。

我们可以使用 mvc:resources 标签来解决无法访问静态资源的问题。

但是 DispatcherServlet 的映射路径为 /,而 Tomcat 默认的 Servlet 的映射路径也为/,所以 DispatcherServlet 会覆盖 Tomcat 中默认的 Servlet,去处理除 jsp 之外的所有资源,导致静态资源无法被访问。

所以这里还需要结合另外一个标签使用:

                                                复制代码

测试:

8. SpringMVC 执行流程

Tomcat 服务器启动的时候会立即创建 DispatcherServlet(中央调度器),同时会创建 SpringMVC 容器。

SpringMVC 容器初始化的时候会先根据配置文件中的组件扫描器先扫描一下哪些类上面有 @Controller 注解,并将这些类作为处理器类。

然后通过 @RequestMapping 注解生成对应的映射关系。这些对应关系由处理器映射器管理。

当收到用户的请求,中央调度器将请求转发给处理器映射器。

处理器映射器根据用户请求的 URL 从映射关系中找到处理该请求的处理器,然后封装成处理器执行链返回给中央处理器。

中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器,处理器适配器调用执行处理器。

处理器将处理结果及要跳转的视图封装到 ModelAndView 中,并将其返回给处理器适配器。

处理器适配器直接将结果返回给中央调度器,中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。

视图解析器将封装了的视图对象返回给中央调度器,中央调度器调用视图对象,填充数据,生成响应对象。

中央调度器将结果响应给浏览器。

 

来源地址:https://blog.csdn.net/m0_69305074/article/details/124619703

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯