JavaのWebアプリで値が渡らないのはなぜ?Servlet・Model・JSPの確認方法|確認問題の回答例

JavaのWebアプリで値が渡らないのはなぜ?Servlet・Model・JSPの確認方法の確認問題の回答例です。入力・観察した値・修正箇所を対応させて確認してください。

問題1:送信した項目名で取得する

フォームはquantityで送っているため、Servletを次のように直します。

String text = request.getParameter("quantity");

フォームの送信項目の名前はnameで指定するため、quantityに合わせます。idはHTML内の要素を識別するための指定で、getParameterが探すパラメータ名ではありません。quantity=5を受け取る場合、修正後のtextは文字列”5″になります。

問題2:Javaの変数名が違っても、属性名が合えば取り出せる

QuoteResult displayResult = (QuoteResult) request.getAttribute("quote");

取得できます。同じリクエストのquote属性にオブジェクトが保存されており、JSPもquoteという名前で探しているからです。ServletのresultとJSPのdisplayResultは、それぞれのコードで使う変数名です。変数名が同じであることは、受け渡しの条件ではありません。

JSPでdisplayResultという変数を使うなら、表示もdisplayResult.getTotal()とします。属性名quoteをdisplayResultに変更する必要はありません。

問題3:属性名を変更するときは、保存側と取得側を揃える

QuoteResult result = (QuoteResult) request.getAttribute("quote");

“quote”はリクエストに保存した属性の名前、resultはJavaの変数名です。setAttributeの第1引数とgetAttributeの引数を一致させます。変数をresultと名付けても、”result”という属性が作られるわけではありません。

修正後はJSPのresultがnullではなくなり、getTotal()が2800を返すことを確認します。今回は同じリクエストでforwardしている条件なので、リダイレクトや新しいリクエストが原因ではありません。

属性名をorderQuoteへ変更するなら、Servletは次のようにします。

request.setAttribute("orderQuote", result);

JSPの取得側も変更します。Javaの変数名resultは、そのままでも構いません。

QuoteResult result = (QuoteResult) request.getAttribute("orderQuote");

問題4:正しいデータを、正しい欄へ表示する

<p>合計: <%= result.getTotal() %>円</p>

直すのはJSPの合計欄です。JSPまで届いたDTOの合計が2800と確認できているため、今回の原因はModelの計算ではなく、小計のgetterを表示していることです。修正後、数量5で小計2500円・送料300円・合計2800円が表示されることを確認します。

元の記事に戻る

JavaのWebアプリで値が渡らないのはなぜ?Servlet・Model・JSPの確認方法