如何通过参数的jsp:通过C包括:设置? 什么是JSP变量的作用域?(How to pass p

2019-09-04 04:46发布

我有这样的的welcome.jsp

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

而这head.jsp:

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

但该变量为空白,输出仅仅是

Site Name -

我已经看了很多文章,我想不通的问题是什么。 如果我赞同${pgTitle}相同的welcome.jsp的其他地方,那么它输出的罚款。

我包括两个页面上的核心标签库。

Answer 1:

这是因为pgTitle变量在页面范围内设置。 检查它在这里 (抱歉,我不能得到这个官方文档)。

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

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

根据您的评论,在web开发中,变量的作用域重要,因为它定义了变量都可以使用(类似于声明为类字段和方法局部声明的变量的变量)。 有在JSP四个法域被称为方面:

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

更多信息:

  • 什么是JSP不同的范围?

这是完成什么,我试图做正确的方式?

如果有一个Servlet或其他控制器处理的请求设置的属性(例如@Controller从Spring MVC的或JSF托管bean),然后直接设置该属性存在,而不是在你的页面。

就个人而言,它需要一些时间来赚取经验和对Web应用程序使用时定义变量的最佳范围。 基本的例子:

  • 一的拆分String用逗号,以用于演示只会影响到当前视图,所以这可以在页面范围内进行设置。
  • 错误和成功的消息,最适合在要求范围之内。 如果用户更新页面,他/她可能不能看到相同的消息,除非该数据重新处理。
  • 用户信息如姓名,昵称和偏好可以在会话范围内进行设置。
  • 如果有,显示国家的名单(即不应该在几天内改变),你可以存储这个列表中的应用范围。


Answer 2:

一种方法是将变量传递给通过查询参数的包括:

<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>

然后,您可以访问这些PARAMS用${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/>


Answer 3:

你必须设置变量是(至少) request作用域。 你可以做ID如下:

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

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

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


文章来源: How to pass parameter to jsp:include via c:set? What are the scopes of the variables in JSP?
标签: java jsp jstl el