【问题标题】:Spring MVC Validation w/ ModelAndView带有 ModelAndView 的 Spring MVC 验证
【发布时间】:2015-03-16 15:18:10
【问题描述】:

我正在尝试向我的 Spring MVC 应用程序添加验证。在尝试设置验证之前,我一直在使用 ModelAndView 来提供 jsp 页面,但没有显示错误消息。

型号

@Entity
@Table(name = "employee")
public class Employee {


@Id
@NotEmpty(message = "Please enter your email addresss.")
@Email
private String email;

@NotEmpty
@Pattern(regexp="[a-zA-Z0-9]")
private String password;

@NotEmpty
private String firstName;

@NotEmpty
private String lastName;

@NotEmpty
private String phoneNum;


private boolean assigned;

public Employee() {

}

// getters and setters
}

控制器

@RestController
@RequestMapping("/employee")
public class EmployeeController {

private static final Logger LOGGER = LogManager
        .getLogger(EmployeeController.class.getName());

@Autowired
private EmployeeServiceImpl employeeService;

@RequestMapping(value = "/new", method = RequestMethod.GET)
public ModelAndView getRegisterView(Model m) {
    return new ModelAndView("addEmployee", "employeeForm", new Employee());
}

@RequestMapping(value = "/register", method = RequestMethod.POST)
public ModelAndView postUser(@Valid Employee employee, BindingResult result) {
    ModelAndView model;
    if (result.hasErrors()) {
        model = new ModelAndView("addEmployee", "employeeForm", employee);
    } else {
        employeeService.addEmployee(employee);
        model = new ModelAndView();
        model.setViewName("displayEmployee");
        model.addObject("employees", employeeService.getEmployees());
    }

    return model;
}
}

表格

<form:form class="form-horizontal" role="form" method="POST"
        action="register" commandName="employeeForm" modelattribute="employee">
        <div class="form-group">
            <form:label path="firstName"
                class="control-label col-lg-2 col-lg-offset-2 col-md-2 col-md-offset-2 col-sm-12"
                for="fname">First Name:</form:label>
            <div class="col-lg-6 col-md-6 col-sm-12">
                <form:input path="firstName" class="form-control" id="fname"
                    placeholder="First Name" />
                <form:errors path="firstName" />
            </div>
        </div>
        <div class="form-group">
            <form:label path="lastName"
                class="control-label col-lg-2 col-lg-offset-2 col-md-2 col-md-offset-2 col-sm-12"
                for="lname">Last Name:</form:label>
            <div class="col-lg-6 col-md-6 col-sm-12">
                <form:input path="lastName" class="form-control" id="lname"
                    placeholder="Last Name" />
                <form:errors path="lastName" />
            </div>
        </div>
        <div class="form-group">
            <form:label path="email"
                class="control-label col-lg-2 col-lg-offset-2 col-md-2 col-md-offset-2 col-sm-12"
                for="email">Email:</form:label>
            <div class="col-lg-6 col-md-6 col-sm-12">
                <form:input path="email" type="email" class="form-control"
                    id="email" placeholder="Email" />
                <form:errors path="email" cssClass="error" />
            </div>
        </div>
        <div class="form-group">
            <form:label path="phoneNum"
                class="control-label col-lg-2 col-lg-offset-2 col-md-2 col-md-offset-2 col-sm-12"
                for="phoneNum">Phone Number:</form:label>
            <div class="col-lg-6 col-md-6 col-sm-12">
                <form:input path="phoneNum" class="form-control" id="phoneNum"
                    placeholder="Phone Number" />
                <form:errors path="phoneNum" />
            </div>
        </div>
        <div class="form-group">
            <form:label path="password"
                class="control-label col-lg-2 col-lg-offset-2 col-md-2 col-md-offset-2 col-sm-12"
                for="pwd">Password:</form:label>
            <div class="col-lg-6 col-md-6 col-sm-12 controls">
                <form:input path="password" type="password" class="form-control"
                    id="pwd" placeholder="Password" />
                <form:errors path="password" />
            </div>
        </div>
        <div class="form-group form-actions">
            <div
                class="col-lg-offset-4 col-lg-1 col-md-offset-4 col-md-1 col-sm-1">
                <button type="submit" class="btn btn-primary">Register</button>
            </div>
            <div class="col-lg-1 col-md-1 col-sm-1">
                <button type="reset" class="btn btn-primary">Clear</button>
            </div>
        </div>
        <form:hidden path="assigned" value="false" />
    </form:form>

【问题讨论】:

    标签: java spring validation spring-mvc


    【解决方案1】:
    model = new ModelAndView("addEmployee", "employeeForm", employee);
    

    您自己在代码中破坏了模型,所以当返回页面时,基本上什么都没有了。返回ModelAndView时,Spring MVC 假定您已经准备好并添加了自己渲染视图所需的一切。

    而是将@ModelAttribute("employeeForm") 添加到@Valid 注释旁边的方法参数中,并使用BindingResult 中的现有模型来构造ModelAndView

    @RequestMapping(value = "/register", method = RequestMethod.POST)
    public ModelAndView postUser(@Valid @ModelAttribute("employeeForm" Employee employee, BindingResult result) {
        ModelAndView model;
        if (result.hasErrors()) {
            model = new ModelAndView("addEmployee", result.getModel());
    

    虽然这可行,但为什么不简单地返回一个 String 作为视图的名称,并在需要时做一些 Model 准备工作。

    @RequestMapping(value = "/register", method = RequestMethod.POST)
    public String postUser(@Valid @ModelAttribute("employeeForm") Employee employee, BindingResult result, Model model) {
        if (result.hasErrors()) {
            return "addEmployee";
        } else {
            employeeService.addEmployee(employee);
            model.addObject("employees", employeeService.getEmployees());
            return "displayEmployee";
        }
    }
    

    我什至会争辩说,为displayEmployee 页面填充Model 不属于这里,而是在为该页面准备模型的单独方法中。

    【讨论】:

    • 看起来很完美,我知道我还没有应用最佳实践。我现在只是想推出一个粗略的工作版本。感谢您的帮助!
    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多