如何将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}
,那么它输出很好。
我在两个页面上都包含核心标记库。
这是因为pgTitle
variables是在页面范围内设置的。 在这里检查(对不起,我不能得到这个官方文档)。
如果你想使这个工作,你必须至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}" />