0

私のばかげた質問と悪い英語でごめんなさい。Spring MVCを使用して、新しい開発済みWebでユーザーのパスワード変更メニューを検証しようとしています。

MultiActionControllerでSpring検証を実行する方法の指示に従いますか?

私はこのコードを書きます:

public ModelAndView hanldeBindException(HttpServletRequest request, HttpServletResponse response, ServletRequestBindingException bindingException) {
    BindException bindException = (BindException) bindingException.getRootCause();
    ModelMap modelmap = new ModelMap();
    ChangePasswordForm cpForm = new ChangePasswordForm();
    cpForm.setUsername(SessionHelper.getUsername());
    modelmap.addAttribute("ChangePasswordForm", cpForm);
    return new ModelAndView("changepassword").addAllObjects(bindException.getModel()).addObject("ChangePasswordForm", cpForm);
}     

そして私のjspで:

<form:form action="update.htm" commandName="ChangePasswordForm" >
    <form:errors path="*" cssClass="errorblock" element="div" />
    <table  class="form">
        <tr>
            <td class="col1"><label>User Name :</label></td>
            <td class="col2"><form:label path="username" >${ChangePasswordForm.username}</form:label></td>
        </tr>
        <tr>
            <td><label>Old Password :</label></td>
            <td><form:password path="oldPassword" id="oldPassword"></form:password>
                <form:errors path="oldPassword" cssClass="error" /></td>
        </tr>
        <tr>
            <td><label>New Password :</label></td>
            <td><form:password path="newPassword"></form:password>
            <form:errors path="newPassword" cssClass="error" /></td>
        </tr>
        <tr>
            <td><label>Confirm New Password :</label></td>
            <td><form:password path="confirmNewPassword"></form:password>
            <form:errors path="confirmNewPassword" cssClass="error" /></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="submit" ></td>
        </tr>
    </table>
</form:form>    

しかし、空のフィールドのようなネガティブテストを試みても、画面にエラーは表示されません。印刷しようとすると

System.out.println("UserController::hanldeBindException::1" + bindException.getObjectName());

オブジェクト名が「ChangePasswordForm」であるjspのコマンド名ではなく「command」であることを示しています。そのcommandNameを「command」に変更しようとすると機能します。しかし、私はBindExceptionクラスでObjectNameを設定する方法があるのか​​、それともデフォルトの「コマンド」オブジェクト名の代わりにカスタム名を使用する別の方法があるのか​​、興味がありますか?

アップデート

commandNameを"command"に変更して次のようにすると、検証が機能します。

<form:form action="update.htm" commandName="command">
   <!-- Form Field and Error define here -->
</form:form>

もちろん、コントローラーでも調整を行います。別の名前に変更すると、機能しなくなります。

Spring Framework3.0.2RELEASEを使用しています。

4

1 に答える 1

0

簡単な答えは、BaseCommandController をなんらかの形式 (AbstractCommandController など) で拡張している可能性が最も高いということです。その場合、おそらく "getCommandName()" および "getCommand()" メソッドをオーバーライドする必要があります。しかし、あなたが提供したコードからはわかりません。

どのバージョンの春を使用していますか? 「コマンド」の考え方は、基本クラスと同様に 3.0 以降では比較的時代遅れになっています。代わりに、アノテーション ベースのコントローラーとモデル属性を使用します。

@Controller
@SessionAttributes({"changePasswordForm"})
public class MyController {
    @InitBinder
    public void initBinder(WebDataBinder binder) {
       binder.setValidator(new ChangePasswordFormValidator());
    }

    @ModelAttribute("changePasswordForm")
    public ChangePasswordForm createChangePasswordForm() {
      ...
    }


    @RequestMapping(...)
    public ModelAndView controllerMethod(
          @Valid @ModelAttribute changePasswordForm ChangePasswordForm) {
      ...
    }
}

これにより、コントローラー メソッドを呼び出す前にフォームが自動的に検証され、呼び出し元のページに戻ります。

バリデーターでは、validate メソッドにエラー メッセージ コードを指定します。

public void validate(Object target, Errors errors) {
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username", "username.required");
}

次に、「username.required」が、Spring に提供した MessageSource のキーであることを確認します。

フォームタグは、あなたが持っているのとまったく同じように機能するはずです。

コントローラーのスプリングリファレンスマニュアルは次のとおりです。

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-controller

于 2013-02-01T05:36:37.877 に答える