如何将参数传递给jsp:include通过c:set? JSP中变量​​的范围是什么?

时间:2013-05-17 22:57:59

标签: java jsp jstl el

我在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},那么它输出正常。

我在两个页面都包含核心标记库。

4 个答案:

答案 0 :(得分:34)

这是因为在页面范围中设置了pgTitle变量。检查here(抱歉,我无法获得此官方文档)。

如果要使其工作,则必须至少在请求范围内设置变量。要在请求范围中设置变量,请使用scope上的<c:set>属性:

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

根据您的评论,在Web开发中,变量的范围很重要,因为它定义了变量的使用位置(类似于在类中声明为字段的变量和在方法中本地声明的变量)。 JSP中有四个范围称为上下文:

  • 页面范围(由PageContext处理)。只有在当前页面中设置为属性时才能到达变量。这意味着,只有当前页面可以访问这些属性,包含的页面是不同的页面,因此它们无法访问这些属性。
  • 请求范围(由ServletRequest处理)。只有在当前请求中设置为属性时才能达到变量。这意味着,在同一请求中处理的每个页面都可以访问这些属性。 重要提示:重定向意味着新的请求/响应流程。这意味着,如果您在请求上设置属性并执行重定向,则这些属性将不会在新请求中设置为属性。
  • 会话范围(由HttpSession处理)。如果在当前用户会话中设置为属性,则只能到达变量。这意味着,在同一用户会话中使用的每个页面都可以使用这些属性,直到它们被删除或会话到期为止。
  • 申请范围(由ServletContext处理)。如果在当前上下文中设置为属性,则只能达到变量。这意味着,每个会话属性上的每个页面都可以访问这些变量,直到从SessionContext中删除它们或取消部署Web应用程序。

更多信息:

  

这是完成我想要做的事情的正确方法吗?

如果有一个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>