java conterller_java后台controller能否直接接收list
修改下問題,最下方為我項目的詳細代碼,精簡了一下,去除了state屬性,代碼順序最開始,基礎數(shù)據(jù)類型int,從單個int到int數(shù)組,到intarraylist,
單個stirng string數(shù)組, string list, arraylist,
單個Tag對象,Tag對象數(shù)組,list,arraylist
我網(wǎng)上找了很多例子,例子中的controller直接接收list都是接受的字符串類型,list,并沒有復雜對象類型的例子
目前我所知道的兩種解決辦法就是
1.新建一個vo類,里面有一個list屬性,controller接受這個類
2.接受字符串,將字符串轉為list
但是如果我就是想直接接受list呢?
這是我的類:
public class Tag {
int id;
String name;
int state;
}
我前臺傳給后臺的數(shù)據(jù)格式是這個樣子的
[{"id":1,"name":"123","state":0},{"id":3,"name":"456","state":0}]
我后臺能否直接在入?yún)⒗锩嬗胠ist接收呢?
我弄了半天也不行;
那么大家平常都是如何處理的呢,都是入?yún)⒔邮兆址?然后用jackson等框架再轉成list嗎
或者是我把入?yún)⒏某墒裁礃幼雍笈_就可以接受了呢,我記得之前遇到過一次這個問題,從前臺遍歷對象然后弄得,但是代碼沒了,也忘了,但是那樣弄也挺麻煩的,最簡單的方法是什么呢
分割線
pom文件:
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.example
demo
0.0.1-SNAPSHOT
jar
demo
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-devtools
org.springframework.boot
spring-boot-starter-thymeleaf
net.sourceforge.nekohtml
nekohtml
1.9.22
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-maven-plugin
配置文件:
server:
port: 8088
spring:
thymeleaf:
mode: LEGACYHTML5
datasource:
url: jdbc:mysql://localhost:3306/ek
username: root
password: 1212
driver-class-name: com.mysql.jdbc.Driver
jpa:
database: MYSQL
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
Tag類
package com.example.demo.entity;
public class Tag {
int id;
String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Tag [id=" + id + ", name=" + name + "]";
}
}
前臺和后臺從簡單到復雜一點一點來,各階段代碼:
version 1: 單個int類型,
前臺代碼:
index測試
function commit(){
$.ajax({
type:"post",
url: 'add',
data:{
param:1
},
success:function(data){
console.log(data);
}
})
}
后臺代碼:
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@RequestMapping("")
public String Hello(ModelMap map) {
return "index";
}
@ResponseBody
@RequestMapping(value = "add")
public String add(int param) {
System.out.println("param:" + param);
return "成功";
}
}
前端控制臺數(shù)據(jù)格式:
param:1
后臺控制臺輸出
param:1
version2:多個int類型;
將data:{
param:1
},
改為:
data:{
param:[1,2,3]
},
后臺代碼改為:
@ResponseBody
@RequestMapping(value = "add")
public String add(@RequestParam("param[]") int[] param) {
System.out.println("param:" + param);
System.out.println("param:" + Arrays.toString(param));
return "成功";
}
后臺入?yún)⒏臑?#xff1a;@RequestParam("param[]") int[] param
則可以正確接收,為param則不行
前臺控制臺數(shù)據(jù)格式:
param[]:1
param[]:2
param[]:3
后臺控制臺輸出:
param:[I@55a3f9bb
param:[1, 2, 3]
version3:后臺使用list接受
前臺代碼不變,
后臺代碼改為:
@ResponseBody
@RequestMapping(value = "add")
public String add(@RequestParam("param[]") List param) {
System.out.println("param:" + param);
return "成功";
}
前臺數(shù)據(jù)格式:
param[]:1
param[]:2
param[]:3
后臺控制臺輸出:
param:[1, 2, 3]
version4:后臺使用arraylist接收
前臺代碼不變,
后臺代碼改為:
@ResponseBody
@RequestMapping(value = "add")
public String add(@RequestParam("param[]") ArrayList param) {
System.out.println("param:" + param);
return "成功";
}
前臺數(shù)據(jù)格式:
param[]:1
param[]:2
param[]:3
后臺控制臺輸出:
param:[1, 2, 3]
version 5:使用字符串測試,結果和int類型結果完全一致,就不貼代碼了,
version 6:使用tag類測試,傳遞tag對象
index.html:
index測試
function commit(){
$.ajax({
type:"post",
url: 'add',
data:{
id:1,
name:"hello"
},
success:function(data){
console.log(data);
}
})
}
helloController:
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.example.demo.entity.Tag;
@Controller
public class HelloController {
@RequestMapping("")
public String Hello(ModelMap map) {
return "index";
}
@ResponseBody
@RequestMapping(value = "add")
public String add(Tag tag) {
System.out.println(tag);
return "成功";
}
}
version 6結果: 后臺可以成功接收Tag類的對象,
控制臺輸出為:Tag [id=1, name=hello]
version 7:
修改前臺數(shù)據(jù)格式:
data:{
id:1,
name:"hello"
},
改為:
data:{tag:{id:1,name:'hello'}},
后臺代碼不變
version 7
結果:后臺接受到的Tag類對象各屬性為空
控制臺輸出為:Tag [id=0, name=null]
前臺chrome控制臺中記錄的From data為:
tag[id]:1
tag[name]:hello
version 8 :使用tag類型的list接受數(shù)據(jù)
前臺data修改為:
data:{
param:[{id:1,name:'hello'},{id:2,name:'hello'}]
},
后臺代碼修改為:
@ResponseBody
@RequestMapping(value = "add")
public String add(@RequestParam("param[]") List param) {
System.out.println("param:" + param);
return "成功";
}
version 8 結果:
前臺chrome顯示數(shù)據(jù)格式為:
param0:1
param0:hello
param1:2
param1:hello
請求失敗,前臺500錯誤,
后臺代碼報錯:
錯誤信息為:
2018-01-29 13:22:06.313 WARN 3148 --- [nio-8088-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.web.bind.MissingServletRequestParameterException: Required List parameter 'param[]' is not present
version 9:
ajax新增contentType,
data使用JSON.stringify格式胡
controller入?yún)⒓尤?#64;requestBody注解
前臺代碼:
function commit(){
var param=[{id:1,name:'hello'},{id:2,name:'hello'}];
console.log(param);
console.log(JSON.stringify(param));
$.ajax({
type:"post",
url: 'add',
contentType:"application/json; charset=utf-8",
dataType:"json",
data:{
param:JSON.stringify(param)
},
success:function(data){
console.log(data);
}
})
}
后臺代碼:
@ResponseBody
@RequestMapping(value = "add")
public String add(@RequestBody List param) {
System.out.println("param:" + param);
return "成功";
}
然后前臺請求報400錯誤,
前臺控制臺輸出位:
數(shù)據(jù)格式為:
param=%5B%7B%22id%22%3A1%2C%22name%22%3A%22hello%22%7D%2C%7B%22id%22%3A2%2C%22name%22%3A%22hello%22%7D%5D
后臺報錯為:
2018-01-29 13:34:06.096 WARN 3148 --- [nio-8088-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unrecognized token 'param': was expecting ('true', 'false' or 'null'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'param': was expecting ('true', 'false' or 'null')
at [Source: java.io.PushbackInputStream@14a71bea; line: 1, column: 7]
2018-01-29 13:34:06.096 WARN 3148 --- [nio-8088-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unrecognized token 'param': was expecting ('true', 'false' or 'null'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'param': was expecting ('true', 'false' or 'null')
at [Source: java.io.PushbackInputStream@14a71bea; line: 1, column: 7]
總結
以上是生活随笔為你收集整理的java conterller_java后台controller能否直接接收list的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 结束符报错_【踩坑记录】My
- 下一篇: sklearn adaboost_集成学