- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
记得之前跟前端同事联调接口的时候,后端SpringMVC需要接收数组类型的参数,然后跟前端说需要传数组类型过来。后来前端童鞋传了数组,但是后端接收不成功,联调失败。那时候由于时间关系没有仔细研究这块,当时想了个办法就是前端传一个json字符串,后端换成接收json字符串然后转成需要的数组对象。这显然不是一种好的做法,框架帮我们做好的事我们没有用上,还平白多了两次数据的转换。所以今天花时间研究了下,将springMVC的数据绑定做个总结。
即几种java原生的基本数据类型已经其封装类以及String类型。比较简单,选一种布尔类型来讲解。
测试代码:
@RequestMapping(value = "test")
@ResponseBody
public Object testDataBind(@RequestParam(name = "test") Boolean test) {
System.out.println(test);
return "success";
}
使用postman工具发送请求:
控制台输出:
true1
这种的比较简单,没有太多可说的。**这里需要注意的是,参数如果没有加@RequestParam注解的话,传参需要默认参数的名称test作为传参参数的名称,而且没有加注解的话,前端在发送http请求的时候可以不传该参数,也不会报错。但是如果加了该注解,在没有设置注解的属性required = false的前提下,该参数必传,不然会报400错误。如果该注解中指定了name属性,name前端需要以name的值作为前端传参名称,如果没有指定name属性,在按参数名称test为前端传参名称。**大家可逐一验证。
分别为两种情况:
接口代码:
@RequestMapping(value = "test")
@ResponseBody
public Object testDataBind(String[] tests) {
System.out.println(tests[0] + " " + tests[1]);
return "success";
}
这种前端传参需要遵守一定格式。
name="tests" value="arony1"
name="tests" value="arony2"12
postman发送请求:
控制台输出:
arony1 arony21
data:{"tests":"arony1,arony2"}1
值得注意的是,如果后端的springMVC方法参数用的是数组来接收的话,前端用ajax发送请求,那么只能用上面这一种格式传参,使用下面说的tests[0],tests[1]传参是不行的。
postman发送请求:
控制台输出:
arony1 arony21
接口代码:
@RequestMapping(value = "test")
@ResponseBody
public Object testDataBind(Person person) {
System.out.println(person.getTests()[0] + " " + person.getTests()[1]);
return "success";
}
Person:
public class Person {
private String[] tests;
public String[] getTests() {
return tests;
}
public void setTests(String[] tests) {
this.tests = tests;
}
}
有两种形式进行传值
name="tests" value="arony1"
name="tests" value="arony2"12
name="tests[0]" value="arony1"
name="tests[1]" value="arony2"12
postman发送请求:
控制台输出:
arony1 arony21
ajax也有两种方式传值:
data:{"tests":"arony1,arony2"}1
data:{"tests[0]":"arony1","tests[1]":"arony2"}1
效果跟表单完全一样。
首先定义一个自定类型User,包含以下属性,生成get/set方法,toString方法:
private Integer id;
private String loginname;12
接口代码:
@RequestMapping(value = "test")
@ResponseBody
public Object testDataBind(User user) {
System.out.println(user);
return "success";
}
postman发送请求:
控制台输出:
User{id=1, loginname='arony'}1
可以看到,跟User属性名一样的参数如果传了值,就可以被User对象所接受,没有传的为默认值。
我们尝试下,给参数user加上@RequestParam注解看看。使用postman发送请求,会发现返回400。所以我们要理解@RequestParam注解含义,它标示的是该方法参数接受的是一个http参数。因此,如果是用一个自定义对象作为参数的话,不要在之前加上@RequestParam,因为SpringMVC在解析http请求的参数user的时候,不能将接收到的参数转化成一个User对象。
注意:这种情况只能使用一个自定义类来包装数组/list。
再定义一个参数类:
public class Parameter {
private Person[] person;
public Person[] getPerson() {
return person;
}
public void setPerson(Person[] person) {
this.person = person;
}
}
Person:
public class Person {
private String tests;
public String getTests() {
return tests;
}
public void setTests(String tests) {
this.tests = tests;
}
}
接口代码:
@RequestMapping(value = "test")
@ResponseBody
public Object testDataBind(Parameter parameter) {
System.out.println(parameter.getPerson()[0].getTests() + " " + parameter.getPerson()[1].getTests());
return "success";
}
name="person[0].tests" value="arony1"
name="person[1].tests" value="arony2"12
data:{"person[0].tests":"arony1","person[1].tests":"arony2"}1
postman发送请求:
控制台输出:
arony1 arony21
<
String,基本类型>
与上面一样 这种情况只能使用一个自定义类来包装map。
Parameter:
public class Parameter {
private Map<String, String> map;
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
接口代码:
@RequestMapping(value = "test")
@ResponseBody
public Object testDataBind(Parameter parameter) {
parameter.getMap().forEach((key, value) -> {
System.out.println(key + " " + value);
});
return "success";
}
前端传参格式:
name="map[key1]" value="arony1"
name="map[key2]" value="arony2"
或者
name="map.key1" value="arony1"
name="map.key2" value="arony2"12345
data:{"map[key1]":"arony1","map[key2]":"arony2"}
或者
data:{"map.key1":"arony1","map.key2":"arony2"}123
postman发送请求:
控制台输出:
key1 arony1
key2 arony212
<
String, 自定义类>
跟5是很类似的。
Parameter:
public class Parameter {
private Map<String, Person> map;
public Map<String, Person> getMap() {
return map;
}
public void setMap(Map<String, Person> map) {
this.map = map;
}
}
Person:
public class Person {
private String tests;
public String getTests() {
return tests;
}
public void setTests(String tests) {
this.tests = tests;
}
}
接口代码:
@RequestMapping(value = "test")
@ResponseBody
public Object testDataBind(Parameter parameter) {
parameter.getMap().forEach((key, value) -> {
System.out.println(key + " " + value.getTests());
});
return "success";
}
前端传参格式:
name="map[key1].tests" value="arony1"
name="map[key2].test2" value="arony2"12
这里注意,name=”map.key1.tests” value=”arony1”这样传值是不行的。必须用方括号。
data={"map[key1].tests":"arony1","map[key2].test2":"arony2"}1
这里也必须使用方括号。
使用postman发送请求:
控制台输出:
key1 arony1
key2 arony212
以上的SpringMVC参数绑定可以总结为下图:
其中,Map<
String, ①>
前端还可以使用“.”代替方括号。
全称“Java Virtual Machine statistics monitoring tool”(statistics 统计;monitoring 监控;tool 工具) 用于监控虚拟机的各种运
主要是讲下Mongodb的索引的查看、创建、删除、类型说明,还有就是Explain执行计划的解释说明。 可以转载,但请注明出处。  
1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发。 2>循环服务器和并发服务器
详解 linux中的关机和重启命令 一 shutdown命令 shutdown [选项] 时间 选项: ?
首先,将json串转为一个JObject对象: ? 1
matplotlib官网 matplotlib库默认英文字体 添加黑体(‘SimHei')为绘图字体 代码: plt.rcParams['font.sans-serif']=['SimHei'
在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在jdk1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象。  
实例如下: ? 1
1. MemoryCahe NetCore中的缓存和System.Runtime.Caching很相似,但是在功能上做了增强,缓存的key支持object类型;提供了泛型支持;可以读缓存和单个缓存
argument是javascript中函数的一个特殊参数,例如下文,利用argument访问函数参数,判断函数是否执行 复制代码 代码如下: <script
一不小心装了一个Redis服务,开了一个全网的默认端口,一开始以为这台服务器没有公网ip,结果发现之后悔之莫及啊 某天发现cpu load高的出奇,发现一个minerd进程 占了大量cpu,googl
今天写这个是为了 提醒自己 编程过程 不仅要有逻辑 思想 还有要规范 代码 这样可读性 1、PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 funct
摘要:虚拟机安装时一般都采用最小化安装,默认没有lspci工具。一台测试虚拟网卡性能的虚拟机,需要lspci工具来查看网卡的类型。本文描述了在一个虚拟机中安装lspci工具的具体步骤。 由于要测试
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统
目录 算术运算符 基本四则运算符 增量赋值运算符 自增/自减运算符 关系运算符 逻
如下所示: ? 1
MapperScannerConfigurer之sqlSessionFactory注入方式讲解 首先,Mybatis中的有一段配置非常方便,省去我们去写DaoImpl(Dao层实现类)的时间,这个
Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等,这里使用LXC的网络虚拟化来模拟多个网络环境。 本文从基本的网络设备讲
? 1
我是一名优秀的程序员,十分优秀!