如何使用一对多Hibernate映射验证服务器端Spring MVC中的表单字段
我正在使用SpringMVC和Hibernate进行注册。我有两个模型类,即parent和student,使用hibernate一对多映射。注册JSP页面包含学生和家长字段。如何使用一对多Hibernate映射验证服务器端Spring MVC中的表单字段,spring,hibernate,jsp,spring-mvc,Spring,Hibernate,Jsp,Spring Mvc,我正在使用SpringMVC和Hibernate进行注册。我有两个模型类,即parent和student,使用hibernate一对多映射。注册JSP页面包含学生和家长字段。 如何在服务器端验证这两个字段,以及如何在文本框附近的JSP中显示错误 我不知道如何编写spring表单,也不知道如何在JSP中使用ModelAttribute映射到控制器。我只使用了html表单。 在下面的验证程序类中,我正在尝试验证 <form id="studentEnrollmentForm" method="
如何在服务器端验证这两个字段,以及如何在文本框附近的JSP中显示错误
我不知道如何编写spring表单,也不知道如何在JSP中使用ModelAttribute映射到控制器。我只使用了html表单。 在下面的验证程序类中,我正在尝试验证
<form id="studentEnrollmentForm" method="post" class="form-horizontal" action="saveStudentByAdmin">
<div class="form-group">
<label class="col-xs-2 control-label">Student Full Name</label>
<div class="group">
<div class="col-xs-3">
<input type="text" class="form-control" name="studentFirstName" id="fn" placeholder="First name" />
</div>
</div>
<div class="col-xs-3">
<input type="text" class="form-control" name="studentMiddleName" placeholder="Middle name" />
</div>
<div class="col-xs-3">
<input type="text" class="form-control" name="studentLastName" placeholder="Last name" />
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Parents Full Name</label>
<div class="col-xs-3">
<input type="text" class="form-control" name="parentFirstName" placeholder="First name" />
</div>
<div class="col-xs-3">
<input type="text" class="form-control" name="parentMiddleName" placeholder="Middle name" />
</div>
<div class="col-xs-3">
<input type="text" class="form-control" name="parentLastName" placeholder="Last name" />
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Date-of-birth</label>
<div class="col-xs-3 ">
<div class="input-group input-append date" id="studentDOB">
<input type="Text" class="form-control" name="studentDOB" /> <span
class="input-group-addon add-on"><span
class="glyphicon glyphicon-calendar"></span></span>
</div>
</div>
<label class="col-xs-3 control-label">Gender</label>
<div class="col-xs-3">
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-default">
<input type="radio" name="studentGender" value="male" />Male</label>
<label class="btn btn-default">
<input type="radio" name="studentGender" value="female" />Female</label>
</div>
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Phone</label>
<div class="col-xs-3">
<input type="text" class="form-control" name="parentPhoneNumber" placeholder="Phone number" />
</div>
<label class="col-xs-3 control-label">Email</label>
<div class="col-xs-3">
<input type="text" class="form-control" name="parentEmail" placeholder="Email" />
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Permanent Address</label>
<div class="col-xs-3">
<textarea class="form-control" rows="3" name="studentPermanentAddress" /></textarea>
</div>
<label class="col-xs-3 control-label">Present Address</label>
<div class="col-xs-3">
<textarea class="form-control" rows="3" name="studentPresentAddress" /></textarea>
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Class to join</label>
<div class="col-xs-3">
<!-- <input type="text" class="form-control" name="className" placeholder="Enter Class" /> -->
<select name="className" class="form-control">
<option value="">Select class </option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
</select>
</div>
</div>
<div class="form-group">
<div class="col-xs-1 ">
<button type="submit" class="btn btn-primary ">Submit</button>
</div>
<div class="col-xs-1 ">
<button type="reset" class="btn btn-default" id="rstbutton">Refresh</button>
</div>
</div>
</form>
验证程序类
@Component
public class StudentRegistrationFromAdminValidator implements Validator {
public boolean supports(Class<?> clazz) {
return StudentDTO.class.isAssignableFrom(clazz);
//return ParentDTO.class.isAssignableFrom(clazz);
}
public void validate(Object target, Errors errors) {
StudentDTO student = (StudentDTO)target;
ParentDTO parent = (ParentDTO)target;
String studentFirstName = student.getStudentFirstName();
String parentFirstName=parent.getParentFirstName();
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "studentFirstName", "student.studentFirstName.empty");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "parentFirstName", "parent.parentFirstName.empty");
if(studentFirstName.equals("pradee")){
errors.rejectValue("studentFirstName", "student.studentFirstName.invalid");
}
if(parentFirstName.equals("pradee")){
errors.rejectValue("parentFirstName", "parent.parentFirstName.invalid");
}
}
}
@组件
公共类StudentRegistrationFromAdminValidator实现验证器{
公共布尔支持(类clazz){
返回学生到班级。可从(课堂)签名;
//返回ParentDTO.class.isAssignableFrom(clazz);
}
公共无效验证(对象目标、错误){
学生对学生=(学生对)目标;
ParentDTO parent=(ParentDTO)目标;
字符串studentFirstName=student.getStudentFirstName();
字符串parentFirstName=parent.getParentFirstName();
ValidationUtils.rejectIfEmptyOrWhitespace(错误,“studentFirstName”、“student.studentFirstName.empty”);
ValidationUtils.rejectIfEmptyOrWhitespace(错误,“parentFirstName”、“parent.parentFirstName.empty”);
if(studentFirstName.equals(“pradee”)){
errors.rejectValue(“studentFirstName”、“student.studentFirstName.invalid”);
}
if(parentFirstName.equals(“pradee”)){
errors.rejectValue(“parentFirstName”,“parent.parentFirstName.invalid”);
}
}
}
您可以在Spring MVC和hibernate中使用服务器端表单验证。Hibernate具有带有许多注释的Hibernate验证程序。为了使用它,必须对模型类的属性进行注释
SpringMVC提供了对bean验证的全面支持。在将模型对象的属性与使用Spring表单标记的JSP表单的输入绑定后,它将验证由@Valid注释注释的模型对象
因为您使用的是基于注释的SpringMVC。为什么不使用注释进行验证呢。下面是我为这个问题所做的
使用表单标记修改JSP:
<form:form id="studentEnrollmentForm" method="post"
class="form-horizontal" action="/saveStudentByAdmin"
modelAttribute="student">
<div class="form-group">
<label class="col-xs-2 control-label">Student Full Name</label>
<div class="group">
<div class="col-xs-3">
<form:input type="text" class="form-control" path="firstName"
placeholder="First name" />
<!-- errors will display here -->
<form:errors path="firstName" cssStyle="color : red;"/>
</div>
</div>
<div class="col-xs-3">
<form:input type="text" class="form-control" path="middleName"
placeholder="Middle name" />
</div>
<div class="col-xs-3">
<form:input type="text" class="form-control" path="lastName"
placeholder="Last name" />
<form:errors path="lastName" cssStyle="color : red;"/>
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Parents Full Name</label>
<div class="col-xs-3">
<form:input type="text" class="form-control" path="parent.firstName"
placeholder="First name" />
<form:errors path="parent.firstName" cssStyle="color : red;"/>
</div>
<div class="col-xs-3">
<form:input type="text" class="form-control"
path="parent.middleName" placeholder="Middle name" />
</div>
<div class="col-xs-3">
<form:input type="text" class="form-control" path="parent.lastName"
placeholder="Last name" />
<form:errors path="parent.lastName" cssStyle="color : red;"/>
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Date-of-birth</label>
<div class="col-xs-3 ">
<div class="input-group input-append date" id="studentDOB">
<form:input type="Text" class="form-control" path="DOB" />
<span class="input-group-addon add-on"><span
class="glyphicon glyphicon-calendar"></span></span>
</div>
</div>
<label class="col-xs-3 control-label">Gender</label>
<div class="col-xs-3">
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-default"> <form:radiobutton
path="gender" value="male" />Male
</label> <label class="btn btn-default"> <form:radiobutton
path="gender" value="female" />Female
</label>
<form:errors path="gender" cssStyle="color : red;"/>
</div>
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Phone</label>
<div class="col-xs-3">
<form:input type="text" class="form-control"
path="parent.phoneNumber" placeholder="Phone number" />
<form:errors path="parent.phoneNumber" cssStyle="color : red;"/>
</div>
<label class="col-xs-3 control-label">Email</label>
<div class="col-xs-3">
<form:input type="text" class="form-control" path="parent.email"
placeholder="Email" />
<form:errors path="parent.email" cssStyle="color : red;"/>
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Permanent Address</label>
<div class="col-xs-3">
<form:textarea class="form-control" rows="3" path="permanentAddress" />
<form:errors path="permanentAddress" cssStyle="color : red;"/>
</div>
<label class="col-xs-3 control-label">Present Address</label>
<div class="col-xs-3">
<form:textarea class="form-control" rows="3" path="presentAddress" />
<form:errors path="presentAddress" cssStyle="color : red;"/>
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Class to join</label>
<div class="col-xs-3">
<form:select path="className" class="form-control">
<form:option value="" label="Select class"></form:option>
<form:options items="${classNames}" />
</form:select>
<form:errors path="className" cssStyle="color : red;"/>
</div>
</div>
<div class="form-group">
<div class="col-xs-1 ">
<button type="submit" class="btn btn-primary ">Submit</button>
</div>
<div class="col-xs-1 ">
<button type="reset" class="btn btn-default" id="rstbutton">Refresh</button>
</div>
</div>
</form:form>
父类:
@Entity
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@NotEmpty(message = "Please enter parent first name.")
private String firstName;
private String middleName;
@NotEmpty(message = "Parent first name is required.")
private String lastName;
@NotEmpty(message = "phone number must be filled.")
private String phoneNumber;
@Email(message = "Email is not valid.")
private String email;
... //All getters and setters;
}
控制器:
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@NotEmpty(message = "Please enter your first name.")
private String firstName;
private String middleName;
@NotEmpty(message = "Please enter your last name.")
private String lastName;
@NotEmpty(message = "Please enter date of birth.")
private String DOB;
@NotNull
private String gender;
@NotEmpty(message = "Please enter your permanent address.")
private String permanentAddress;
@NotEmpty(message = "Please enter your present address.")
private String presentAddress;
@Range(min = 1, max=10, message = "class must be between 1 to 10")
private String className;
@Valid
@ManyToOne
@JoinColumn(name = "parentId")
private Parent parent;
... //All getters and setters;
}
@Controller
@RequestMapping("/")
public class AdminRegistrationController {
@Autowired
private IAdminRegistrationService adminRegistrationService;
@Autowired
private StudentRegistrationFromAdminValidator studentRegistrationFromAdminValidator;
@RequestMapping(value = "/register", method = RequestMethod.GET)
public String viewRegistrationPage(Model model) {
StudentDTO studentDTO = new StudentDTO();
ParentDTO pdto = new ParentDTO();
model.addAttribute("teacherDTO", studentDTO);
model.addAttribute("teacherDTO", pdto);
return "StudentEnrollmentByAdmin";
}
@GetMapping("/")
public String displayRegistrationForm(Model model) {
model.addAttribute("classNames", new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" });
model.addAttribute("student", new Student());
return "registration"; // return registration jsp
}
@RequestMapping(value = "/saveStudentByAdmin", method = RequestMethod.POST)
public String saveTeacherByAdmin(@Valid @ModelAttribute("student") Student student, BindingResult bindingResult) {
if (bindingResult.hasErrors()
return "registration"; //it returns the error messages to the same page
}
return "redirect:/register";
}
}
您可以共享模型类吗?您可以共享找到的邮件idNo WebApplicationContext:不在DispatcherServlet请求中,也没有注册ContextLoaderListener吗?确切的错误是什么?它在我的电脑里运行得很好。我在这里非常挣扎,请浏览链接
@Controller
@RequestMapping("/")
public class AdminRegistrationController {
@Autowired
private IAdminRegistrationService adminRegistrationService;
@Autowired
private StudentRegistrationFromAdminValidator studentRegistrationFromAdminValidator;
@RequestMapping(value = "/register", method = RequestMethod.GET)
public String viewRegistrationPage(Model model) {
StudentDTO studentDTO = new StudentDTO();
ParentDTO pdto = new ParentDTO();
model.addAttribute("teacherDTO", studentDTO);
model.addAttribute("teacherDTO", pdto);
return "StudentEnrollmentByAdmin";
}
@GetMapping("/")
public String displayRegistrationForm(Model model) {
model.addAttribute("classNames", new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" });
model.addAttribute("student", new Student());
return "registration"; // return registration jsp
}
@RequestMapping(value = "/saveStudentByAdmin", method = RequestMethod.POST)
public String saveTeacherByAdmin(@Valid @ModelAttribute("student") Student student, BindingResult bindingResult) {
if (bindingResult.hasErrors()
return "registration"; //it returns the error messages to the same page
}
return "redirect:/register";
}
}