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

关于Weblogic异常:weblogic.servlet.jsp.compilationException解决方案

WEBLOGIC8,9,10之间有何区别?

weblogic下更改jsp不生效的解决办法

Weblogic乱码解决过程

weblogic的linux静默搭建