JavaのWebアプリで入力チェックはどこに書く?HTML・Servlet・Modelの役割分担|確認問題の回答例
JavaのWebアプリで入力チェックはどこに書く?HTML・Servlet・Modelの役割分担の確認問題の回答例です。HTML・Servlet・Model・JSPのどこが何を担当するかを確認します。
問題1:HTMLを通らない送信にも備える
HTMLのrequiredやpatternは、通常のブラウザ操作で入力ミスに気付くためのものです。HTMLを書き換えたり、HTTPクライアントから直接送信したりすると、ブラウザのチェックを通らない値が届きます。Servletでも受け取った文字列を確認します。
curl -i --data-urlencode 'quantity=abc' \
http://localhost:8080/lesson06/quote
この例では400と「数量は半角数字で入力してください。」を期待します。入力欄は空欄で、計算結果は表示しません。ブラウザがabcを送信前に止めた、という結果だけではサーバー側のチェックは検証できません。
問題2:整数にできても、業務ルールでは範囲外
| 担当 | 数量21の扱い |
|---|---|
| HTML | 空ではなく半角数字なので、この記事のrequired・patternを通過する。 |
| Servlet | 文字列”21″をintの21へ変換し、Modelへ渡す。 |
| Model | 21は1〜20の範囲外なのでIllegalArgumentExceptionで通知する。計算結果は作らない。 |
| ServletからJSP | QuoteServletが例外を受け取り、案内文をerror属性に入れて入力JSPへforwardする。 |
Modelが直接JSPへ戻すわけではありません。画面へ進めるのはServlet、案内文と入力欄をHTMLにするのはJSPです。「数量は1〜20で指定してください。」が表示され、空の入力欄に数量を入力し直します。
問題3:リダイレクト先は新しいリクエスト
sendRedirectでは、ブラウザが移動先へ新しいリクエストを送ります。元のリクエストに設定したerror属性は、自動では引き継がれません。今回の構成なら、属性を設定した同じリクエストでforwardします。
request.setAttribute("error", message);
request.getRequestDispatcher("/quote-form.jsp")
.forward(request, response);
上の処理はshowErrorの中の抜粋で、HTTPステータスの設定は本文のコードにあります。showErrorを呼んだdoPost側ではreturnも行います。
問題4:変換できない入力で後続処理を進めない
abcは整数に変換できず、intを受け取るModelへ渡せません。Servletの形式確認で止め、決めておいた案内文を表示します。
showError内のforwardが終わると、呼び出し元のdoPostへ制御が戻ります。そこでreturnして、数値変換や計算などの後続処理を実行しないようにします。