Java Spring MVC 3 表单验证器未在 .jsp 中显示错误消息

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19791331/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 20:14:14  来源:igfitidea点击:

Spring MVC 3 Form Validator not displaying Error message in .jsp

javajspspring-mvcsyntax-errorspring-form

提问by ramlax

I entered in Spring Web MVC Frameworknot long ago thus I am a complete beginner. Right now I am implementing a basic formfor my first web application.

不久前进入Spring Web MVC 框架,所以我是一个完整的初学者。现在我正在为我的第一个web 应用程序实现一个基本的表单

In the same time I would like to say that I've been seeking a solution for my problem for whole day. I apolgize in advance if the solution for similar problem was already published.

同时,我想说我一整天都在为我的问题寻求解决方案。如果类似问题的解决方案已经发布,我会提前道歉。

Source code:

源代码:

spring-servlet.xml

spring-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans  xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="si.src.controllers" />
    <context:component-scan base-package="si.src.validators" />

    <bean id="viewResolver" 
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass">
            <value>org.springframework.web.servlet.view.JstlView</value>
        </property>
        <property name="prefix">
            <value>/WEB-INF/jsp/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>            
</beans>


index.jsp

索引.jsp

<!-- language: lang-jsp -->
<html>
<head>
    <title>Spring 3.0 MVC Series - Index</title>
</head>
<body>
    <br>
    <div align='center'>
        <p>
        <h1>Example - Spring Application</h1>
        The "index.jsp" is the entry point for our application.
        This is my first test. Work!            
        <p>
        <a href="login.html">Welcome! Click Here to Login</a>           
    </div>      
</body>
</html>


login.jsp

登录.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<html>
<head>
    <title>Spring Sample - Login Page</title>
</head>
<body>
    <h3>Login Page</h3><br>
    <form:form id="form" method="post" commandName="loginForm">
        <form:errors path="*" cssClass="errorblock" element="div" />
        <table>
            <tr>
                <td><form:label path="username">Username</form:label></td>
                <td><form:input path="username" /></td>
                <td><form:errors path="username" cssClass="error"/></td>
            </tr>
            <tr>
                <td><form:label path="username">Password</form:label></td>
                <td><form:input path="password" /></td>
                <td><form:errors path="password" cssClass="error"/></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="Sign in" /></td>
            </tr>
        </table>
    </form:form>
</body>
</html>


LoginFormController.java

登录表单控制器.java

package si.src.controllers;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springframework.web.servlet.ModelAndView;

import si.src.logic.Login;
import si.src.validators.LoginValidator;

@Controller
@RequestMapping(value="/login")
public class LoginFormController extends SimpleFormController{

    public LoginFormController(){
        setCommandClass(Login.class);   //Form's values will store into the Login object    
        setCommandName("loginForm");    //If HTML form action value with named "loginForm" is sumbitted, Spring will forward request to this form controller
    }

    @RequestMapping(method=RequestMethod.POST)
    protected ModelAndView onSubmit(HttpServletRequest request,
        HttpServletResponse response, Object command, BindException errors) throws Exception{

        LoginValidator validator = new LoginValidator();        
        Login userLogin = (Login) command;
        validator.validate(userLogin, errors.getBindingResult());

        if(errors.hasErrors()){
            userLogin.setUsername("");
            userLogin.setPassword("");
            System.out.println("Ne");
            return new ModelAndView("login","loginForm", userLogin);

        }
        else{
            System.out.println(userLogin);
            System.out.println(userLogin.getUsername() + " " + userLogin.getPassword());    
            return new ModelAndView("success","userLogin", userLogin);
        }
    }

    protected Object formBackingObject(HttpServletRequest request) throws Exception {   
        //Initialize the values in the form. Not necessary
        Login userLogin = new Login();
        userLogin.setUsername("Admin");
        return userLogin;
    }

}


LoginValidator.java

登录验证器.java

package si.src.validators;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import org.springframework.validation.ValidationUtils;

import si.src.logic.Login;

public class LoginValidator implements Validator{

    public boolean supports(Class aClass) {
        //just validate the Login instances
        return Login.class.isAssignableFrom(aClass);
    }

    public void validate(Object obj, Errors errors) {
        Login login = (Login) obj;

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username","required-username", "Enter username");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password","required-password", "Enter password");    
    }   
}


Login.java

登录.java

package si.src.logic;

public class Login {

    private String username;
    private String password;

    public Login(){}

    public void setUsername(String username){
        this.username=username;
    }

    public String getUsername(){
        return username;
    }

    public void setPassword(String password){
        this.password=password;
    }

    public String getPassword(){
        return password;
    }   
}


I suppose the error messages obtained by LoginValidatorobject are not correctly "binded" with my login.jspfile. I guess that is the reason why the error messagesi.e "Enter username"and "Enter password"don't show up when my form is poorly fulfilled.

我想LoginValidator对象获得的错误消息没有与我的login.jsp文件正确“绑定” 。我想这就是为什么当我的表单没有得到很好的满足时,错误消息,“输入用户名”“输入密码”不显示的原因。

My question is: Why the error messages are not showing up in a login.jsp?

我的问题是:为什么错误消息没有显示在 login.jsp 中?

采纳答案by user2983066

I have similar problem. Also I have changed the type of return, but I have the need to trasfert date from controller to JSP. I use object model, but I have the same result of object modelandview.

我有类似的问题。我也改变了返回的类型,但我需要将日期从控制器传输到 JSP。我使用对象模型,但对象模型和视图的结果相同。

How can I transfer data without losing the display of form:errors?

如何在不丢失表单显示的情况下传输数据:错误?

@RequestMapping(value="/addCaregiver", method= RequestMethod.POST)
public String addCaregiver(@ModelAttribute("caregiver") @Valid  
Caregivers caregiver, BindingResult result,Principal principal, Model model){


caregiverValidator.validate(caregiver, result);
if(result.hasErrors()){

model.addAttribute("caregivers",pp.getCaregiverses(principal.getName()));
model.addAttribute("error", "true");
model.addAttribute("caregiver", new Caregivers());
return "caregiver";
        }
return "intro";
}

I solved, don't create a new istance, I delete this row:

我解决了,不要创建一个新的实例,我删除了这一行:

model.addAttribute("caregiver", new Caregivers());

回答by M. Deinum

return new ModelAndView("login","loginForm", userLogin);

You are destroying the model yourself. You are constructing a ModelAndViewyourself with a new model, ignoring/abandoning the current model. As such that also destroys the binding errors.

您自己正在破坏模型。您正在ModelAndView使用新模型构建自己,忽略/放弃当前模型。因此,这也会破坏绑定错误。

Also your code is wrong, you are extending a SimpleFormControllerwhich is a Controllerand annotating it with @Controller. This is trouble waiting to happen, remove the extends SimpleFormControlleras that is deprecated.

此外,您的代码是错误的,您正在扩展SimpleFormControlleraController并用@Controller. 这是等待发生的麻烦,删除extends SimpleFormController已弃用的。

Change your controller to something like this

将您的控制器更改为这样的

@Controller
@RequestMapping(value="/login")
public class LoginFormController {

    @ModelAttribute("loginForm")
    public Login loginForm() {
        return new Login();
        userLogin.setUsername("Admin");
        return userLogin;
    }

    @RequestMapping(method=RequestMethod.POST)
    public String submit(@ModelAttribute Login loginForm, BindingResult model) {

        LoginValidator validator = new LoginValidator();        
        validator.validate(loginForm, model);

        if(errors.hasErrors()){
            loginForm.setUsername("");
            loginForm.setPassword("");
            System.out.println("Ne");
            return "login";
        } else{
            System.out.println(loginForm);
            System.out.println(loginForm.getUsername() + " " + loginForm.getPassword());    
            return "success";
        }
    }
}