一、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