[SpringMVC]请求与响应①(映射路径、请求参数)

‍博客主页:⚠️十八岁讨厌编程⚠️
所属专栏:SpringMVC专栏
写文目的:记录学习中的知识点
目前已更新内容涵盖:【前端】、【后端】、【人工智能】、【数据分析】、【网络爬虫】、【数据结构与算法】、【PS】、【计算机数学】等几个大方面
如果这篇文章对你有帮助,欢迎❤️关注点赞收藏留言,看到我会积极回复。


[SpringMVC]请求与响应①(映射路径、请求参数)_第1张图片

文章目录

  • ️‍请求映射路径
    • 问题引入
    • 问题分析
    • 设置映射路径
      • 方法一
      • 方法二
    • 总结
  • ️‍请求参数
    • ⚽️GET发送单个参数
    • ⚽️GET发送多个参数
    • ⚽️GET请求中文乱码
    • ⚽️POST发送参数
    • ⚽️POST请求中文乱码

️‍请求映射路径

问题引入

我们现在考虑一个问题,那就是如果我们两个不同的Controller使用了同一个请求路径会发生什么?

@Controller
public class UserController {

    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'module':'user save'}";
    }
    
    @RequestMapping("/delete")
    @ResponseBody
    public String save(){
        System.out.println("user delete ...");
        return "{'module':'user delete'}";
    }
}

@Controller
public class BookController {

    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("book save ...");
        return "{'module':'book save'}";
    }
}

不用质疑肯定是会报错的,假设你访问localhost/save,那页面到底跟我们呈现哪一个模块里面的语句,是UserController还是BookController?

问题分析

团队多人开发,每人设置不同的请求路径,冲突问题该如何解决?

解决思路:为不同模块设置模块名作为请求路径前置

对于Book模块的save,将其访问路径设置http://localhost/book/save

对于User模块的save,将其访问路径设置http://localhost/user/save

这样在同一个模块中出现命名冲突的情况就比较少了。

设置映射路径

方法一

我们直接修改路径:

@Controller
public class UserController {

    @RequestMapping("/user/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'module':'user save'}";
    }
    
    @RequestMapping("/user/delete")
    @ResponseBody
    public String save(){
        System.out.println("user delete ...");
        return "{'module':'user delete'}";
    }
}

@Controller
public class BookController {

    @RequestMapping("/book/save")
    @ResponseBody
    public String save(){
        System.out.println("book save ...");
        return "{'module':'book save'}";
    }
}

问题是解决了,但是每个方法前面都需要进行修改,写起来比较麻烦而且还有很多重复代码,如果/user后期发生变化,所有的方法都需要改,耦合度太高。

方法二

当类上和方法上都添加了@RequestMapping注解,前端发送请求的时候,要和两个注解的value值相加匹配才能访问到。

利用这一点我们继续优化代码:

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'module':'user save'}";
    }
    
    @RequestMapping("/delete")
    @ResponseBody
    public String save(){
        System.out.println("user delete ...");
        return "{'module':'user delete'}";
    }
}

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

    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("book save ...");
        return "{'module':'book save'}";
    }
}

@RequestMapping注解value属性前面加不加/都可以

总结

[SpringMVC]请求与响应①(映射路径、请求参数)_第2张图片

️‍请求参数

请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数?

关于请求参数的传递与接收是和请求方式有关系的,目前比较常见的两种请求方式为:

  • GET
  • POST

针对于不同的请求前端如何发送,后端如何接收?

⚽️GET发送单个参数

发送请求与参数:

http://localhost/commonParam?name=itcast

[SpringMVC]请求与响应①(映射路径、请求参数)_第3张图片

接收参数:

@Controller
public class UserController {

    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name){
        System.out.println("普通参数传递 name ==> "+name);
        return "{'module':'commonParam'}";
    }
}

注意:形参名和请求参数名一定要对应上,否则返回的是null。后面的情况也是。

⚽️GET发送多个参数

发送请求与参数:

http://localhost/commonParam?name=itcast&age=15

[SpringMVC]请求与响应①(映射路径、请求参数)_第4张图片

接收参数:

@Controller
public class UserController {

    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name,int age){
        System.out.println("普通参数传递 name ==> "+name);
        System.out.println("普通参数传递 age ==> "+age);
        return "{'module':'commonParam'}";
    }
}

⚽️GET请求中文乱码

如果我们传递的参数中有中文,你会发现接收到的参数会出现中文乱码问题。

发送请求:http://localhost/commonParam?name=张三&age=18

控制台:

[SpringMVC]请求与响应①(映射路径、请求参数)_第5张图片

出现乱码的原因相信大家都清楚,Tomcat8.5以后的版本已经处理了中文乱码的问题,但是IDEA中的Tomcat插件目前只到Tomcat7,所以需要修改pom.xml来解决GET请求中文乱码问题

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.mavengroupId>
        <artifactId>tomcat7-maven-pluginartifactId>
        <version>2.1version>
        <configuration>
          <port>80port>
          <path>/path> 
          <uriEncoding>UTF-8uriEncoding>
        configuration>
      plugin>
    plugins>
  build>

⚽️POST发送参数

发送请求与参数:

[SpringMVC]请求与响应①(映射路径、请求参数)_第6张图片

接收参数:

和GET一致,不用做任何修改

@Controller
public class UserController {

    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name,int age){
        System.out.println("普通参数传递 name ==> "+name);
        System.out.println("普通参数传递 age ==> "+age);
        return "{'module':'commonParam'}";
    }
}

⚽️POST请求中文乱码

发送请求与参数:

[SpringMVC]请求与响应①(映射路径、请求参数)_第7张图片

接收参数:

控制台打印,会发现有中文乱码问题。

[SpringMVC]请求与响应①(映射路径、请求参数)_第8张图片

解决方案:配置过滤器

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //乱码处理
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }
}

CharacterEncodingFilter是在spring-web包中,所以用之前需要导入对应的jar包。

你可能感兴趣的:(SSM,#,SpringMVC,java,开发语言,springmvc)