【问题标题】:Weblogic and recursive JSP tagsWeblogic 和递归 JSP 标记
【发布时间】:2012-11-01 08:06:05
【问题描述】:

我安装了 Weblogic 10.3.3,但似乎遇到了递归 JSP 标记的问题。在互联网上,我发现其他一些人遇到了同样的问题(herehere),但没有解决方案。有人建议它在 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 是一个皮塔饼。除了重写代码以使其不使用递归标记之外,我们从未找到解决方案。

标签: java jsp spring-mvc weblogic jsp-tags


【解决方案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 * 10}px'>
        <c:out value="${fp.programme.name}" />
    </div>
</c:forEach>

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 2013-04-12
    • 2012-11-12
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多