• SpringMVC学习笔记


    一、入门案例

    项目结构:

    controller包中是控制层代码:

    1. @Controller
    2. public class UserController {
    3. @RequestMapping("/save") //设置当前控制器方法请求访问路径
    4. @ResponseBody //设置返回值为响应内容
    5. public String save(){
    6. System.out.println("save running...");
    7. return "{'module':'springmvc'}";
    8. }
    9. }

    config包中是SpringMVC的配置类,扫描SpringMVC容器注入的Bean。

    1. @Configuration
    2. @ComponentScan("controller")
    3. public class SpringMvcConfig {
    4. }

    核心是一个Servlet容器配置类,该类可以继承自AbstractDispatcherServletInitializer类:

    1. public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    2. //加载SpringMVC容器配置
    3. @Override
    4. protected WebApplicationContext createServletApplicationContext() {
    5. AnnotationConfigWebApplicationContext context=new AnnotationConfigWebApplicationContext();
    6. context.register(SpringMvcConfig.class);
    7. return context;
    8. }
    9. //设置哪些请求归属SpringMVC处理,"/"表示处理所有请求
    10. @Override
    11. protected String[] getServletMappings() {
    12. return new String[]{"/"};
    13. }
    14. //加载Spring容器配置
    15. @Override
    16. protected WebApplicationContext createRootApplicationContext() {
    17. return null;
    18. }
    19. }

    为了简便开发,推荐继承自其子类AbstractAnnotationConfigDispatcherServletInitializer:

    1. public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    2. @Override
    3. protected Class[] getRootConfigClasses() {
    4. return new Class[0];
    5. }
    6. @Override
    7. protected Class[] getServletConfigClasses() {
    8. return new Class[]{SpringMvcConfig.class};
    9. }
    10. @Override
    11. protected String[] getServletMappings() {
    12. return new String[]{"/"};
    13. }
    14. }

    二、详解

    1. AbstractAnnotationConfigDispatcherServletInitializer

    WebApplicationInitializer是 Spring MVC 提供的一个接口,可确保检测到您的实现并自动用于初始化任何 Servlet 3 容器。AbstractAnnotationConfigDispatcherServletInitializer是WebApplicationInitializer的抽象实现类,该类将自动初始化Servlet容器。

    2. RequestMapping

    @RequestMapping注解可以添加在方法定义上或者类定义上,如果设置在类定义上表示访问该类下的方法的路径都需要加此前缀。

    三、请求与响应

    1. 几种请求参数

    1. 当函数参数名和请求参数名不同时,使用@RequestParam绑定参数
    1. @Controller
    2. public class UserController {
    3. @RequestMapping("/request")
    4. public void request(@RequestParam("name") String UserName){
    5. System.out.println(UserName);
    6. }
    7. }

    1. 当请求参数和实体类的属性一致时,可以为我们构造一个实体类对象:
    1. @Controller
    2. public class UserController {
    3. @RequestMapping("/request")
    4. public void request(User user){
    5. System.out.println(user);
    6. }
    7. }

    1. 数组类型
    1. @Controller
    2. public class UserController {
    3. @RequestMapping("/request")
    4. public void request(String[] hobbies){
    5. System.out.println(Arrays.toString(hobbies));
    6. }
    7. }

    1. 集合类型需要加@RequestParam注解
    1. @Controller
    2. public class UserController {
    3. @RequestMapping("/request")
    4. public void request(@RequestParam List hobbies){
    5. System.out.println(hobbies);
    6. }
    7. }

    2. JSON数据格式

    step1: 导入Jackson坐标:

    1. <dependency>
    2. <groupId>com.fasterxml.jackson.core</groupId>
    3. <artifactId>jackson-databind</artifactId>
    4. <version>2.13.3</version>
    5. </dependency>

    step2: 添加@EnableWebMvc开启自动转换json数据的支持

    1. @Configuration
    2. @ComponentScan("controller")
    3. @EnableWebMvc
    4. public class SpringMvcConfig {
    5. }

    1. 集合

    1. @Controller
    2. public class UserController {
    3. @RequestMapping("/request")
    4. public void request(@RequestBody List hobbies){
    5. System.out.println(hobbies);
    6. }
    7. }

    1. 实体类对象
    1. {
    2. "name":"张三",
    3. "age":18
    4. }

    1. @Controller
    2. public class UserController {
    3. @RequestMapping("/request")
    4. public void request(@RequestBody User user){
    5. System.out.println(user);
    6. }
    7. }

    1. 对象集合
    1. [
    2. {"name":"张三","age":18},
    3. {"name":"李四","age":20}
    4. ]

    1. @Controller
    2. public class UserController {
    3. @RequestMapping("/request")
    4. public void request(@RequestBody List list){
    5. System.out.println(list);
    6. }
    7. }

    3. 响应

    1. @Controller
    2. public class UserController {
    3. @RequestMapping("/jsp")
    4. public String JSPJump(){
    5. return "page.jsp";
    6. }
    7. @RequestMapping("/text")
    8. @ResponseBody
    9. public String ResponseText(){
    10. return "

      response text

      "
      ;
    11. }
    12. @RequestMapping("/jsonPOJO")
    13. @ResponseBody
    14. public User ResponseJsonPOJO(){
    15. User user=new User("张三",18);
    16. return user;
    17. }
    18. @RequestMapping("/jsonList")
    19. @ResponseBody
    20. public List ResponseJsonList(){
    21. List list=new ArrayList<>();
    22. list.add(new User("张三",18));
    23. list.add(new User("李四",20));
    24. return list;
    25. }
    26. }

    注:@ResponseBody设置当前控制器返回值作为响应体,由HttpMessageConverter接口完成类型转换

    四、REST风格

    1. 简介

    REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格,当我们想表示一个网络资源的时候,可以使用两种方式:

    • 传统风格资源描述形式
      • http://localhost/user/getById?id=1 查询id为1的用户信息
      • http://localhost/user/saveUser 保存用户信息
    • REST风格描述形式
      • http://localhost/user/1
      • http://localhost/user

    但是我们的问题也随之而来了,一个相同的url地址即可以是新增也可以是修改或者查询,那么到底我们该如何区分该请求到底是什么操作呢?

    • 按照REST风格访问资源时使用==行为动作==区分对资源进行了何种操作
      • http://localhost/users 查询全部用户信息 GET(查询)
      • http://localhost/users/1 查询指定用户信息 GET(查询)
      • http://localhost/users 添加用户信息 POST(新增/保存)
      • http://localhost/users 修改用户信息 PUT(修改/更新)
      • http://localhost/users/1 删除用户信息 DELETE(删除)

    请求的方式比较多,但是比较常用的就4种,分别是GET,POST,PUT,DELETE。

    2. 入门

    1. @Controller
    2. public class UserController {
    3. @RequestMapping(value="/users",method = RequestMethod.POST)
    4. public void save(@RequestBody User user){
    5. //代码逻辑
    6. }
    7. @RequestMapping(value="/users/{id}",method = RequestMethod.DELETE)
    8. public void delete(@PathVariable int id){
    9. //代码逻辑
    10. }
    11. @RequestMapping(value="/users",method=RequestMethod.PUT)
    12. public void update(@RequestBody User user){
    13. //代码逻辑
    14. }
    15. @RequestMapping(value="/users/{id}",method=RequestMethod.GET)
    16. public void getById(@PathVariable int id){
    17. //代码逻辑
    18. }
    19. }

    • 通过设置RequestMapping的method参数,即可设置请求方式
    • 如果访问路径中有参数,使用"/user/{参数名}",接收参数,必须使用@PathVariable绑定。如果函数参数和请求参数不同名,还需要再@PathVariable的参数中注明路径参数名,进行绑定。如下:
    1. @RequestMapping(value="/users/{id}",method = RequestMethod.DELETE)
    2. public void delete(@PathVariable("id") int userId){
    3. //代码逻辑
    4. }

    三个注解@RequestBody@RequestParam@PathVariable,这三个注解之间的区别和应用分别是什么?

    • 区别
      • @RequestParam用于接收url地址传参或表单传参
      • @RequestBody用于接收json数据
      • @PathVariable用于接收路径参数,使用{参数名称}描述路径参数
    • 应用
      • 后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
      • 如果发送非json格式数据,选用@RequestParam接收请求参数
      • 采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值

    3. 简化开发

    1. @Controller
    2. @RequestMapping("/users")
    3. public class UserController {
    4. @PostMapping
    5. public void save(User user){
    6. //代码逻辑
    7. }
    8. @DeleteMapping("/{id}")
    9. public void delete(@PathVariable("id") int userId){
    10. //代码逻辑
    11. }
    12. @PutMapping
    13. public void update(@RequestBody User user){
    14. //代码逻辑
    15. }
    16. @GetMapping("/{id}")
    17. public void getById(int id){
    18. //代码逻辑
    19. }
    20. }

    @ResponseBody注解也可以直接放在类定义上,且@RestController等同于@Controller与@ResponseBody两个注解组合功能

  • 相关阅读:
    CMake中include_directories的使用
    Python类的方法
    MySQL 数据库基础知识(系统化一篇入门)
    打点初级技巧
    商城分销机制怎么做?分销机制比例如何设定?
    【JAVA反射】Method类
    【python海洋专题四十三】海洋指数画法--单色渐变柱状图
    Spring(Spring的理解+DI+Spring的创建)
    django开发一个管理系统基于Python实现的高校宿舍管理系统
    通用考勤后台管理系统
  • 原文地址:https://blog.csdn.net/weixin_43590232/article/details/136533266