如何将parameter passing给jsp:include通过c:set? JSP中variables​​的作用域是什么?

我在welcome.jsp上有这个

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

而这在head.jsp中:

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

但variables是空白的,输出只是

 Site Name - 

我读了很多文章,我不知道问题是什么。 如果我在同一个welcome.jsp中的其他地方回显${pgTitle} ,那么它输出很好。

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

这是因为pgTitlevariables是在页面范围内设置的。 在这里检查(对不起,我不能得到这个官方文档)。

如果你想使这个工作,你必须至less在请求范围内设置variables。 要在请求范围中设置variables,请使用<c:set>上的scope属性:

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

根据你的评论,在web开发中,variables的范围很重要,因为它定义了variables的使用位置(类似于在类中声明为variables的variables和在方法中声明的variables)。 JSP中有四个作为上下文的范围:

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

更多信息:

  • JSP中有什么不同的范围?

这是正确的方式来完成我想要做的?

如果有一个Servlet或另一个控制器处理要在请求中设置的属性(例如,来自Spring MVC或JSF受pipeBean的@Controller ),那么请将属性设置在那里,而不是直接在页面中设置。

就个人而言,在Web应用程序上使用时,需要一些时间才能获得经验并定义variables的最佳范围。 基本例子:

  • 为了演示目的,用逗号分割String只会影响到当前视图,所以可以在页面范围内设置。
  • 错误和成功的消息最适合请求范围。 如果用户更新页面,他/她可能不会看到相同的消息,除非数据被重新处理。
  • 作为名称,昵称和偏好的用户信息可以在会话范围中设置。
  • 如果您必须显示国家列表(不应在几天内更改),则可以将此列表存储在应用程序范围内。

一种方法是通过查询参数将variables传递给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/> 

您必须将variables设置为(至less) request范围。 你可以做如下ID:

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

然后,在head.jsp ,可以输出这样的variables:

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