史上最全的springmvc入參傳遞總結


一、springmvc的優勢

1、springmvc能夠將URL從http的世界中映射到JAVA世界中,這是框架的核心功能,不得不說確實很強大,但非常的容易理解。

2、springmvc對annotation的完沒支持,去掉struts2及springbean繁瑣的配置文件,提高開發效率。

3、springmvc結合jackson-core,action層只用關心業務對象的編寫,不用關心入參的轉換(json->對象)及返回值的轉換(對象->json)。

二、Action方法入參的接收

1、入參為簡單對象,java.lang.String、java.lang.Integer

 Ajax請求數據

function simpleObject() {
        /*必須與后端參數名保持一致*/
        var data = {
            "name": "張三",
            "age": 12
        };
        var url = "<%=request.getContextPath()%>" + "/v1/simpleObject.action";
        $.ajax({
            url: url,
            type: "POST",
            data: data,
            dataType: "text",
            success: function (result) {
                alert(result);
            }
        });
    }

Action接收

    @RequestMapping(value = "/simpleObject", method = RequestMethod.POST)
    @ResponseBody
    public String simpleObject(String name, Integer age) {
        System.out.println("學生的姓名:" + name + ";年齡:" + age);
        return name + ":" + age;
    }

2、入參為自定義對象,Student

Ajax請求

    function customObject() {
        /*必須與自定義對象的屬性名保持一致*/
        var data = {
            "name": "張三",
            "age": 12
        };
        var url = "<%=request.getContextPath()%>" + "/v1/customObject.action";
        $.ajax({
            url: url,
            type: "POST",
            data: data,
            dataType: "text",
            success: function (result) {
                alert(result);
            }
        });
    }

Action接收

    @RequestMapping(value = "/customObject", method = RequestMethod.POST)
    @ResponseBody
    public String customObject(Student student) {
        String name = student.getName();
        Integer age = student.getAge();
        System.out.println("學生的姓名:" + name + ";年齡:" + age);
        return name + ":" + age;
    }

3、入參為簡單對象(String, Integer)和自定義對象Student混合

Ajax請求

    function mixedObject() {
        /*name、age必須和Student的屬性一致,className、classNum必須和后台參數名一致*/
        var data = {
            "name": "張三",
            "age": 12,
            "className" : "二年級",
            "classNum" : 3
        };
        var url = "<%=request.getContextPath()%>" + "/v1/mixedObject.action";
        $.ajax({
            url: url,
            type: "POST",
            data: data,
            dataType: "text",
            success: function (result) {
                alert(result);
            }
        });
    }

Action接收

    @RequestMapping(value = "/mixedObject", method = RequestMethod.POST)
    @ResponseBody
    public String mixedObject(Student student, String className, Integer classNum) {
        String stuName = student.getName();
        Integer age = student.getAge();
        System.out.println("學生的姓名:" + stuName + ";年齡:" + age);
        System.out.println("年級:" + className + ";班級數:" + classNum);
        return stuName + ":" + age + ":" + className + ":" + classNum;
    }

4、入參為簡單對象(String, Integer)列表參數傳遞

Ajax請求

    function simpleObjectList() {
        /*必須與自定義對象的屬性名保持一致*/
        var data = {
            "ids" : [1, 2, 3, 4]
        };
        var url = "<%=request.getContextPath()%>" + "/v1/simpleObjectList.action";
        $.ajax({
            url: url,
            type: "POST",
            data: data,
            dataType: "text",
            success: function (result) {
                alert(result);
            }
        });
    }

Action接收

    @RequestMapping(value = "/simpleObjectList", method = RequestMethod.POST)
    @ResponseBody
    public String simpleObjectList(@RequestParam(value = "ids[]", required = false) List<Integer> ids) {
        //java8新特性,通過流循環集合
        ids.stream().forEach(id ->
            System.out.print(id)
        );
        return "success";
    }

tips:@RequestParam標簽的value值需要和前端傳遞的參數名保持一致,如前端參數名為ids,標簽的value的值應為“ids[]”,建議加上required=false屬性,因為當前端無ids參數或參數值為空時,不配置required=false屬性,springmvc會拋出一個異常。

5、入參為簡單對象(String, Integer)、自定義對象Student和簡單對象(String, Integer)列表參數傳遞

Ajax請求

    function mixedSimpleObjectList() {
        /*必須與自定義對象的屬性名保持一致*/
        var data = {
            "ids" : [1, 2, 3, 4],
            "name": "張三",
            "age": 12,
            "className" : "二年級",
            "classNum" : 3
        };
        var url = "<%=request.getContextPath()%>" + "/v1/mixedSimpleObjectList.action";
        $.ajax({
            url: url,
            type: "POST",
            data: data,
            dataType: "text",
            success: function (result) {
                alert(result);
            }
        });
    }

Action接收

    @RequestMapping(value = "/mixedSimpleObjectList", method = RequestMethod.POST)
    @ResponseBody
    public String mixedSimpleObjectList(@RequestParam(value = "ids[]", required = false) List<String> ids, Student student,
                                        String className, Integer classNum) {
        ids.stream().forEach(id ->
            System.out.print(id)
        );
        String stuName = student.getName();
        Integer age = student.getAge();
        System.out.println("學生的姓名:" + stuName + ";年齡:" + age);
        System.out.println("年級:" + className + ";班級數:" + classNum);
        return "success";
    }

6、入參為單個自定義對象(Student)列表參數傳遞,通過數組方式

Ajax請求

    function customObjectList() {
        var studentArray = [];
        var student = new Object();
        student.name = "張三";
        student.age = 12;
        studentArray.push(student);
        var student1 = new Object();
        student1.name = "李四";
        student1.age = 13;
        studentArray.push(student1);
        var url = "<%=request.getContextPath()%>" + "/v1/customObjectList.action";
        $.ajax({
            url: url,
            type: "POST",
            data: JSON.stringify(studentArray),     //將數組轉化為json字符串
            dataType: "text",
            contentType: "application/json; charset=utf-8",
            success: function (result) {
                alert(result);
            }
        });
    }

Action接收

    @RequestMapping(value = "/customObjectList", method = RequestMethod.POST)
    @ResponseBody
    public String customObjectList(@RequestBody List<Student> list) {
        try {
            list.stream().forEach(student ->
                System.out.println("name:" + student.getName() + " ;age:" + student.getAge())
            );
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "success";
    }

tips:springmvc支持自定義對象列表的參數傳遞是使用json串

前端開發人員需要了解兩點:

1、HttpServletRequest對象的Content-Type屬性,一般情況下,Content-Type的值有以下兩種:

Content-Type 含義
application/x-www-form-urlencoded;charser=utf-8 請求參數以form表單的形式提交
application/json;charset=utf-8 請求參數以json傳的形式提交

Content-TYpe為application/x-www-form-urlencoded;charser=utf-8是jquery ajax、post等方法的默認行為,大多數的業務,采用這種方式就可以滿足我們的需求。

本次請求傳遞的是json傳,所以

2、jquery的JSON.stringify函數的含義:它會將前端參數轉變為json傳

后端開發人員需要了解:contentType: "application/json; charset=utf-8"

@RequestBody的含義:將json串轉變為對象。

7、入參為單個自定義對象列表參數傳遞,通過DTO的方式

Ajax請求

    function customObjectListByDto() {
        /!*必須與自定義對象的屬性名保持一致*!/
        var data = {
            "studentList" : [
                {"name" : "張三", "age" : 12},
                {"name" : "李四", "age" : 13}
            ]
        };
        var url = "<%=request.getContextPath()%>" + "/v1/customObjectListByDto.action";
        $.ajax({
            url: url,
            type: "POST",
            data: JSON.stringify(data),     //將數組轉化為json字符串
            dataType: "text",
            contentType: "application/json; charset=utf-8",
            success: function (result) {
                alert(result);
            }
        });
    }

Action接收

    @RequestMapping(value = "/customObjectListByDto", method = RequestMethod.POST)
    @ResponseBody
    public String customObjectListByDto(@RequestBody StudentDto studentDto) {
        try {
            studentDto.getStudentList().stream().forEach(student ->
                    System.out.println("name:" + student.getName() + " ;age:" + student.getAge())
            );
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "success";
    }

tips:自定義對象列表的參數傳遞,springmvc目前只能支持前端傳遞json串,后台使用DTO這種方式,對於這種傳值方式,后端@RequestBody標簽是必不可少的,它會告訴springmvc,需要將前端提交的數據映射到DTO的對象屬性上。

8、入參為多個自定義對象列表和簡單對象參數傳遞,通過DTO的方式

Ajax請求

    function mixedCustomObjectListByDto() {
        /!*必須與自定義對象的屬性名保持一致*!/
        var data = {
            "schoolName" : "東方完小",
            "year" : 2018,
            "studentList" : [
                {"name" : "張三", "age" : 12},
                {"name" : "李四", "age" : 13}
            ],
            "gradeList" : [
                {"name" : "二年級", "classNum" : 2},
                {"name" : "三年級", "classNum" : 3}
            ]
        };
        var url = "<%=request.getContextPath()%>" + "/v1/mixedCustomObjectListByDto.action";
        $.ajax({
            url: url,
            type: "POST",
            data: JSON.stringify(data),     //將數組轉化為json字符串
            dataType: "text",
            contentType: "application/json; charset=utf-8",
            success: function (result) {
                alert(result);
            }
        });
    }

Action接收

    @RequestMapping(value = "/mixedCustomObjectListByDto", method = RequestMethod.POST)
    @ResponseBody
    public String mixedCustomObjectListByDto(@RequestBody StudentDto studentDto) {
        studentDto.getStudentList().stream().forEach(student ->
                System.out.println("name:" + student.getName() + " ;age:" + student.getAge())
        );
        studentDto.getGradeList().stream().forEach(grade ->
                System.out.println("className:" + grade.getName() + " ;classNum:" + grade.getClassNum())
        );
        return "success";
    }
tips:springmvc不支持json到多個DTO對象的mapping映射。
9、StudentDto.java、Student.java、Grade.java
public class StudentDto {
    private String schoolName;

    private Integer year;

    private List<Student> studentList;

    private List<Grade> gradeList;

    public String getSchoolName() {
        return schoolName;
    }

    public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }

    public Integer getYear() {
        return year;
    }

    public void setYear(Integer year) {
        this.year = year;
    }

    public List<Student> getStudentList() {
        return studentList;
    }

    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }

    public List<Grade> getGradeList() {
        return gradeList;
    }

    public void setGradeList(List<Grade> gradeList) {
        this.gradeList = gradeList;
    }
}

public class Student {
    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

public class Grade {
    private Integer id;
    private String name;
    private Integer classNum;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getClassNum() {
        return classNum;
    }

    public void setClassNum(Integer classNum) {
        this.classNum = classNum;
    }
}

 代碼已上傳github:https://github.com/architectboy/ssm-web/releases/tag/ssm-web-1.0

總結不易,轉發請表明出處:https://www.cnblogs.com/19940330a/p/9873123.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM