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円が表示されることを確認します。