web-dev-qa-db-ja.com

c:set経由でjsp:includeにパラメータを渡す方法は? JSPの変数のスコープは何ですか?

これはwelcome.jspにあります

<c:set var="pgTitle" value="Welcome"/>
<jsp:include page="/jsp/inc/head.jsp" />

そしてこれはhead.jspで:

<title>Site Name - ${pgTitle}</title>

しかし、変数は空白であり、出力は単に

Site Name -

私は多くの記事を読みましたが、問題が何なのかわかりません。同じwelcome.jsp内のどこかに${pgTitle}をエコーすると、正常に出力されます。

両方のページにコアタグライブラリを含めています。

26
vcardillo

これは、pgTitle変数がページスコープで設定されているためです。それを確認してください こちら (申し訳ありませんが、これに関する公式のドキュメントは入手できません)。

これを機能させるには、少なくともリクエストスコープで変数を設定する必要があります。リクエストスコープで変数を設定するには、<c:set>scope属性を使用します。

<c:set var="pgTitle" value="Welcome" scope="request" />

あなたのコメントによると、Web開発では、変数の使用範囲を定義するため、変数のスコープが重要になります(クラスのフィールドとして宣言された変数およびメソッドでローカルに宣言された変数と同様)。 JSPには、コンテキストと呼ばれる4つのスコープがあります。

  • ページスコープ( PageContext で処理)。現在のページで属性として設定されている場合のみ、変数に到達できます。つまり、現在のページのみがこれらの属性にアクセスでき、含まれるページは異なるページであるため、これらの属性にアクセスできません。
  • 要求スコープ( ServletRequest によって処理されます)。変数は、現在の要求で属性として設定されている場合にのみ到達できます。つまり、同じリクエストで処理されるすべてのページがこれらの属性にアクセスできます。 重要な注意:リダイレクトは、新しい要求/応答プロセスを意味します。つまり、リクエストに属性を設定してリダイレクトを実行すると、これらの属性は新しいリクエストの属性として設定されません。
  • セッションスコープ( HttpSession で処理)。現在のユーザーセッションで属性として設定されている場合のみ、変数に到達できます。つまり、同じユーザーセッションで使用されるすべてのページは、削除されるかセッションが期限切れになるまでこれらの属性を使用できます。
  • アプリケーションスコープ( ServletContext で処理)。変数は、現在のコンテキストで属性として設定されている場合にのみ到達できます。つまり、すべてのセッション属性のすべてのページは、SessionContextから削除されるか、Webアプリケーションがアンデプロイされるまで、これらの変数にアクセスできます。

より詳しい情報:

これは私がやろうとしていることを達成する正しい方法ですか?

リクエストで設定される属性(たとえば、Spring MVCまたはJSFマネージドBeanからの@Controller)を処理するサーブレットまたは別のコントローラーがある場合は、ページではなく、そこに属性を設定します。

個人的には、Webアプリケーションで使用する場合、経験を積んで変数の最適な範囲を定義するのに時間がかかります。基本的な例:

  • プレゼンテーションの目的でStringをコンマで分割すると、現在のビューにのみ影響するため、ページスコープで設定できます。
  • エラーおよび成功したメッセージは、リクエストの範囲に最適です。ユーザーがページを更新する場合、データが再処理されない限り、おそらく同じメッセージを表示してはいけません。
  • 名前、ニックネーム、設定などのユーザー情報は、セッションスコープで設定できます。
  • 国のリストを表示する必要がある場合(数日で変更されることはありません)、このリストをアプリケーションスコープに保存できます。
35
Luiggi Mendoza

1つの方法は、クエリパラメータを介して変数をインクルードに渡すことです。

<jsp:include page="/WEB-INF/views/partial.jsp?foo=${bar}" />

<jsp:include page="/WEB-INF/views/partial.jsp">
    <jsp:param name="foo" value="${bar}" />
    <jsp:param name="foo2" value="${bar2}" />
</jsp:include>

その後、${param.foo}でこれらのパラメーターにアクセスできます

別の方法は、カスタムタグを使用することです。

/ WEB-INF/tags/head.tag

<%@ attribute name="title" %>

<head>
    <title>${title}</title>
</head>

somePage.jsp

<%@ taglib prefix="layout" tagdir="/WEB-INF/tags" %>

<html>
   <layout:head title="myRadTitle" />
   <body></body>
<html/>
4
Allan Hortle

変数を(少なくとも)requestスコープに設定する必要があります。次のようにidを実行できます。

<c:set var="pgTitle" value="Welcome" scope="request"/>
<jsp:include page="/jsp/inc/head.jsp" />

そして、head.jsp、次のように変数を出力できます。

<c:out value="${requestScope.pgTitle}" />
2

これは、<c:import><c:param>の組み合わせを使用して実現できます。

somePage.jsp

<c:import url="header.jsp" >
    <c:param name="pageTitle" value="Whatever the title of the page is"/>
</c:import>

header.jsp

<html>
    <head>
        <title>
            <c:out value="${param.pageTitle}" default="Default is optional" /> 
        </title>
    </head>
</html>
0
German B.