4

この質問が以前に行われたことがある場合は、お詫び申し上げます。誰かが介入して、フォーム検証エラーが表示されない理由を理解するのを手伝ってくれることを願っています。

Spring 3.0.3とHibernateを使用しており、フォーム入力を検証するためにjsr-303検証を使用しています。Springのフォームtaglibを使用して作成されたフォームを含むページのGETを処理するSpringコントローラーがあります。このフォームでは、ユーザーは自分の名前を変更してデータベースに保存することができます。入力のいずれかが空の場合、フォームのあるページがエラーメッセージとともに再度表示されます。同じコントローラーがページの送信を処理します。コントローラはほとんどの点で正常に機能しているようですが、ユーザーが送信したフォームにエラーがある場合、ページにエラーは表示されません。

フォームは次のようになります。

<form:form commandName="changeNameCommand">
    <form:errors path="*" cssClass="errorBox" />

    <table width="100%" border="0" cellspacing="5" cellpadding="5" align="left">
      <tr>
    <td><b>First Name:</b></td>
    <td><form:input path="firstName" value="${user.firstName}" /></td>
  </tr>
  <tr>
    <td><b>Last Name:</b></td>
    <td> <form:input path="lastName" value="${user.lastName}" /></td>
  </tr>
</table>
</form:form>    

ビューには、ユーザーの現在の姓名をフォームに入力するために使用されるユーザーオブジェクトがあることに注意してください。これは正しく機能しています。

コントローラは次のようになります。

@Controller
@RequestMapping(value =  "/account/settings/change-name")
@SessionAttributes("changeNameCommand")
public class ChangeNameController {

    @ModelAttribute("changeNameCommand")
    public ChangeNameCommand getCommand() {
        return new ChangeNameCommand();
    }

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView getChangeNamePage(HttpServletRequest req) {
    ModelAndView mav = new ModelAndView("Account.ChangeName");
        mav.addObject("page_title", "Change Name");

        return mav;
    }

    @RequestMapping(method = RequestMethod.POST)
    public String doChangeName(
                @ModelAttribute("changeNameCommand") 
                    @Valid ChangeNameCommand command, 
                    BindingResult result, SessionStatus status) {

        if (result.hasErrors()) {
            return "redirect:/account/settings/change-name"; 
        }

    // Code here to persist updated user first and last name to database...        

        status.setComplete();

        return "redirect:/home";
    }
}

Tiles 2.1.2を使用してページを作成し、Urlrewrite3.1.0を使用してわかりやすいURLを作成しています。

ChangeNameCommandクラスは次のようになります。

import org.hibernate.validator.constraints.NotEmpty;

public class ChangeNameCommand {

    @NotEmpty(message = "You must provide a first name.")
    private String firstName;

    @NotEmpty(message = "You must provide a last name.")
    private String lastName;

    @NotEmpty(message = "Your password is required to make changes.")
    private String currentPassword;

    // Getters and setters here...
}

デバッグ時に、名前または名前のどちらにも入力がない場合、BindingResultインスタンスにエラーが含まれていることがわかります。私の懸念は、エラーが発生したときのリダイレクトです。ここで、redirect:プレフィックスを使用する代わりに、ビュー名を返すだけの他の質問を見てきました。私はそれを試しましたが、(私が思うに)Urlrewriteの使用方法と、サーブレットマッピングの設定方法が原因で、Springはエラーを返します。帰ってみました

/account/settings/change-name
/web/account/settings/change-name
/mywebsite/web/account/settings/change-name

しかし、役に立たない。FWIW、これが私のサーブレットマッピングです:

<servlet-mapping>
    <servlet-name>mywebsite</servlet-name>
    <url-pattern>/web/*</url-pattern>
</servlet-mapping>

どんな助けでも大歓迎です!

4

2 に答える 2

3

using を使用redirectすると、すべてのリクエスト属性 (エラーとモデル全体を含む) が消えます。そのため、リダイレクトを使用したり、セッションを使用してデータを一時的に保存したり、会話を使用したりしないでください。または、フラッシュスコープのようなものを使用する方法を見つけます (私はしばらくの間しようとしています)。

もう1つのことUrlRewriteFilter-spring-mvcでの使用は求められていません。spring-mvc のみを使用して、美しい REST のような URL を完全に制御できます。

于 2010-10-03T07:23:28.710 に答える
1

これが私の問題を解決した方法です。まず、UrlRewriteFilter と Tiles の使用をやめたくありませんでした。ただし、これの問題は、エラーの場合、コントローラーのRequestMapping注釈に示されているように、パスを返すことができないことでした。以下は、エラーの場合にリダイレクトが削除された私のソリューションdoChangeName()です。

@Controller
@RequestMapping(value =  "/account/settings/change-name")
@SessionAttributes("changeNameCommand")
public class ChangeNameController {

    @ModelAttribute("changeNameCommand")
    public ChangeNameCommand getCommand() {        
        return new ChangeNameCommand();
    } 

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView getChangeNamePage() {
        ModelAndView mav = new ModelAndView("Account.ChangeName");
        mav.addObject("page_title", "Change Name");

        return mav;
    }

    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView doChangeName(@ModelAttribute("changeNameCommand") @Valid ChangeNameCommand command, 
            BindingResult result, SessionStatus status) {

        if (result.hasErrors
            ModelAndView mav = new ModelAndView("Account.ChangeName");
            mav.addObject("page_title", "Change Name");

            return mav;
         }

        // Code here to persist updated user first and last name to database...         

        status.setComplete();

        RedirectView view = new RedirectView("/home");
        return new ModelAndView(view);        
    }
}

これについて私を助けてくれたみんなに感謝します!

于 2010-10-09T19:55:29.730 に答える