2012-11-12 37 views
6

मेरे पास वेबलॉगिक 10.3.3 इंस्टॉल है और रिकर्सिव जेएसपी टैग के साथ समस्याएं प्रतीत होती हैं। इंटरनेट पर मुझे कुछ अन्य लोगों को एक ही समस्या का सामना करना पड़ा है (here और here), लेकिन कोई समाधान नहीं। कुछ लोग सुझाव देते हैं कि यह वेबलॉगिक 12 में तय है, या 9 में काम कर रहा था, लेकिन मैं इसकी पुष्टि नहीं कर सकता।वेबलॉगिक और रिकर्सिव जेएसपी टैग

एप्लिकेशन स्प्रिंग/स्प्रिंग रू/अपाचे टाइल्स/जेएसपीएक्स का उपयोग करके बनाया गया है।

public class Programme { 

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

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

तो मैं इस तरह की एक Tagx है:

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

यह काम नहीं करता मॉडल वर्ग कि प्रदर्शित किया जा रहा है की तरह कुछ है। पृष्ठ का अनुरोध करते समय, एप्लिकेशन कंटेनर क्रैश प्रतीत होता है (शायद कुछ स्टैक ओवरफ़्लो, लेकिन मुझे इसे लॉग में नहीं मिल रहा है), और एप्लिकेशन संदर्भ पुनः लोड किया गया है। टॉमकैट 7 में यह ठीक काम करता है।

अपवाद दिखाया कुछ इस तरह है, लेकिन मुझे यकीन है कि अगर यह संबंधित है नहीं कर रहा हूँ (क्योंकि यह त्रुटि पृष्ठ के बारे में बात):

[ServletContext @ 483,389,576 [एप्लिकेशन: एप्लिकेशन कान -0 मॉड्यूल : एपमुड्यूल पथ:/CONTEXTROOT spec-version: 2.5]] त्रुटि पृष्ठ की सेवा करते समय समस्या आई। org.springframework.web.util.NestedServletException: अनुरोध प्रसंस्करण विफल रहा; नेस्टेड अपवाद java.lang.ClassCastException: org.apache.tiles.ArrayStack 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:821) पर javax.servlet.http.HttpServlet.service (HttpServlet.java:707) पर ...

क्या किसी ने पहले इन मुद्दों का अनुभव किया है, या किसी को किसी फिक्स के बारे में पता है? इसे डीबग करने के तरीके, या रिकर्सिव टैग को कैसे कामयाब करने के बारे में कोई सुझाव (क्योंकि मैं एक पेड़ प्रदर्शित करना चाहता हूं, यह एक चुनौती है)। अग्रिम में धन्यवाद।

+0

क्या आप प्रोग्राम टैग को बार-बार कॉल करने का प्रयास कर रहे हैं? मेरा भी वही मुद्दा है। रिकर्सिवली टैग टैग को कॉल करते समय यह टॉमकैट 6 में काम करता है, लेकिन वेबलॉगिक 11 में नहीं। –

+0

हां, यह मुद्दा है। टॉमकैट इसके साथ ठीक काम करता है, लेकिन वेबलॉगिक एक पिटा है। हमें इस कोड को दोबारा लिखने के अलावा कभी भी समाधान नहीं मिला है, इसलिए यह रिकर्सिव टैग का उपयोग नहीं करता है। – MikeN

उत्तर

0

मुझे नहीं पता कि टैग-रेंडरिंग इंजन को कैसे ठीक किया जाए। लेकिन मेरा जवाब काम-आसपास है कि कैसे रिकर्सन को खत्म किया जाए। इसके पीछे आइडिया java.util.Stack के उपयोग से किसी भी रिकर्सन को कम किया जा सकता है। तो फिर तुम क्षेत्र indentation जो आपको बताता है बना सकते हैं कि कितने रिक्त स्थान प्रदर्शित करने के लिए पेड़ की तरह संरचना

खरोज के साथ निर्माण रैखिक सूची पर

जावा कोड आरक्षित की जानी चाहिए:

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 में आप कुछ जगह कर सकते हैं कि पैडिंग बनाता है (10 पीएक्स द्वारा विभाजित div का पैडिंग-बाएं):

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