JavaのServletからJSPへ値を渡すには?setAttributeとgetAttributeの使い方|確認問題の回答例
JavaのServletからJSPへ値を渡すには?setAttributeとgetAttributeの使い方の確認問題の回答例です。保存名と変数名、パラメータと属性、同じリクエストかどうかに注目して見直してください。
問題1:保存名を揃えて、別の変数名で受け取る
Servlet側のコードです。
int discountAmount = 500;
request.setAttribute("discount", discountAmount);
JSP側では、次のように取り出します。
<%
Integer result =
(Integer) request.getAttribute("discount");
%>
共通にするのは保存名の "discount" です。ServletのdiscountAmountとJSPのresultは別の変数なので、同じ名前でなくても構いません。値がない場合も考え、表示前にresultがnullでないことを確認します。
問題2:同じ名前でも、パラメータと属性は別
| 呼び出し | 値 | 型 |
|---|---|---|
getParameter("amount") | "12000" | String |
getAttribute("amount") | 12000 | メソッドの戻り値の宣言はObject。保存されている値はInteger。 |
setAttributeはパラメータを変更するメソッドではありません。フォームから届いた文字列と、Servletが保存した整数は別々に扱います。intの12000は、属性へ保存する際にIntegerへ自動変換されます。
問題3:getAttributeの名前を修正する
Integer discount =
(Integer) request.getAttribute("discount");
保存名はdiscountなのに、取得側がdiscountAmountを探しているため、修正前はnullになります。Servlet側を変えずに直すなら、getAttributeの第1引数を "discount" に揃えます。本文のJSPなら必要な値が揃わないため案内文が表示されます。
問題4:JSPを直接開いたリクエストには値がない
「入力画面から割引額を確認してください。」と表示されます。新しいタブでの直接アクセスでは、DiscountServletのdoPostが実行されず、amount・discount・errorの属性も保存されていません。本文のJSPでは、最後のelseに進みます。
前回のrequestに保存した値は、新しいリクエストへ自動では引き継がれません。入力画面から送信し、Servletが属性を保存したあとforwardする流れで表示します。JSPを直接開けばServletの計算も自動で動く、という仕組みではありません。