我在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}
,那么它输出正常。
我在两个页面都包含核心标记库。
答案 0 :(得分:34)
这是因为在页面范围中设置了pgTitle
变量。检查here(抱歉,我无法获得此官方文档)。
如果要使其工作,则必须至少在请求范围内设置变量。要在请求范围中设置变量,请使用scope
上的<c:set>
属性:
<c:set var="pgTitle" value="Welcome" scope="request" />
根据您的评论,在Web开发中,变量的范围很重要,因为它定义了变量的使用位置(类似于在类中声明为字段的变量和在方法中本地声明的变量)。 JSP中有四个范围称为上下文:
更多信息:
这是完成我想要做的事情的正确方法吗?
如果有一个Servlet或其他控制器处理要在请求中设置的属性(例如来自Spring MVC或JSF托管bean的@Controller
),那么在那里设置属性而不是直接在页面中。
就个人而言,在Web应用程序上使用时,需要一些时间来获得经验并定义变量的最佳范围。基本示例:
String
只会影响当前视图,因此可以在页面范围内进行设置。答案 1 :(得分:4)
一种方法是通过查询参数将变量传递给include:
<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/>
答案 2 :(得分:2)
您必须将变量设置为(至少)request
作用域。您可以按如下方式执行id:
<c:set var="pgTitle" value="Welcome" scope="request"/>
<jsp:include page="/jsp/inc/head.jsp" />
然后,在head.jsp
中,您可以输出如下变量:
<c:out value="${requestScope.pgTitle}" />
答案 3 :(得分:0)
您可以结合使用<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>