鍍金池/ 問答/Java  HTML/ java后臺controller能否直接接收list<object>

java后臺controller能否直接接收list<object>為入?yún)ⅲ?/h1>

修改下問題,最下方為我項目的詳細代碼,精簡了一下,去除了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]

回答
編輯回答
撥弦

可以 用@RequestBody注解

后端
clipboard.png

前臺

clipboard.png
數(shù)據(jù)組裝

clipboard.png

2018年2月5日 11:16
編輯回答
兮顏

樓主你可以把ajax的data:{ param:JSON.stringify(param) }改成data:JSON.stringify(param);希望能幫助到你!

2017年10月30日 05:43