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へ渡す。
Model21は1〜20の範囲外なのでIllegalArgumentExceptionで通知する。計算結果は作らない。
ServletからJSPQuoteServletが例外を受け取り、案内文を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して、数値変換や計算などの後続処理を実行しないようにします。

元の記事に戻る

JavaのWebアプリで入力チェックはどこに書く?HTML・Servlet・Modelの役割分担