2

JSP コードは次のとおりです。

<jsp:useBean id="person" class="org.example.model.PersonModel" scope="session">
</jsp:useBean>
<br> Name : <jsp:getProperty property="name" name="person"/>
<br> Surname : <jsp:getProperty property="surname" name="person"/>

私はこのサーブレットにリクエストを転送しているコントローラーサーブレットrequestのスコープではなくスコープにJavaオブジェクトを設定しましたが。タグに記載されているスコープはセッションですが、リクエスト属性を取得するにはsessionどうすればよいですか? <jsp:useBean>属性を取得するために使用する場合、そのタグpageContext.findAttribute()にスコープ属性を含めることの用途は何ですか?<jsp:useBean>

4

1 に答える 1

11

は、特定の属性キーに対して最初の非属性値が見つかるPageContext#findAttribute()まで、ページ、リクエスト、セッション、およびアプリケーション スコープをそれぞれスキャンします。javadocnullも参照してください。

ページ、リクエスト、セッション (有効な場合)、およびアプリケーション スコープで指定された属性を順番に検索し、関連付けられた値または null を返します。

これが、JSP で宣言されたセッション スコープのリクエストではなく、転送サーブレットのセット スコープのリクエストを検出する理由を説明しています。これは、EL wiki ページでも説明されています。

いずれにせよ、サーブレットを使用している場合は、<jsp:useBean>サーブレットによって管理されるはずのモデル オブジェクトを使用しないでください。<jsp:useBean>つまり、実際にサーブレットをコントローラーとして使用するときに混乱とメンテナンスの問題を引き起こすだけの異なる MVC レベルが続きます。これは、サーブレット wiki ページの「コーディング スタイルと推奨事項」セクションでも明示的に言及されています。

したがって、これらすべての代わりに、次の<jsp:xxx>ことができます。

<br>Name: ${person.name}
<br>Surname: ${person.surname}

ユーザー制御データの再表示中に潜在的な XSS 攻撃の穴を防ぐために、JSTL を追加するだけで済みます (それは行わないことに<c:out>注意してください!)。<jsp:getProperty>

<br>Name: <c:out value="${person.name}" />
<br>Surname: <c:out value="${person.surname}" />

JSTL の詳細については、JSTL wiki ページ を参照してください

于 2013-01-29T16:57:04.453 に答える