【发布时间】:2016-01-08 07:18:48
【问题描述】:
我是 Spring MVC 的新手,我已经导入了一个与服务器端验证相关的教程项目,但我对它的工作原理有些怀疑。
所以我有一个名为 login.jsp 的登录页面,其中包含此登录表单:
<form:form action="${pageContext.request.contextPath}/login" commandName="user" method="post">
<table>
<tr>
<td><label>Enter Username : </label></td>
<td><form:input type="text" path="username" name="username" />
<br> <form:errors path="username" style="color:red;"></form:errors>
</td>
</tr>
<tr>
<td><label>Enter Password : </label></td>
<td><form:input type="password" path="password" name="password" />
<br> <form:errors path="password" style="color:red;"></form:errors>
</td>
</tr>
<tr>
<td> </td>
<td align="center"><input type="submit" value="Login" /></td>
</tr>
</table>
</form:form>
我认为使用从模型中检索到的 commandName="user" 属性指定的对象(如果我的断言错误,请纠正我)来存储用户插入的用户名和密码。
这个 commandName="user" 是这个 User 类的一个实例:
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotBlank;
public class User {
@NotBlank(message="Username can not be blank")
private String username;
@Size(min=6,message="Password must be atleast 6 characters long")
private String password;
private String gender;
private String vehicle;
private String country;
private String image;
...............................................
...............................................
GETTER AND SETTER METHODS
...............................................
...............................................
}
如您所见,username 和 password 上声明了 @NotBlank 和 @Size 验证注解强> 领域。
这里的第一个疑问:与 2 used library javax.validation 和 org.hibernate.validator 到底有什么区别?
为什么在教程中同时使用两者?我可以只使用休眠验证器库来做同样的事情吗? (我认为我可以使用 Hibernate 验证器指定字符串的有效长度,或者不)?
因此,当登录表单被提交时,它会向 /login 资源生成 HttpRequest,该资源由该方法处理并声明为控制器类:
@RequestMapping(value="/login" , method=RequestMethod.POST)
public String do_login(HttpServletRequest req , Model md , HttpSession session , @Valid User user, BindingResult br)
{
try
{
//System.out.println(br.getAllErrors().size());
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("Username and pasword are : "+username +" "+ password);
if(br.getAllErrors().size() > 0){
System.out.println("Server side validation takes place....");
}
else{
Login_Model lm = new Login_Model();
String message = lm.do_login_process(username, password);
if(message.equals("login success"))
{
session.setAttribute("username", username);
return "redirect:/myprofile";
}
else
{
md.addAttribute("error_msg", message);
}
}
return "login";
}
catch(Exception e)
{
return "login";
}
}
好的,现在我对这个方法有以下疑惑:
1) 将这个对象作为输入参数:@Valid User user。 谁传给它?我认为这可能取决于我在表单中指定 commandName="user" 的事实,因此 Spring 会自动执行此操作。对吗?
2) 据我了解,@Valid 注释会自动调用验证过程。它是怎么发生的?与 Spring 提供的 AOP 功能有关吗?要不然是啥?为什么这个 @Valid 注释只与 javax.validation 库有关,而与 Hibernate 验证器无关(所以这个 @Valid 注释也验证用 Hibernate 验证器注解注解的字段?为什么?)
3) 据我了解,如果用户在登录表单中插入错误的值,我可以通过 BindingResult br 输入参数获取此错误。使用调试器,我可以看到该对象包含由定义到 User 模型对象中的注释定义的错误消息。具体是如何工作的?
Tnx
【问题讨论】:
-
stackoverflow.com/q/38716703/4723795 看起来回答得很好
标签: java spring spring-mvc hibernate-validator spring-validator