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

vca*_*llo 27 java jsp jstl el

我在welcome.jsp上有这个

<c:set var="pgTitle" value="Welcome"/>
<jsp:include page="/jsp/inc/head.jsp" />
Run Code Online (Sandbox Code Playgroud)

这在head.jsp中:

<title>Site Name - ${pgTitle}</title>
Run Code Online (Sandbox Code Playgroud)

但变量是空白的,输出仅仅是

Site Name -
Run Code Online (Sandbox Code Playgroud)

我看过很多文章,我无法弄清问题是什么.如果我${pgTitle}在同一个welcome.jsp中的其他地方回显,那么它输出正常.

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

Lui*_*oza 35

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

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

<c:set var="pgTitle" value="Welcome" scope="request" />
Run Code Online (Sandbox Code Playgroud)

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

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

更多信息:

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

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

就个人而言,在Web应用程序上使用时,需要一些时间来获得经验并定义变量的最佳范围.基本示例:

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