web-dev-qa-db-ja.com

JSPでpageContextが必要なのはなぜですか?

JSPのすべての暗黙的な変数にアクセスできるのに、なぜpageContextがあるのですか?

私の仮定は次のとおりです。EL式またはJSTLを使用する場合、必要な属性にアクセスまたは設定するにはpageContextです。私が正しいかどうか教えてください。

25
Dead Programmer

non-implicit変数にアクセスするために必要です。今では意味がありますか?


UpdateHttpServletRequest および HttpSession のゲッターメソッドに直接アクセスしたい場合があります。標準のJSPでは、どちらも${pageContext}でのみ使用できます。以下に、実際の使用例をいくつか示します。


セッションがタイムアウトしたときにページを更新する:

<meta http-equiv="refresh" content="${pageContext.session.maxInactiveInterval}">

セッションIDをアプレットに渡す(同じセッションでサーブレットと通信できるようにするため):

<param name="jsessionid" value="${pageContext.session.id}">

セッションの最初のリクエスト時にのみメッセージを表示する:

<c:if test="${pageContext.session['new']}">Welcome!</c:if>

ELの予約済みキーワードであるため、newには特別な扱いがあることに注意してください。少なくともEL 2.2以降です。


ユーザーIPの表示:

あなたのIPは$ {pageContext.request.remoteAddr}です。

現在のコンテキストパスをハードコーディングせずにリンクをドメイン相対にする:

<a href="${pageContext.request.contextPath}/login">login</a>

<base>タグを動的に定義する( JSTL functions taglibを少し使用して):

<base href="${fn:replace(pageContext.request.requestURL, pageContext.request.requestURI, pageContext.request.contextPath)}/">

等。上記のHttpServletRequestおよびHttpSession javadocを覗いて、これらのすべてのゲッターメソッドについて学習してください。それらの一部は、JSP/ELでも役立つ場合があります。

32
BalusC

@BalusCの優れた答えに追加するために、取得するPageContextは、仕様に表示されるものに限定されない場合があります。

たとえば、 Lucee は、インターフェースと抽象クラスに多くの機能を追加するJSPサーブレットです。 PageContextへの参照を取得することで、他の方法では利用できない多くの情報にアクセスできます。

0
isapir