相关推荐recommended
【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解
作者:mmseoamin日期:2023-12-18

目录

  • 1 设置请求映射路径
    • 1.1 环境准备
    • 1.2 问题分析
      • 1.3 设置映射路径
      • 2 请求参数
        • 2.1 环境准备
        • 2.2 参数传递
          • 2.2.1 GET发送单个参数
          • 2.2.2 GET发送多个参数
          • 2.2.3 GET请求中文乱码
          • 2.2.4 POST发送参数
          • 2.2.5 POST请求中文乱码

            欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《PostMan工具的安装与使用技巧》

            【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解,在这里插入图片描述,第1张前面我们已经完成了入门案例相关的知识学习,接来了我们就需要针对SpringMVC相关的知识点进行系统的学习,之前我们提到过,SpringMVC是web层的框架,主要的作用是接收请求、接收数据、响应结果,所以这一章节是学习SpringMVC的重点内容,我们主要会讲解四部分内容:

            • 请求映射路径
            • 请求参数
            • 日期类型参数传递
            • 响应json数据

              1 设置请求映射路径

              1.1 环境准备

              • 创建一个Web的Maven项目
              • pom.xml添加Spring依赖
                
                
                	4.0.0
                	com.itheima
                	springmvc_03_request_mapping
                	1.0-SNAPSHOT
                	war
                
                	
                		javax.servlet
                		javax.servlet-api
                		3.1.0
                		provided
                	
                	
                		org.springframework
                		spring-webmvc
                		5.2.10.RELEASE
                	
                
                
                	
                		
                			org.apache.tomcat.maven
                			tomcat7-maven-plugin
                			2.1
                			
                				80
                				/
                			
                		
                	
                
                
                
                • 创建对应的配置类
                  public class ServletContainersInitConfig extends
                  AbstractAnnotationConfigDispatcherServletInitializer {
                  	protected Class[] getServletConfigClasses() {
                  			return new Class[]{SpringMvcConfig.class};
                  		}
                  		protected String[] getServletMappings() {
                  			return new String[]{"/"};
                  		}
                  		protected Class[] getRootConfigClasses() {
                  			return new Class[0];
                  	}
                  }
                  @Configuration
                  @ComponentScan("com.itheima.controller")
                  public class SpringMvcConfig {
                  }
                  
                  • 编写BookController和UserController
                    @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'}";
                    	}
                    }
                    

                    最终创建好的项目结构如下:

                    【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解,在这里插入图片描述,第2张

                    把环境准备好后,启动Tomcat服务器,后台会报错:

                    【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解,在这里插入图片描述,第3张

                    从错误信息可以看出:

                    • UserController有一个save方法,访问路径为http://localhost/save
                    • BookController也有一个save方法,访问路径为http://localhost/save
                    • 当访问http://localhost/saved的时候,到底是访问UserController还是BookController?

                      1.2 问题分析

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

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

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

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

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

                      1.3 设置映射路径

                      步骤1:修改Controller

                      @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后期发生变化,所有的方法都需要改,耦合度太高

                      步骤2:优化路径配置

                      优化方案:

                      @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值相加匹配才能访问到。
                      • @RequestMapping注解value属性前面加不加/都可以

                        扩展小知识:

                        对于PostMan如何觉得字小不好看,可以使用ctrl+=调大,ctrl±调小。

                        2 请求参数

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

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

                        • GET
                        • POST

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

                          2.1 环境准备

                          • 创建一个Web的Maven项目
                          • pom.xml添加Spring依赖
                            
                            
                            	4.0.0
                            	
                            	com.itheima
                            	springmvc_03_request_mapping
                            	1.0-SNAPSHOT
                            	war
                            	
                            		
                            			javax.servlet
                            			javax.servlet-api
                            			3.1.0
                            			provided
                            		
                            		
                            			org.springframework
                            			spring-webmvc
                            			5.2.10.RELEASE
                            		
                            	
                            	
                            		
                            			
                            				org.apache.tomcat.maven
                            				tomcat7-maven-plugin
                            				2.1
                            				
                            					80
                            					/
                            				
                            			
                            		
                            	
                            
                            
                            • 创建对应的配置类
                              public class ServletContainersInitConfig extends
                              AbstractAnnotationConfigDispatcherServletInitializer {
                              	protected Class[] getServletConfigClasses() {
                              		return new Class[]{SpringMvcConfig.class};
                              	}
                              	protected String[] getServletMappings() {
                              		return new String[]{"/"};
                              	}
                              	protected Class[] getRootConfigClasses() {
                              		return new Class[0];
                              	}
                              }
                              @Configuration
                              @ComponentScan("com.itheima.controller")
                              public class SpringMvcConfig {
                              }
                              
                              • 编写UserController
                                @Controller
                                public class UserController {
                                	@RequestMapping("/commonParam")
                                	@ResponseBody
                                	public String commonParam(){
                                		return "{'module':'commonParam'}";
                                	}
                                }
                                
                                • 编写模型类,User和Address
                                  public class Address {
                                  	private String province;
                                  	private String city;
                                  	//setter...getter...略
                                  }
                                  public class User {
                                  	private String name;
                                  	private int age;
                                  	//setter...getter...略
                                  }
                                  

                                  最终创建好的项目结构如下:

                                  【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解,在这里插入图片描述,第4张

                                  2.2 参数传递

                                  2.2.1 GET发送单个参数

                                  发送请求与参数:

                                  http://localhost/commonParam?name=itcast
                                  

                                  【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解,在这里插入图片描述,第5张

                                  接收参数:

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

                                  2.2.2 GET发送多个参数

                                  发送请求与参数:

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

                                  【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解,在这里插入图片描述,第6张

                                  接收参数:

                                  @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'}";
                                  	}
                                  }
                                  

                                  2.2.3 GET请求中文乱码

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

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

                                  控制台:

                                  【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解,在这里插入图片描述,第7张

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

                                  
                                  	
                                  		
                                  			org.apache.tomcat.maven
                                  			tomcat7-maven-plugin
                                  			2.1
                                  			
                                  				80
                                  				/ 
                                  				UTF-8
                                  			
                                  		
                                  	
                                  
                                  

                                  2.2.4 POST发送参数

                                  发送请求与参数

                                  【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解,在这里插入图片描述,第8张

                                  接收参数:

                                  和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'}";
                                  	}
                                  }
                                  

                                  2.2.5 POST请求中文乱码

                                  发送请求与参数:

                                  【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解,在这里插入图片描述,第9张

                                  接收参数:

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

                                  【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解,在这里插入图片描述,第10张

                                  解决方案:配置过滤器

                                  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包。