これは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}
をエコーすると、正常に出力されます。
両方のページにコアタグライブラリを含めています。
これは、pgTitle
変数がページスコープで設定されているためです。それを確認してください こちら (申し訳ありませんが、これに関する公式のドキュメントは入手できません)。
これを機能させるには、少なくともリクエストスコープで変数を設定する必要があります。リクエストスコープで変数を設定するには、<c:set>
でscope
属性を使用します。
<c:set var="pgTitle" value="Welcome" scope="request" />
あなたのコメントによると、Web開発では、変数の使用範囲を定義するため、変数のスコープが重要になります(クラスのフィールドとして宣言された変数およびメソッドでローカルに宣言された変数と同様)。 JSPには、コンテキストと呼ばれる4つのスコープがあります。
より詳しい情報:
これは私がやろうとしていることを達成する正しい方法ですか?
リクエストで設定される属性(たとえば、Spring MVCまたはJSFマネージドBeanからの@Controller
)を処理するサーブレットまたは別のコントローラーがある場合は、ページではなく、そこに属性を設定します。
個人的には、Webアプリケーションで使用する場合、経験を積んで変数の最適な範囲を定義するのに時間がかかります。基本的な例:
String
をコンマで分割すると、現在のビューにのみ影響するため、ページスコープで設定できます。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/>
変数を(少なくとも)request
スコープに設定する必要があります。次のようにidを実行できます。
<c:set var="pgTitle" value="Welcome" scope="request"/>
<jsp:include page="/jsp/inc/head.jsp" />
そして、head.jsp
、次のように変数を出力できます。
<c:out value="${requestScope.pgTitle}" />
これは、<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>