如何使用一对多Hibernate映射验证服务器端Spring MVC中的表单字段

时间:2017-03-25 05:22:10

标签: spring hibernate jsp spring-mvc

我正在使用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");
        }           
    }
}

1 个答案:

答案 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";
    }
}