热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java开发学习(二十五)—使用PostMan完成不同类型参数传递

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

一、请求参数

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

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



  • GET



  • POST



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


1.1 环境准备



  • 创建一个Web的Maven项目



    • 参考Java开发学习(二十三)----SpringMVC入门案例、工作流程解析及设置bean加载控制中环境准备



  • 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...略
    }


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


1.2 参数传递


GET发送单个参数

发送请求与参数:

http://localhost/commonParam?name=itcast

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

接收参数:

@Controller
public class UserController {

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

GET发送多个参数

发送请求与参数:

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

接收参数:

@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

控制台:

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


   


     


       org.apache.tomcat.maven
       tomcat7-maven-plugin
       2.1
       
         

80
         

/
         UTF-8
       
     
   
 

POST发送参数

发送请求与参数:

接收参数:

和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请求中文乱码

form-data与x-www-form-urlencoded都可以post请求,区别在于form-data可以发送文件

发送请求与参数:

接收参数:

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

解决方案:配置过滤器

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


二、五种类型参数传递

前面我们已经能够使用GET或POST来发送请求和数据,所携带的数据都是比较简单的数据,接下来在这个基础上,我们来研究一些比较复杂的参数传递,常见的参数种类有:



  • 普通参数



  • POJO类型参数



  • 嵌套POJO类型参数



  • 数组类型参数



  • 集合类型参数



这些参数如何发送,后台改如何接收?


2.1 普通参数



  • 普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数。



如果形参与地址参数名不一致该如何解决?

发送请求与参数:

http://localhost/commonParamDifferentName?name=张三&age=18

后台接收参数:

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

因为前端给的是name,后台接收使用的是userName,两个名称对不上,导致接收数据失败:

解决方案:使用@RequestParam注解

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

注意:写上@RequestParam注解框架就不需要自己去解析注入,能提升框架处理性能


2.2 POJO数据类型

简单数据类型一般处理的是参数个数比较少的请求,如果参数比较多,那么后台接收参数的时候就比较复杂,这个时候我们可以考虑使用POJO数据类型。



  • POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数



此时需要使用前面准备好的POJO类,先来看下User

public class User {
   private String name;
   private int age;
   //setter...getter...略
}

发送请求和参数:

后台接收参数:

//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
   System.out.println("pojo参数传递 user ==> "+user);
   return "{'module':'pojo param'}";
}

注意:



  • POJO参数接收,前端GET和POST发送请求数据的方式不变。



  • 请求参数key的名称要和POJO中属性的名称一致,否则无法封装。




2.3 嵌套POJO类型参数

如果POJO对象中嵌套了其他的POJO类,如

public class Address {
   private String province;
   private String city;
   //setter...getter...略
}
public class User {
   private String name;
   private int age;
   private Address address;
   //setter...getter...略
}


  • 嵌套POJO参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数



发送请求和参数:

后台接收参数:

//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
   System.out.println("pojo参数传递 user ==> "+user);
   return "{'module':'pojo param'}";
}

注意:

请求参数key的名称要和POJO中属性的名称一致,否则无法封装


2.4 数组类型参数

举个简单的例子,如果前端需要获取用户的爱好,爱好绝大多数情况下都是多个,如何发送请求数据和接收数据呢?



  • 数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数



发送请求和参数:

后台接收参数:

 //数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
   @RequestMapping("/arrayParam")
   @ResponseBody
   public String arrayParam(String[] likes){
       System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
       return "{'module':'array param'}";
  }

2.5 集合类型参数

数组能接收多个值,那么集合是否也可以实现这个功能呢?

发送请求和参数:

后台接收参数:

//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(List likes){
   System.out.println("集合参数传递 likes ==> "+ likes);
   return "{'module':'list param'}";
}

运行会报错,

错误的原因是:SpringMVC将List看做是一个POJO对象来处理,将其创建一个对象并准备把前端的数据封装到对象中,但是List是一个接口无法创建对象,所以报错。

解决方案是:使用@RequestParam注解

//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List likes){
   System.out.println("集合参数传递 likes ==> "+ likes);
   return "{'module':'list param'}";
}


  • 集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系



  • 对于简单数据类型使用数组会比集合更简单些。




知识点1:@RequestParam




























名称@RequestParam
类型形参注解
位置SpringMVC控制器方法形参定义前面
作用绑定请求参数与处理器方法形参间的关系
相关参数required:是否为必传参数 defaultValue:参数默认值


三、JSON数据传输参数

现在比较流行的开发方式为异步调用。前后台以异步方式进行交换,传输的数据使用的是JSON,所以前端如果发送的是JSON数据,后端该如何接收?

对于JSON数据类型,我们常见的有三种:



  • json普通数组(["value1","value2","value3",...])



  • json对象({key1:value1,key2:value2,...})



  • json对象数组([{key1:value1,...},{key2:value2,...}])



对于上述数据,前端如何发送,后端如何接收?


JSON普通数组


步骤1:pom.xml添加依赖

SpringMVC默认使用的是jackson来处理json的转换,所以需要在pom.xml添加jackson依赖


   com.fasterxml.jackson.core
   jackson-databind
   2.9.0

步骤2:PostMan发送JSON数据

Body->raw->JSON


步骤3:开启SpringMVC注解支持

在SpringMVC的配置类中开启SpringMVC的注解支持,这里面就包含了将JSON转换成对象的功能。

@Configuration
@ComponentScan("com.itheima.controller")
//开启json数据类型自动转换
@EnableWebMvc
public class SpringMvcConfig {
}

步骤4:参数前添加@RequestBody

//使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List likes){
   System.out.println("list common(json)参数传递 list ==> "+likes);
   return "{'module':'list common for json param'}";
}

步骤5:启动运行程序

JSON普通数组的数据就已经传递完成,下面针对JSON对象数据和JSON对象数组的数据该如何传递呢?


JSON对象数据

请求和数据的发送:

{
"name":"itcast",
"age":15
}

后端接收数据:

@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
   System.out.println("pojo(json)参数传递 user ==> "+user);
   return "{'module':'pojo for json param'}";
}

启动程序访问测试

说明:

address为null的原因是前端没有传递数据给后端。

如果想要address也有数据,我们需求修改前端传递的数据内容:

{
"name":"itcast",
"age":15,
   "address":{
       "province":"beijing",
       "city":"beijing"
  }
}

再次发送请求,就能看到address中的数据


JSON对象数组

集合中保存多个POJO该如何实现?

请求和数据的发送:

[
  {"name":"itcast","age":15},
  {"name":"itheima","age":12}
]

后端接收数据:

@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List list){
   System.out.println("list pojo(json)参数传递 list ==> "+list);
   return "{'module':'list pojo for json param'}";
}

启动程序访问测试

小结

SpringMVC接收JSON数据的实现步骤为:

(1)导入jackson包

(2)使用PostMan发送JSON数据

(3)开启SpringMVC注解驱动,在配置类上添加@EnableWebMvc注解

(4)Controller方法的参数前添加@RequestBody注解


知识点1:@EnableWebMvc
























名称@EnableWebMvc
类型配置类注解
位置SpringMVC配置类定义上方
作用开启SpringMVC多项辅助功能


知识点2:@RequestBody
























名称@RequestBody
类型形参注解
位置SpringMVC控制器方法形参定义前面
作用将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次


@RequestBody与@RequestParam区别



  • 区别



    • @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】



    • @RequestBody用于接收json数据【application/json】





  • 应用



    • 后期开发中,发送json格式数据为主,@RequestBody应用较广



    • 如果发送非json格式数据,选用@RequestParam接收请求参数






四、日期类型参数传递

前面我们处理过简单数据类型、POJO数据类型、数组和集合数据类型以及JSON数据类型,接下来我们还得处理一种开发中比较常见的一种数据类型,日期类型

日期类型比较特殊,因为对于日期的格式有N多中输入方式,比如:



  • 2088-08-18



  • 2088/08/18



  • 08/18/2088



  • ......



针对这么多日期格式,SpringMVC该如何接收,它能很好的处理日期类型数据么?


步骤1:编写方法接收日期数据

在UserController类中添加方法,把参数设置为日期类型

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date)
   System.out.println("参数传递 date ==> "+date);
   return "{'module':'data param'}";
}

步骤2:启动Tomcat服务器


步骤3:使用PostMan发送请求

使用PostMan发送GET请求,并设置date参数


步骤4:查看控制台

通过打印,我们发现SpringMVC可以接收日期数据类型,并将其打印在控制台。

这个时候,我们就想如果把日期参数的格式改成其他的,SpringMVC还能处理么?


步骤5:更换日期格式

为了能更好的看到程序运行的结果,我们在方法中多添加一个日期参数

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,Date date1)
   System.out.println("参数传递 date ==> "+date);
System.out.println("参数传递 date1 ==> "+date1);
   return "{'module':'data param'}";
}

使用PostMan发送请求,携带两个不同的日期格式,

http://localhost/dataParam?date=2088/08/08&date1=2088-08-08

发送请求和数据后,页面会报400,控制台会报出一个错误

Resolved [org.springframework.web.method.annotation.==MethodArgumentTypeMismatchException==: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is org.springframework.core.convert.==COnversionFailedException==: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2088-08-08'; nested exception is java.lang.IllegalArgumentException]

从错误信息可以看出,错误的原因是在将2088-08-08转换成日期类型的时候失败了,原因是SpringMVC默认支持的字符串转日期的格式为yyyy/MM/dd,而我们现在传递的不符合其默认格式,SpringMVC就无法进行格式转换,所以报错。

解决方案也比较简单,需要使用@DateTimeFormat

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
                       @DateTimeFormat(pattern="yyyy-MM-dd") Date date1)
   System.out.println("参数传递 date ==> "+date);
System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
   return "{'module':'data param'}";
}

重新启动服务器,重新发送请求测试,SpringMVC就可以正确的进行日期转换了


步骤6:携带时间的日期

接下来我们再来发送一个携带时间的日期,看下SpringMVC该如何处理?

先修改UserController类,添加第三个参数

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
                       @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
                       @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2)
   System.out.println("参数传递 date ==> "+date);
System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
   return "{'module':'data param'}";
}

使用PostMan发送请求,携带两个不同的日期格式,

http://localhost/dataParam?date=2088/08/08&date1=2088-08-08&date2=2088/08/08 8:08:08

重新启动服务器,重新发送请求测试,SpringMVC就可以将日期时间的数据进行转换


知识点1:@DateTimeFormat




























名称@DateTimeFormat
类型形参注解
位置SpringMVC控制器方法形参前面
作用设定日期时间型数据格式
相关属性pattern:指定日期时间格式字符串


内部实现原理

讲解内部原理之前,我们需要先思考个问题:



  • 前端传递字符串,后端使用日期Date接收



  • 前端传递JSON数据,后端使用对象接收



  • 前端传递字符串,后端使用Integer接收



  • 后台需要的数据类型有很多种



  • 在数据的传递过程中存在很多类型的转换



谁来做这个类型转换?答:SpringMVC

SpringMVC是如何实现类型转换的?SpringMVC中提供了很多类型转换接口和实现类

在框架中,有一些类型转换接口,其中有:



  • (1) Converter接口



/**
* S: the source type
* T: the target type
*/
public interface Converter {
   @Nullable
   //该方法就是将从页面上接收的数据(S)转换成我们想要的数据类型(T)返回
   T convert(S source);
}

注意:Converter所属的包为org.springframework.core.convert.converter

Converter接口的实现类

框架中有提供很多对应Converter接口的实现类,用来实现不同数据类型之间的转换,如:

请求参数年龄数据(String→Integer)

日期格式转换(String → Date)



  • (2) HttpMessageConverter接口



该接口是实现对象与JSON之间的转换工作,了解一下即可

注意:SpringMVC的配置类把@EnableWebMvc当做标配配置上去,不要省略

@EnableWebMvc功能之一:根据类型匹配对应的类型转换器

 

 

 

本文来自博客园,作者:|旧市拾荒|,转载请注明原文链接:https://www.cnblogs.com/xiaoyh/p/16444653.html



推荐阅读
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
author-avatar
若涵她娘_124
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有