Java 是否可以在JSP中创建本地页面范围?

Java 是否可以在JSP中创建本地页面范围?,java,jsp,servlets,jstl,el,Java,Jsp,Servlets,Jstl,El,我正在开发一个基于JSP的组件化系统。这意味着JSP的某些部分可以通过拖放从一个JSP移动到另一个JSP,从而需要一个本地页面范围作为一个JSP中定义的组件的变量,并在另一个JSP中发生冲突。 我可以使用Servlet3.0/JSP2.2/JSTL1.2 +++标记文件+++ 这样做的直接方法是为组件或类似组件创建一个标记文件,因为它们有这个本地页面范围。但是对于标记文件中的每一个更改,它都需要重新部署,并且需要创建标记文件本身需要一些时间。但是,如果没有其他解决方案,这个方向(自定义标记、标记

我正在开发一个基于JSP的组件化系统。这意味着JSP的某些部分可以通过拖放从一个JSP移动到另一个JSP,从而需要一个本地页面范围作为一个JSP中定义的组件的变量,并在另一个JSP中发生冲突。 我可以使用Servlet3.0/JSP2.2/JSTL1.2

+++标记文件+++

这样做的直接方法是为组件或类似组件创建一个标记文件,因为它们有这个本地页面范围。但是对于标记文件中的每一个更改,它都需要重新部署,并且需要创建标记文件本身需要一些时间。但是,如果没有其他解决方案,这个方向(自定义标记、标记文件、JSP包含等)可能就是方向

++名称空间前缀/后缀+++

在portlet中,应该将每个变量与portlet响应对象提供的名称空间连接起来。我可以做类似的事情,但这可能会导致副作用和意外行为。如果有人忘记为名称空间添加前缀/后缀,则该名称空间可能会工作一段时间,但在组件移动到具有冲突变量名的其他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>
<% } %>

将变量置于标记文件的本地页面上下文中。但是,它们位于周围页面的上下文中。我在找这样的东西

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

处再次添加它们,因为我认为自定义标记包装可能是理想的解决方案。我创建了另一个更具体的问题,我得到了解决问题的答案


只需在计算主体之前删除所有pageContext属性,然后在
doEndTag()

再次添加它们,我在标记文件中尝试了这一点:
${bodyContent}
但是周围页面中声明的表达式仍然会被替换。
JSP
将是本案例研究中最糟糕的解决方案。但是我认为让所有的编码内容放在后面是可能的,就像一个简单的NDII在标记文件中尝试了这样:
${bodyContent}
但是在周围页面中声明的表达式仍然被替换。
JSP
将是本案例研究中最糟糕的解决方案。但我认为,让所有的编码内容都放在后面,这是可能的,就像一个简单的NDI