是否可以在 JSP 中创建本地页面范围?
Is it possible to create a local page scope in a JSP?
我正在开发基于 JSPs 的组件化系统。这意味着 JSP 的部分可以通过拖放从一个 JSP 移动到另一个 JSP 并导致需要本地页面范围作为一个 JSP 中定义的组件的变量=] 我撞到另一个 JSP。
我可以使用 Servlet 3.0 / JSP 2.2 / JSTL 1.2.
++ 标签文件 ++
这样做的直接方法是为组件或类似的东西创建一个标记文件,因为它们具有此本地页面范围。但是对于标记文件中的每个更改,它都需要重新部署,并且需要创建一个标记文件本身需要一些时间。但如果没有其他解决方案,这个方向(自定义标签、标签文件、JSP 包括,...)可能是可行的方法。
++ 命名空间 prefixing/suffixing ++
在 Portlet 中,应该将每个变量与 Portlet 响应对象提供的命名空间连接起来。我可以做类似的事情,但这可能会导致副作用和意外行为。如果有人忘记 prefix/suffix 命名空间,它可能会工作一段时间,但在另一个时间停止工作,当组件移动到另一个具有冲突变量名称的 JSP 时不更改代码。
++ 自定义标签包装 ++
本来希望自己作为一个组件框架开发者,能把组件开发者的组件代码用一个组件标签的标签文件包装成这样
<a:component>
<div data-component-id="9">
<c:set var="componentId" value="9"/>
<c:set var="path" value='${abc:getCurrentPath()}_${componentId}'/>
<c:set var="resource" value='${abc:getResourceFromPath(path)}'/>
<c:set var="val" value="${resource.getValue('paragraphValue')"/>
<p><c:out value="${value}"/></p>
</div>
</a:component>
在标记文件的本地页面上下文中包含变量。但相反,它们位于周围页面的上下文中。我正在寻找这样的东西
<% { %>
<div data-component-id="9">
<%
String componentId = 9;
String path = obj.getCurrentPath()+componentId;
Resource resource = otherObj.getResourceFromPath(path);
String value = resource.getValue("paragraphValue");
%>
<p><c:out value="<%=value%>"/></p>
</div>
<% } %>
这将创建一个代码块,其中变量有自己的命名空间。但是当然对于 JSTL 和 JSTL-EL 而不是 scriptlet 代码。
我查看了 JSTL 规范,但没有发现是否有办法创建这样的本地页面范围。但我没有检查所有内容,因为它很大,我不确定自定义标签是否可行。
我很清楚,较大的代码块不应该在 JSP 中,但对于框架,我想为较小的组件提供简单的解决方案。
++ 更改 JSP 代码 ++
当组件最初放置在 JSP 上或通过拖放移动时,我实际上将组件的 JSP 代码从一个 JSP 移动到另一个 JSP 或在其中移动一个JSP。这意味着我还可以以编程方式操作组件的 JSP 代码,如果它不会变得太复杂并且有助于解决问题。
因为我认为自定义标签包装可能是理想的解决方案,所以我创建了另一个更具体的问题,我得到了解决问题的答案 。
只是在评估正文之前删除所有 pageContext 属性,然后在 doEndTag()
处再次添加它们。
我正在开发基于 JSPs 的组件化系统。这意味着 JSP 的部分可以通过拖放从一个 JSP 移动到另一个 JSP 并导致需要本地页面范围作为一个 JSP 中定义的组件的变量=] 我撞到另一个 JSP。 我可以使用 Servlet 3.0 / JSP 2.2 / JSTL 1.2.
++ 标签文件 ++
这样做的直接方法是为组件或类似的东西创建一个标记文件,因为它们具有此本地页面范围。但是对于标记文件中的每个更改,它都需要重新部署,并且需要创建一个标记文件本身需要一些时间。但如果没有其他解决方案,这个方向(自定义标签、标签文件、JSP 包括,...)可能是可行的方法。
++ 命名空间 prefixing/suffixing ++
在 Portlet 中,应该将每个变量与 Portlet 响应对象提供的命名空间连接起来。我可以做类似的事情,但这可能会导致副作用和意外行为。如果有人忘记 prefix/suffix 命名空间,它可能会工作一段时间,但在另一个时间停止工作,当组件移动到另一个具有冲突变量名称的 JSP 时不更改代码。
++ 自定义标签包装 ++
本来希望自己作为一个组件框架开发者,能把组件开发者的组件代码用一个组件标签的标签文件包装成这样
<a:component>
<div data-component-id="9">
<c:set var="componentId" value="9"/>
<c:set var="path" value='${abc:getCurrentPath()}_${componentId}'/>
<c:set var="resource" value='${abc:getResourceFromPath(path)}'/>
<c:set var="val" value="${resource.getValue('paragraphValue')"/>
<p><c:out value="${value}"/></p>
</div>
</a:component>
在标记文件的本地页面上下文中包含变量。但相反,它们位于周围页面的上下文中。我正在寻找这样的东西
<% { %>
<div data-component-id="9">
<%
String componentId = 9;
String path = obj.getCurrentPath()+componentId;
Resource resource = otherObj.getResourceFromPath(path);
String value = resource.getValue("paragraphValue");
%>
<p><c:out value="<%=value%>"/></p>
</div>
<% } %>
这将创建一个代码块,其中变量有自己的命名空间。但是当然对于 JSTL 和 JSTL-EL 而不是 scriptlet 代码。 我查看了 JSTL 规范,但没有发现是否有办法创建这样的本地页面范围。但我没有检查所有内容,因为它很大,我不确定自定义标签是否可行。
我很清楚,较大的代码块不应该在 JSP 中,但对于框架,我想为较小的组件提供简单的解决方案。
++ 更改 JSP 代码 ++
当组件最初放置在 JSP 上或通过拖放移动时,我实际上将组件的 JSP 代码从一个 JSP 移动到另一个 JSP 或在其中移动一个JSP。这意味着我还可以以编程方式操作组件的 JSP 代码,如果它不会变得太复杂并且有助于解决问题。
因为我认为自定义标签包装可能是理想的解决方案,所以我创建了另一个更具体的问题,我得到了解决问题的答案
只是在评估正文之前删除所有 pageContext 属性,然后在 doEndTag()
处再次添加它们。