2012-11-12 39 views
6

Tôi có một bản cài đặt weblog 10.3.3 và dường như có vấn đề với các thẻ JSP đệ quy. Trên internet tôi đã tìm thấy một số người khác gặp phải cùng một vấn đề (herehere), nhưng không có giải pháp. Một số người cho rằng nó được sửa trong Weblogic 12, hoặc đang làm việc trong 9, nhưng tôi không thể xác nhận điều này.Thẻ JSP Weblogic và đệ quy

Ứng dụng được tạo bằng Spring/Spring Roo/Apache Tiles/jspx. Lớp mô hình đang được hiển thị là một cái gì đó như:

public class Programme { 

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

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

Sau đó, tôi có một tagx như thế này:

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

này không hoạt động. Khi yêu cầu trang, vùng chứa ứng dụng dường như bị lỗi (có thể một số tràn ngăn xếp, nhưng tôi không thể tìm thấy nó trong nhật ký) và ngữ cảnh ứng dụng được tải lại. Trong Tomcat 7 nó hoạt động tốt.

Trường hợp ngoại lệ được thể hiện là một cái gì đó như thế này, nhưng tôi không chắc chắn nếu nó liên quan (vì nó nói về trang lỗi):

[ServletContext @ 483.389.576 [ứng dụng: Ứng dụng-tai-0 mô-đun : đường dẫn appmodule:/CONTEXTROOT spec-version: 2.5]] Đã xảy ra sự cố khi phục vụ trang lỗi. org.springframework.web.util.NestedServletException: Yêu cầu xử lý không thành công; ngoại lệ lồng nhau là java.lang.ClassCastException: org.apache.tiles.ArrayStack tại org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:894) tại org.springframework.web.servlet.FrameworkServlet.doGet (FrameworkServlet.java:779) tại javax.servlet.http.HttpServlet.service (HttpServlet.java:707) tại javax.servlet.http.HttpServlet.service (HttpServlet.java:821) tại ...

Có ai đã từng gặp phải những vấn đề này trước đây hay không, hoặc có ai biết về việc sửa chữa không? Bất kỳ mẹo nào về cách gỡ lỗi này hoặc cách giải quyết thẻ đệ quy (vì tôi muốn hiển thị một cây, đó là một chút thách thức). Cảm ơn trước.

+0

Bạn đang cố gắng gọi thẻ chương trình đệ quy? Tôi có một vấn đề tương tự. Trong khi gọi đệ quy một tập tin thẻ nó hoạt động trong Tomcat 6, nhưng không phải trong Weblogic 11. –

+0

Vâng, đó là vấn đề. Tomcat làm việc tốt với nó, nhưng Weblogic là một pita. Chúng tôi không bao giờ tìm thấy một giải pháp cho việc này ngoài việc viết lại mã để nó không sử dụng một thẻ đệ quy. – MikeN

Trả lời

0

Tôi không biết cách sửa công cụ hiển thị thẻ. Nhưng câu trả lời của tôi là làm việc xung quanh làm thế nào để loại bỏ đệ quy ở tất cả. Ý tưởng đằng sau rằng bất kỳ đệ quy có thể được giảm bằng cách sử dụng java.util.Stack. Sau đó, bạn có thể tạo lĩnh vực indentation cho bạn biết có bao nhiêu không gian nên dành để hiển thị cây giống như cấu trúc

mã Java trong danh sách tuyến tính xây dựng với thụt đầu dòng:

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

Sau đó trong JSP bạn có thể đặt một cái gì đó tạo padding (có padding-left của div nhân với 10px):

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