我正在开发一个Spring MVC项目,我从UI表单中获取一些数据。我有一个DTO课程,里面有私人会员。当我提交表单数据时,由于@RequestMapping
注释,FrontController(Dispatcher Servlet)调用Controller类的方法。在这个方法中,我将DTO类的引用作为参数传递,并通过调用getter方法在控制台上打印DTO类的成员变量的值。
但我不明白DTO类的对象是如何自动创建的,并且表单数据绑定到DTO类的成员变量。请告诉我它是如何工作的?
控制器类
package com.soni.web.controller;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.soni.web.dto.StudentRecordsDTO;
@Component
@RequestMapping("/")
public class StudentRecords {
public StudentRecords() {
System.out.println(getClass().getName());
}
@RequestMapping(value="/signup", method = RequestMethod.POST)
public String signup(StudentRecordsDTO studentRecordsDTO) {
System.out.println(studentRecordsDTO.getId());
System.out.println(studentRecordsDTO.getName());
return "/registration_success.html";
}
}
DTO课程
package com.soni.web.dto;
public class StudentRecordsDTO {
private int id;
private String name;
public StudentRecordsDTO(int id, String name) {
this.id = id;
this.name = 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;
}
}
HTML表单
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="signup" method ="post">
<input type = "num" name="id">
<input type = "text" name="name">
<input type = "password" name="pwd">
<input type = "num" name = "nm">
<input type = "submit" value="press">
</form>
</body>
</html>
答案 0 :(得分:1)
由于您使用的是POST方法,因此您作为BODY(JSON数据)的一部分发送的任何内容都将转换为POJO(普通的旧Java对象),即本例中的StudentRecordsDTO,即signup()方法的参数。
如果您从客户端发送的json数据看起来像这样的话
{
"id" : 1,
"name" : "Chirag"
}
然后在内部发生JSON反序列化时,更多关于序列化/反序列化here
“ id ”映射到类中的“ id ”属性,并使用setter方法使用java约定来设置对象的值。
同样,“名称”会映射到班级中的“名称”属性。
所以,在内部你可以这样想。
StudentRecordsDTO studentRecordsDTO = new StudentRecordsDTO();
studentRecordsDTO.setId(1);
studentRecordsDTO.setName("Chirag")
并将此studentRecordsDTO对象传递给您的控制器方法,其值设置为您传递的内容。
您也可以在此处使用@RequestBody以提高可读性。
@RequestMapping(value="/signup", method = RequestMethod.POST)
public String signup(RequestBody StudentRecordsDTO studentRecordsDTO) {
System.out.println(studentRecordsDTO.getId());
System.out.println(studentRecordsDTO.getName());
return "/registration_success.html";
}
所以春天会在背景中为你做这件事。你也可以看看
@RequestHeader设置直接作为请求的一部分传递的标头。 @RequestParam在GET方法的情况下额外提出请求参数。
提供了各种其他抽象(和定制)spring,因此您可以专注于核心业务逻辑。