Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用pagecontext.include将页面作用域属性传递给JSP以在JSTL中使用?_Java_Jsp_Legacy - Fatal编程技术网

Java 使用pagecontext.include将页面作用域属性传递给JSP以在JSTL中使用?

Java 使用pagecontext.include将页面作用域属性传递给JSP以在JSTL中使用?,java,jsp,legacy,Java,Jsp,Legacy,我们几乎一字不差地使用此JSP模板解决方案: 当它获取要包含的JSP页面时,它使用pageContext.include,这给我们留下了一个问题,那就是我们有很多scriplet代码,这些代码在JSP本身中初始化(标记soup)。我的想法是使用一个附加属性修改模板标记,该属性是对具有init或execute方法的类的包路径引用。该execute将首先被调用,并在包含JSP之前添加页面上下文属性。然后我们将使用JSTL访问这些属性。但是,有人告诉我这不起作用,因为pageContext.incl

我们几乎一字不差地使用此JSP模板解决方案:


当它获取要包含的JSP页面时,它使用pageContext.include,这给我们留下了一个问题,那就是我们有很多scriplet代码,这些代码在JSP本身中初始化(标记soup)。我的想法是使用一个附加属性修改模板标记,该属性是对具有init或execute方法的类的包路径引用。该execute将首先被调用,并在包含JSP之前添加页面上下文属性。然后我们将使用JSTL访问这些属性。但是,有人告诉我这不起作用,因为pageContext.include是如何工作的,并且无法传递作用于页面的属性。这是真的吗?有解决办法吗?我非常了解我的所有范围规则。

您可以向请求传递一个作用域为的属性:

<c:set var="myAttribute" value="myValue" scope="request" />


然后在包含的页面上:

<c:out value="${myAttribute}" />

正确,问题在于页面上下文实际上就是页面上下文。当您运行include时,该资源(假设它是一个JSP)会获取它自己的PageContext,并且在返回时会丢失它

JSP有4个作用域:应用程序、会话、请求和页面。每一个都有自己的生命周期,这应该是不言自明的

在这里使用请求范围是正确的想法

如果查看链接到的模板代码,这正是插入标记所做的。在本例中,它将哈希表放在请求中维护的堆栈上

然后,它使用“put”和“get”标记在当前“堆栈”上放置/获取项目

您可以做的一件简单的事情是在PageContext.include之前,根据需要调用“execute”方法。让该方法只返回名称/值对的映射。然后,您可以获取该映射并填充堆栈上的现有(或即将存在)哈希表

基本上,您的Init类是类似于调用许多“put”标记的逻辑

除此之外,模板标记的工作原理相同


或者可以将结果直接合并到请求中,供JSTL使用。或者,您可以保留“堆栈”性质,将自己的“上下文”推送到请求中。

请您解释一下如何传递页面上下文属性集,而不为每个属性调用“put”?
<c:out value="${myAttribute}" />