2012-11-12 14 views
6

Ich habe eine Weblogic 10.3.3 installieren und habe Probleme mit rekursiven JSP-Tags. Im Internet habe ich einige andere Leute gefunden, die dieselben Probleme haben (here und here), aber keine Lösungen. Einige Leute behaupten, dass es in Weblogic 12 behoben ist oder in 9 gearbeitet hat, aber das kann ich nicht bestätigen.Weblogic und rekursive JSP-Tags

Die Anwendung wird mit Spring/Spring Roo/Apache Tiles/Jspx erstellt. Die Modellklasse, die angezeigt wird, ist so etwas wie:

public class Programme { 

private String name; 
private final List<Programme> programmes = new ArrayList<Programme>(); 

...(getter/setter)... 
} 

Dann habe ich ein Tagx wie folgt aus:

<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> 

Dies funktioniert nicht. Beim Anfordern der Seite scheint der Anwendungscontainer abzustürzen (wahrscheinlich ein Stapelüberlauf, aber ich kann ihn in den Protokollen nicht finden) und der Anwendungskontext wird neu geladen. In Tomcat 7 funktioniert es gut.

Die dargestellte Ausnahme so etwas wie das ist, aber ich bin nicht sicher, ob es in engem Zusammenhang steht (da es sich um die Fehlerseite spricht):

[ServletContext @ 483.389.576 [App: app-Ohr-0-Modul : appmodule Pfad:/CONTEXTROOT spec-version: 2.5]] Problem beim Auslösen der Fehlerseite. org.springframework.web.util.NestedServletException: Anforderungsverarbeitung fehlgeschlagen; Die verschachtelte Ausnahme ist java.lang.ClassCastException: org.apache.tiles.ArrayStack um org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:894) um org.springframework.web.servlet.FrameworkServlet.doGet (FrameworkServlet.java:779) bei javax.servlet.http.HttpServlet.service (HttpServlet.java:707) bei javax.servlet.http.HttpServlet.service (HttpServlet.java:821) bei ...

Hat jemand diese Probleme schon einmal erlebt, oder kennt jemand eine Lösung? Irgendwelche Tipps, wie man dies debuggt, oder wie man das rekursive Tag umgehen kann (da ich einen Baum anzeigen möchte, ist es eine kleine Herausforderung). Danke im Voraus.

+0

Versuchen Sie, das Programm-Tag rekursiv aufzurufen? Ich habe ein ähnliches Problem. Beim rekursiven Aufrufen einer Tag-Datei funktioniert es in Tomcat 6, aber nicht in Weblogic 11. –

+0

Ja, das ist das Problem. Tomcat funktioniert gut, aber Weblogic ist ein Pita. Wir haben dafür keine Lösung gefunden, abgesehen vom Umschreiben des Codes, so dass kein rekursives Tag verwendet wird. – MikeN

Antwort

0

Ich habe keine Ahnung, wie Tag-Rendering-Engine zu beheben. Aber meine Antwort lautet, wie man die Rekursion überhaupt beseitigen kann. Die Idee hinter dieser Rekursion kann durch die Verwendung von java.util.Stack reduziert werden. Dann können Sie Feld erstellen indentation, die Ihnen sagt, wie viele Räume reserviert werden sollte, baumartige Struktur mit Vertiefung

Java-Code auf Build lineare Liste anzuzeigen:

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)); 
    } 
} 

Danach in JSP können Sie etwas Platz, erstellt Padding (dort Padding-links von div multipliziert mit 10px):

<c:forEach var="fp" items="${formatted}"> 
    <div style='padding-left:${fp.indent * 10}px'> 
     <c:out value="${fp.programme.name}" /> 
    </div> 
</c:forEach>