修改下問題,最下方為我項目的詳細代碼,精簡了一下,去除了state屬性,代碼順序最開始,基礎(chǔ)數(shù)據(jù)類型int,從單個int到int數(shù)組,到intarraylist,
單個stirng string數(shù)組, string list, arraylist,
單個Tag對象,Tag對象數(shù)組,list,arraylist
我網(wǎng)上找了很多例子,例子中的controller直接接收list都是接受的字符串類型,list<string>,并沒有復(fù)雜對象類型的例子
目前我所知道的兩種解決辦法就是
1.新建一個vo類,里面有一個list<Tag>屬性,controller接受這個類
2.接受字符串,將字符串轉(zhuǎn)為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<Tag>接收呢?
我弄了半天也不行;
那么大家平常都是如何處理的呢,都是入?yún)⒔邮兆址?然后用jackson等框架再轉(zhuǎn)成list嗎
或者是我把入?yún)⒏某墒裁礃幼雍笈_就可以接受了呢,我記得之前遇到過一次這個問題,從前臺遍歷對象然后弄得,但是代碼沒了,也忘了,但是那樣弄也挺麻煩的,最簡單的方法是什么呢
pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件:
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 + "]";
}
}
前臺和后臺從簡單到復(fù)雜一點一點來,各階段代碼:
version 1: 單個int類型,
前臺代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index</title>
<!-- 引入樣式 -->
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<button onclick="commit()">測試</button>
<script>
function commit(){
$.ajax({
type:"post",
url: 'add',
data:{
param:1
},
success:function(data){
console.log(data);
}
})
}
</script>
</body>
</html>
后臺代碼:
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)⒏臑椋篅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<Integer> 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<Integer> param) {
System.out.println("param:" + param);
return "成功";
}
前臺數(shù)據(jù)格式:
param[]:1
param[]:2
param[]:3
后臺控制臺輸出:
param:[1, 2, 3]
version 5:使用字符串測試,結(jié)果和int類型結(jié)果完全一致,就不貼代碼了,
version 6:使用tag類測試,傳遞tag對象
index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index</title>
<!-- 引入樣式 -->
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<button onclick="commit()">測試</button>
<script>
function commit(){
$.ajax({
type:"post",
url: 'add',
data:{
id:1,
name:"hello"
},
success:function(data){
console.log(data);
}
})
}
</script>
</body>
</html>
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結(jié)果: 后臺可以成功接收Tag類的對象,
控制臺輸出為:Tag [id=1, name=hello]
version 7:
修改前臺數(shù)據(jù)格式:
data:{
id:1,
name:"hello"
},
改為:
data:{tag:{id:1,name:'hello'}},
后臺代碼不變
version 7
結(jié)果:后臺接受到的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<Tag> param) {
System.out.println("param:" + param);
return "成功";
}
version 8 結(jié)果:
前臺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)⒓尤隌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<Tag> 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]
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務(wù)外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務(wù)負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。