私は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 バリデーターを使用して文字列の有効な長さを指定できると思いますか?)
したがって、ログイン フォームが送信されると、コントローラー クラスに宣言されたこのメソッドによって処理される/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