web-dev-qa-db-ja.com

JSPページでrequest.setAttributeを使用する

JSPページでrequest.setAttributeを使用し、HTML送信でServletで同じリクエスト属性を取得することは可能ですか?

21
ria

いいえ。残念ながら、リクエストオブジェクトはページの読み込みが完了するまでしか使用できません。いったん完了すると、どこかに保存されていない限り、すべての値が失われます。

リクエストを通じて属性を保持する場合は、次のいずれかを行う必要があります。

  1. <input type="hidden" name="myhiddenvalue" value="<%= request.getParameter("value") %>" />など、フォームに非表示の入力があります。これは、リクエストパラメータとしてサーブレットで使用可能になります。
  2. セッションに配置します(request.getSession()を参照-JSPでは、これは単にsessionとして利用可能です)

管理しやすいため、セッションの使用をお勧めします。

24
user7094

Phil Sacreの回答は正しかったが、セッションは地獄のためだけに使うべきではない。これは、ユーザーのログインなど、セッションの存続期間中実際に必要な値に対してのみ使用する必要があります。特にコレクションを扱うとき、またはユーザーが以前にアクセスしたページに戻って、前回のアクセスからの値が残っていることを見つけるときに、セッションを使い過ぎて問題が発生することがよくあります。スマートプログラムは変数のスコープを可能な限り最小化し、悪いプログラムはセッションを使いすぎます。

4
user31475

リクエストを持続させたい場合は、これを試してください:

例:JSPまたはサーブレットページ

request.getSession().setAttribute("SUBFAMILY", subFam);

受信ページで次の行を使用してセッションとデータを取得します。

SubFamily subFam = (SubFamily)request.getSession().getAttribute("SUBFAMILY");
4
connect2krish

ただし、pageContext属性を使用して実行できます。

JSPで:

<form action="Enter.do">
    <button type="SUBMIT" id="btnSubmit" name="btnSubmit">SUBMIT</button>
</form>
<% String s="opportunity";
pageContext.setAttribute("opp", s, PageContext.APPLICATION_SCOPE); %>

サーブレット内(「Enter.do」URLパターンにリンク):

String s=(String) request.getServletContext().getAttribute("opp");

SESSION_SCOPEのようなAPPLICATION_SCOPE以外のスコープがあります。 APPLICATION_SCOPEは、ServletContext属性に使用されます。

4
Prasad

試してみる

request.getSession().setAttribute("SUBFAMILY", subFam);
request.getSession().getAttribute("SUBFAMILY");
2
Lino

間違っている場合は修正してください...リクエストは連続したページ間で持続すると思います。

ページ1->ページ2->ページ3から移動すると考えてください。

ページ1のsetAttributeを使用してリクエストオブジェクトに値を設定し、getAttributeを使用してページ2で取得した後、ページ3で取得するために同じリクエストオブジェクトで何かを再度設定しようとすると、null値を「 JSPを作成したリクエストと、JSPが送信されたときに生成されるリクエストは完全に異なるリクエストであり、最初の属性は2番目の属性では使用できません。

2ページのこのようなことが失敗することを意味します:

同じことがページ1の場合に機能した場合:

ですから、Phillが提案した2つのオプションのいずれかを進める必要があると思います。

1
ria

phil is right requestオプションはページがロードされるまで利用可能だと思います。別のページに値を送信する場合は、別のページでのみ値が必要であり、それ以下の値が必要な場合は、非表示タグまたはセッション内に設定しますその時点で複数のページにセッションが隠されたタグよりも優れたオプションです。

0
user189062