6

我安装了 Weblogic 10.3.3 并且似乎遇到了递归 JSP 标记的问题。在互联网上,我发现其他一些人遇到了同样的问题(这里这里),但没有解决方案。有人建议它在 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.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894) 处的 org.apache.tiles.ArrayStack 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) 在 ...

以前有没有人遇到过这些问题,或者有人知道解决方法吗?有关如何调试此问题或如何解决递归标记的任何提示(因为我想显示一棵树,所以有点挑战)。提前致谢。

4

1 回答 1

0

我不知道如何修复标签渲染引擎。但我的答案是解决如何完全消除递归。通过使用 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 * 10}px'>
        <c:out value="${fp.programme.name}" />
    </div>
</c:forEach>
于 2013-05-15T14:40:35.327 回答