我正在使用Spring MVC和Hibernate进行注册。我有两个模型类,即父和学生,hibernate一对多映射。注册JSP页面包含学生和父学习字段。
如何验证服务器端的两个字段以及如何在文本框附近的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>
控制器
@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";
}
@RequestMapping(value = "/saveStudentByAdmin", method = RequestMethod.POST)
public String saveTeacherByAdmin(@Valid @ModelAttribute StudentDTO sdto,@ModelAttribute ParentDTO pdto,
BindingResult bindingResult) {
if(bindingResult.hasErrors()) {
System.out.println(bindingResult.getAllErrors().get(0).getDefaultMessage());
}
return "redirect:/register"; // this line redirecting to above method to avoid same data insertion again when i press f5
//return "TeacherEnrollmentByAdmin"; To know duplication insertion comment above line and above method current this line
//when you get response page(after insertion of data) press f5 and see in data base
}
}
验证员类
@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");
}
}
}
答案 0 :(得分:0)
您可以在Spring MVC中使用hibernate进行服务器端表单验证。 Hibernate有许多注释的休眠验证器。为了使用它,必须注释模型类的属性。
Spring MVC提供对bean验证的完全支持。在将其属性与使用Spring的表单标记的JSP表单的输入绑定后,它将验证由 @Valid 注释注释的模型对象。
因为您正在使用基于注释的Spring MVC。为什么不使用注释进行验证。这就是我为这个问题所做的。
使用表单标记修改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 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;
}
家长班:
@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;
}
控制器:
@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";
}
}