2011-03-21 21 views
12

के साथ जैस्पर रीपॉर्ट्स का उपयोग करना मेरे पास एक वेब ऐप है और क्लाइंट ने कुछ रिपोर्ट देखने का अनुरोध किया है। दृष्टिकोण iReport का उपयोग करने और उन्हें स्क्रीन पर रिपोर्ट दिखाने के लिए किया गया है।एक सापेक्ष पथ

I have already asked something like this। लेकिन आज मैंने पाया है कि रिपोर्ट फाइलों के पथ (jrxml) पूर्ण हैं। तो मुझे प्रोग्राम को बदलना है ताकि यह सापेक्ष पथ स्वीकार कर सके। मैं ऐसा करने की कोशिश कर रहा हूं, लेकिन ऐसा लगता है कि न तो jrxml या संकलित (.jasper) फ़ाइलें न तो संकलित या रिपोर्ट को भरने के सापेक्ष पथ स्वीकार करती हैं।

यह मैं इतनी दूर क्या मिल गया है है:

//path is generated as request.getContextPath() + "/jrxmlFiles/" 
public void generateReport(HttpServletResponse res, ConexionAdmin con, String path) throws Exception{ 

    ServletOutputStream out = null; 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    JasperDesign jasperDesign = JRXmlLoader.load(path); 
    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 

    byte[] bytes = JasperRunManager.runReportToPdf(jasperReport, pars, con.initConexion()); 
     res.setContentType("application/pdf"); 
    res.setContentLength(bytes.length); 
    out = res.getOutputStream(); 
    out.write(bytes, 0, bytes.length); 

    res.setHeader("Cache-Control", "cache"); 
    res.setHeader("Content-Disposition", "attachment; filename=report.pdf"); 
    res.setHeader("Pragma", "cache"); 
    res.setContentLength(bos.size()); 

    out.write(bos.toByteArray()); 
    out.flush(); 
    bos.close(); 
    out.close(); 
    res.flushBuffer(); 
} 

यह पूर्ण पथ के साथ काम करने लगता है, लेकिन मुझे फेंकता है:

Exception Message 
net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException 

जब एक रिश्तेदार पथ के लिए बदल दिया है। मैंने अपने फिट बैठने के तरीके में कोई सफलता नहीं के साथ नेट की खोज की है।

मेरे पास जैस्पर एपीआई के लिए जावाडॉक है, लेकिन अगर मैं इसकी मदद कर सकता हूं तो मैं इसे पढ़ नहीं सकता हूं।

+0

लगता है कि मैं पार्स की घोषणा जोड़ने के लिए भूल गया हूं, यह सिर्फ एक नया हैसमैप() है (जैसा कि रिपोर्ट में मैं कोशिश कर रहा हूं कोई चर नहीं है)। गलत जगह के लिए खेद है! – Random

उत्तर

16
  • पथ पूर्ण होना चाहिए।
  • .jrxml फ़ाइलों को केवल .jasper फ़ाइलों पर संकलित करें यदि .jrxml संशोधित किया जा रहा है। आमतौर पर आप केवल .jasper फ़ाइल लोड कर सकते हैं और संकलन को पूरी तरह से छोड़ सकते हैं। यह बहुत तेज है।
  • स्टोर .jasper और .jrxml आपकी वेब रूट के बाहर फ़ाइलें।
  • अपने सभी रिपोर्ट्स पर निम्न पैरामीटर बनाएं: $P{ROOT_DIR} के सापेक्ष
     
        ROOT_DIR = "/full/path/to/reports/" 
        IMAGE_DIR = $P{ROOT_DIR} + "images/" 
        STYLES_DIR = $P{ROOT_DIR} + "styles/" 
        SUBREPORT_DIR = $P{ROOT_DIR} + "subreports/" 
        COMMON_DIR = $P{ROOT_DIR} + "common/"
  • संदर्भ आइटम (उदा $P{IMAGE_DIR}$P{ROOT_DIR} के संदर्भ में परिभाषित किया गया है)।
  • अपने पर्यावरण से $P{ROOT_DIR} का मूल्य पास करें।
  • आपके द्वारा उपयोग किए जाने वाले किसी भी रिपोर्टिंग ढांचे पर अपने आवेदन को कम से कम जोड़े।

फिर आवश्यक होने पर अभिव्यक्तियों का उपयोग करें। उदाहरण के लिए, संदर्भ subreports निम्नानुसार है:

<subreportExpression> 
    <![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]]> 
</subreportExpression> 

यह सबरेपोर्ट निर्देशिका वातावरण के बीच भिन्न होने की अनुमति देगा।

+1

@ यादृच्छिक: मैं सुझाव नहीं दे रहा हूं कि आप जैस्पर रीपॉर्ट्स का उपयोग नहीं करते हैं। इससे दूर। मैं सुझाव दे रहा हूं कि आप एक कार्यान्वयन का उपयोग करें जो कसकर युग्मित किए बिना जैस्पर रीपॉर्ट्स का उपयोग करता है। (प्रभावी रूप से वास्तुकला घटकों को अलग करना।) –

2

मुझे एक ही समस्या थी, और मुझे समाधान मिला। सबसे पहले, एक फ़ोल्डर में रिपोर्ट और सभी एक्सटेंशन (.jasper, .jrxml) में उपयोग की जाने वाली प्रत्येक वस्तु (सब्रेपोर्ट, छवि, आदि) डालें और उस फ़ोल्डर को C: // डिस्क में रखें। यह शायद अब मेरे दस्तावेज़ों में कहीं भी रखा गया है, या किसी भी पथ जिसमें शब्दों के बीच रिक्त स्थान हैं, और फिर iReport इसे "मेरा% 20 दस्तावेज़" जैसा देखता है और यह उसे भ्रमित करता है।

तो, फ़ोल्डर को सी: // में डालें, अपनी रिपोर्ट से संबंधित सभी सामान एक ही फ़ोल्डर में रखें और सबकुछ के सापेक्ष पथ रखें। यह काम करना चाहिए। उम्मीद है कि मैंने किसी की मदद की।

+0

यह प्रोजेक्ट थोड़ी देर से था, और मेरे पास अब परीक्षण करने के लिए कोड नहीं है। लेकिन विचार यह था कि जैस्पर कुछ सापेक्ष पथ जैसे /JRXML_files/account/account_report.jrxml (वेबकंटेंट के अंदर) का उपयोग करने में सक्षम होगा। यद्यपि इस समय पोस्ट किया गया है जैस्पर का एक नया संस्करण है और उम्मीद है कि वे इस पथ को स्वीकार करते हैं। धन्यवाद और मुझे उम्मीद है कि मैं जल्द ही कोशिश कर सकता हूं। – Random

+1

हाँ, मैं समझता हूं कि आपकी समस्या क्या थी। और मुझे कुछ दिन पहले iReport 3.7.2 के साथ एक ही समस्या थी, और आखिरकार उसे उलझन में मिला। जो भी हो, सिर्फ जवाब पोस्ट करना चाहता था, क्योंकि मैंने एक ही मुद्दे के साथ बहुत सारे प्रश्न देखे थे। – Merjem

संबंधित मुद्दे