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

如何使用一对多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="

我正在使用SpringMVC和Hibernate进行注册。我有两个模型类,即parent和student,使用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>
验证程序类

@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";
    }
}