我正在开发一个基于JSP的组件化系统。这意味着可以通过拖放将JSP的一部分从一个JSP移动到另一个JSP,并导致需要将本地页面作用域作为在一个JSP中定义的组件的变量与另一个JSP中的碰撞。 我可以使用Servlet 3.0 / JSP 2.2 / JSTL 1.2。
++标记文件++
这样做的直接方法是为组件或类似的东西创建一个标记文件,因为它们具有此本地页面范围。但是对于标记文件中的每个更改,都需要重新部署,并且需要创建标记文件需要一些时间。但如果没有其他解决方案,那么这个方向(自定义标签,标签文件,JSP包括......)可能就是这样。
++命名空间前缀/后缀++
在Portlets中,应该将每个变量与从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>
<% } %>
将创建一个代码块,其中变量具有自己的命名空间。但当然对于JSTL和JSTL-EL而不是scriptlet代码。 我查看了JSTL规范,但没有找到是否有办法创建这样的本地页面范围。但我没有检查所有内容,因为它很大,我不确定是否可以使用自定义标签。
我很清楚,更大的代码块不应该在JSP中,但是对于框架我想为更小的组件提供简单的解决方案。
++更改JSP代码++
当组件最初放在JSP上或通过拖放移动时,我实际上将组件的JSP代码从一个JSP移动到另一个JSP或JSP中。这意味着我还可以以编程方式操作组件的JSP代码,如果它没有太复杂,它有助于解决问题。
答案 0 :(得分:0)
由于我认为自定义标记包装可能是理想的解决方案,因此我创建了另一个更具体的问题,并且我得到了解决问题的答案here。
只需在评估正文之前删除所有pageContext属性,然后在doEndTag()
再次添加它们。