6

私はSpringが初めてで、日付形式を検証するフォームを作成しようとしています(つまりMM/dd/yyyy、ユーザーが「mm-dd-yyyy」を入力すると、「」という形式の日付のみを受け入れ、エラーメッセージが表示されます)。

Springでこれを達成するにはどうすればよいですか?

thisおよびthisのような多くの投稿と回答を読みましたが、コントローラーでを使用することをお勧めし@InitBinderます (試してみましたが、動作させることができませんでした)。しかし、日付が異なるフォームがある場合はどうなりますか? または、コントローラーが異なるフォームからの複数の投稿リクエストを管理し、それぞれに異なる日付の検証が必要な場合は?

現在、私はこのフォームを持っています:

<form:form action="getReportFile.html" commandName="staticReportForm">
            <table>
                <tr>
                    <td>Reports:</td>
                </tr>
                <tr>
                    <td><form:select path="report" items="${staticReports}"/>                        
                    </td>
                </tr>
               <tr>
                   <td>Date (MM/DD/YYYY) (empty for most recent possible):<FONT color="red"><form:errors
                                path="date" /></FONT></td>
               </tr>
               <tr>
                   <td><form:input path="date" /></td>
               </tr>
               <tr>
                   <td><input type="submit" value="Submit" /></td>
               </tr>
           </table>            
       </form:form>

そして、これはフォームをサポートする Bean になります (@DateTimeFormat注釈は、正しい形式を指定した場合にのみ機能します)。

public class StaticReportForm {
        @NotEmpty        
        private String report;    
        @DateTimeFormat(pattern="MM/dd/yyyy")
        private Date date;

    public String getReport() {
        return report;
    }

    public void setReport(String report) {
        this.report = report;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }


}
4

1 に答える 1

7

春にそれを行う直接的な方法があるかどうかはわかりませんが、私が行った方法は、jQuery の DatePicker と InitBinder の組み合わせです。

JS 側では、次のものを作成します。

<form:input cssClass="datepicker" path="someProperty" readonly="true" />

次にJSで:

$(document).ready(function() {
    $('.datepicker').datepicker();
});

コントローラー側で、次のようなメソッドを作成します。

@InitBinder
public void initBinder(WebDataBinder binder) {
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    sdf.setLenient(true);
    binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
}

ここから、リソース バンドルに typeMismatch メッセージを作成して、見栄えの良いメッセージを作成できます。ユーザーはフィールドに手動で入力することはできませんが、必要に応じて日付をフォーマットする jQuery DatePicker のみを使用できます (デフォルトは MM/dd/yyyy だと思います)。彼らがなんとか日付を入力できた場合、Spring は構成された CustomEditor を使用して、文字列をビューから期待される日付に変換します。失敗すると、BindingResults でエラーが発生します (メソッド シグネチャに含める場合)。前に述べたように、このメソッドはカスタマイズできますが、リソース バンドルにカスタムの typeMismatch メッセージを設定します。

編集:上記の説明は明らかに十分に明確ではなかったため、詳細を追加します...

まず、モデル属性として機能する Bean または何かを作成します (ビューとコントローラーの間でやり取りするもの)。少なくとも 1 つの日付が含まれていることを確認してください。

public class SomeBean {
    private Date someDate;
    // ...additional properties, getters, setters...
    public Date getSomeDate() { return someDate; }
    public void setSomeDate(Date date) { somedate = date; }
}

次に、コントローラーが必要です。モデル属性のセッション属性を

@SessionAttribute.
@Controller
@RequestMapping("/somePath")
@SessionAttributes({"someFormBean"})
public class SomeController {
    /**
     * Handler method
     */
    @RequestMapping()
    public String defaultView(@ModelAttribute("someFormBean") SomeBean someFormBean, Model uiModel) {
        // Do something in your default view
        return "someDefaultView";   // Assuming you have a ViewResolver, like JspViewResolver or Tiles
    }

    /**
     * Submission Handler method
     */
    @RequestMapping(method = RequestMethod.POST
    public String submit(
        @ModelAttribute("someFormBean") SomeBean someFormBean, 
        BindingResult bindingResults,
        Model uiModel) {
        // bindingResults will have your errors from binding
        if(bindingResults.hasErrors()) {
            return "errorView";
        } else {
            return "successView";
        }
    }

    /**
     * Will be called to create your Model Attribute when its missing
     */
    @ModelAttribute("someFormBean")
    public SomeBean createSomeBean() {
        return new SomeBean();
    }

    /**
     * register property editors
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
        sdf.setLenient(true);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
        // You can register other Custom Editors with the WebDataBinder, like CustomNumberEditor for Integers and Longs, or StringTrimmerEditor for Strings
    }   
}

次に、いくつかのビューが必要です (コントローラーの上記の「someDefaultView」、私のコードはこの例では JSP で、Spring JSTL タグ ライブラリを使用しています)

<%@ taglib prefix="c"       uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"     uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn"      uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="form"    uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring"  uri="http://www.springframework.org/tags" %>
<html>
    <head>
        <script type="text/javascript" src="/resources/jquery/1.7.1/jquery-1.7.1.min.js"></script>
        <script type="text/javascript" src="resources/jquery.ui/1.8.13/jquery.ui.min.js"></script>

        <script type="text/javascript">
            $(document).ready(function() {
                $('.datepicker').datepicker();
            };
        </script>
    </head>
    <body>
        <form:form modelAttribute="someFormBean">
            <form:input cssClass="datepicker" path="someDate" readonly="true" /><br />
            <form:errors path="a"/><br /><br />
            <input type="submit" value="Submit" />
        </form:form>
    </body>
</html>

繰り返しになりますが、Spring Init Binders を Google で作成し、バインディング エラー (typeMismatch) をカスタマイズし、JSR 303 を検証用の追加オプションとして使用することをお勧めします。また、以下のエラーをフィールドに表示したくない場合は、ここで行ったように、すべてのエラーをページの上部に配置するなど、すべてのエラーを 1 か所で繰り返す方法があります。非常に構成可能で、おそらくさらに 20 ページを入力して、すべてを詳しく説明する価値があります。良い例やドキュメントを見つけるには、これで十分です。

于 2013-02-06T17:05:41.877 に答える