Weblogic 和递归 JSP 标记
Posted
技术标签:
【中文标题】Weblogic 和递归 JSP 标记【英文标题】:Weblogic and recursive JSP tags 【发布时间】:2012-11-01 08:06:05 【问题描述】:我安装了 Weblogic 10.3.3,但似乎遇到了递归 JSP 标记的问题。在互联网上,我发现其他一些人遇到了同样的问题(here 和here),但没有解决方案。有人建议它在 Weblogic 12 中已修复,或者在 9 中工作,但我无法确认。
应用程序是使用 Spring/Spring Roo/Apache Tiles/jspx 构建的。正在显示的模型类类似于:
public class Programme
private String name;
private final List<Programme> programmes = new ArrayList<Programme>();
...(getter/setter)...
然后我有一个这样的标签:
<jsp:root xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:coursedataimport="urn:jsptagdir:/WEB-INF/tags/coursedataimport" version="2.0">
<jsp:output omit-xml-declaration="yes" />
<jsp:directive.attribute name="programme" type="package.Programme" required="true" rtexprvalue="true" />
<c:out value="$programme.name" />
<ul>
<c:forEach var="p" items="$programme.programmes">
<li><coursedataimport:programme programme="$p" /></li>
</c:forEach>
</ul>
</jsp:root>
这不起作用。请求页面时,应用程序容器似乎崩溃了(可能是一些堆栈溢出,但我在日志中找不到它),并且重新加载了应用程序上下文。在 Tomcat 7 中它运行良好。
显示的异常是这样的,但我不确定它是否相关(因为它谈到了错误页面):
[ServletContext@483389576[app:app-ear-0 module:appmodule path:/CONTEXTROOT spec-version:2.5]] 提供错误页面时出现问题。 org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 java.lang.ClassCastException: org.apache.tiles.ArrayStack at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:779) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:821) 在 ...
以前有没有人遇到过这些问题,或者有人知道解决方法吗?有关如何调试此问题或如何解决递归标记的任何提示(因为我想显示一棵树,所以有点挑战)。提前致谢。
【问题讨论】:
您是否尝试递归调用程序标签?我有一个类似的问题。在递归调用标记文件时,它在 Tomcat 6 中有效,但在 Weblogic 11 中无效。 是的,这就是问题所在。 Tomcat 可以很好地使用它,但 Weblogic 是一个皮塔饼。除了重写代码以使其不使用递归标记之外,我们从未找到解决方案。 【参考方案1】:我不知道如何修复标签渲染引擎。但我的答案是解决如何完全消除递归。通过使用 java.util.Stack 可以减少任何递归背后的想法。然后你可以创建字段indentation
,告诉你应该保留多少空间来显示树状结构
使用缩进构建线性列表的 Java 代码:
class FormattedProgramme
Programme programme;
int indent;
...
java.util.List<FormattedProgramme> result = new ArrayList<FormattedProgramme>();
java.util.Stack<FormattedProgramme> programmeStack =
new java.util.Stack<FormattedProgramme>();
//you should know how to resolve root bean 'programme'
programmeStack.push(new FormattedProgramme(programme, 0/*indent=0*/));
while(!programmeStack.empty())
FormattedProgramme parent = programmeStack.pop();
result.add(parent);
for(Programme child:parent.programme.programmes )
//create child item with indentation + 1
//may be you need keep order of items - then reverse this loop
programmeStack.push(new FormattedProgramme(child, parent.indent+1));
然后在 JSP 中你可以放置一些创建填充的东西(div 的 padding-left 乘以 10px):
<c:forEach var="fp" items="$formatted">
<div style='padding-left:$fp.indent * 10px'>
<c:out value="$fp.programme.name" />
</div>
</c:forEach>
【讨论】:
以上是关于Weblogic 和递归 JSP 标记的主要内容,如果未能解决你的问题,请参考以下文章
weblogic对JSP预编译weblogic读取JSP编译后的class文件ant中jspc预编译JSP