我正在基于JSP的组件化系统上工作。这意味着JSP的各个部分可以通过拖放从一个JSP移到另一个JSP,并导致需要本地页面范围作为一个JSP中定义的组件的变量,而与另一个JSP冲突。我可以使用Servlet 3.0 / JSP 2.2 / JSTL 1.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> <% } %>
这将创建一个代码块,其中的变量具有自己的名称空间。但是,当然是JSTL和JSTL- EL而不是scriptlet代码。我看了一下JSTL规范,但没有发现是否有创建这种本地页面范围的方法。但是我没有检查所有内容,因为它很大,我不确定是否可以使用自定义标签。
对我来说很明显,更大的代码块不应该包含在JSP中,但是我希望借助框架为较小的组件提供简单的解决方案。
更改JSP代码
当组件最初放置在JSP上或通过拖放移动时,实际上是将组件的JSP代码从一个JSP移至另一个或在JSP内。这意味着,如果组件的JSP代码不太复杂,它也可以通过编程方式对其进行处理,这有助于解决问题。
因为我认为自定义标签包装可能是理想的解决方案,所以我创建了另一个更具体的问题,并且在这里找到了解决该问题的答案。
只是在评估正文之前删除所有pageContext属性,然后在处再次添加它们doEndTag()。
doEndTag()