我是 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
...............................................
...............................................
}
如您所见,在用户名和密码字段上声明了@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模型对象中的注释定义的错误消息。具体是如何工作的?
肿瘤坏死因子