Я новичок в 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-х используемых библиотек javax.validation и org.hibernate.validator?
Почему в учебнике используются оба варианта? Могу ли я сделать то же самое, используя только библиотеку валидатора гибернации? (Я думаю, что могу указать допустимую длину строки с помощью валидатора Hibernate или нет)?
Итак, когда форма входа отправлена, она генерирует и HttpRequest для ресурса / login, который обрабатывается этим методом, объявленным в классе контроллера:
@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 автоматически вызывает процесс проверки. Как это случилось? связано ли что-то с функцией AOP, предоставляемой Spring? или что? Почему эта аннотация @Valid связана только с библиотекой javax.validation, а не также с валидатором Hibernate (так что эта аннотация @Valid также проверяет поле аннотировано аннотацией валидатора Hibernate? почему?)
3) Насколько я понимаю, если пользователь вводит неправильные значения в форму входа, я могу получить эту ошибку с помощью входного параметра BindingResult br. Используя отладчик, я вижу, что этот объект содержит сообщение об ошибке, определенное аннотацией, определенной в объекте модели Пользователь. Как именно работает?
Tnx