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の計算も自動で動く、という仕組みではありません。

元の記事に戻る

JavaのServletからJSPへ値を渡すには?setAttributeとgetAttributeの使い方