2016-06-30 1 views
0

作成したジャスパーレポート(.jrxml)を読み込もうとしましたが、私はそのレポートに "JREmp1.xml"という名前を付けました。しかし、私はこのエラーシステムにロードするjasperreportファイル(.JRXML)の正確な場所を取得する方法は?

「HTTPステータス500だ - 要求処理が失敗し、ネストされた例外は net.sf.jasperreports.engine.JRExceptionです: java.io.FileNotFoundException: D:\ printpdf.metadata.plugins \ org.eclipse.wst.server.core \ TMP0 \ wtpwebapps \ JasperExample \碧玉\ JREmp1.jrxml (システムは指定されたパスを見つけることができません)正確な場所を持ってする方法」

?ここに私のJREmp1.xmlファイルの場所です: enter image description here

、ここで私のコントローラクラスのコードです:ここで

public JasperReport getCompiledFile(String fileName, HttpServletRequest request) throws JRException { 
    System.out.println("path " + request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jasper")); 
    File reportFile = new File(request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jasper")); 
    // If compiled file is not found, then compile XML template 
    if (!reportFile.exists()) { 
     JasperCompileManager.compileReportToFile(request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jrxml"),request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jasper")); 
    } 
    JasperReport jasperReport = (JasperReport) JRLoader.loadObjectFromFile(reportFile.getPath()); 
    return jasperReport; 
} 


public void generateReportHtml(JasperPrint jasperPrint, HttpServletRequest req, HttpServletResponse resp) throws IOException, JRException { 
    HtmlExporter exporter=new HtmlExporter(); 
    List<JasperPrint> jasperPrintList = new ArrayList<JasperPrint>(); 
    jasperPrintList.add(jasperPrint); 
    exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrintList)); 
    exporter.setExporterOutput(new SimpleHtmlExporterOutput(resp.getWriter())); 
    SimpleHtmlReportConfiguration configuration =new SimpleHtmlReportConfiguration(); 
    exporter.setConfiguration(configuration); 
    exporter.exportReport(); 

} 


public void generateReportPDF (HttpServletResponse resp, Map parameters, JasperReport jasperReport, Connection conn)throws JRException, NamingException, SQLException, IOException { 
    byte[] bytes = null; 
    bytes = JasperRunManager.runReportToPdf(jasperReport,parameters,conn); 
    resp.reset(); 
    resp.resetBuffer(); 
    resp.setContentType("application/pdf"); 
    resp.setContentLength(bytes.length); 
    ServletOutputStream ouputStream = resp.getOutputStream(); 
    ouputStream.write(bytes, 0, bytes.length); 
    ouputStream.flush(); 
    ouputStream.close(); 
} 

と:ここ

@RequestMapping(value = "/generateReport", method = RequestMethod.POST) 
public String generateReport(
     @Valid @ModelAttribute("jasperInputForm") JasperInputForm jasperInputForm, 
     BindingResult result, Model model, HttpServletRequest request, 
     HttpServletResponse response) throws JRException, IOException, 
     NamingException { 

    if (result.hasErrors()) { 
     System.out.println("validation error occured in jasper input form"); 
     return "loadJasper"; 

    } 

    String reportFileName = "JREmp1"; 
    JasperReportDAO jrdao = new JasperReportDAO(); 

    Connection conn = null; 

    try { 
     conn = jrdao.getConnection(); 

     String rptFormat = jasperInputForm.getRptFmt(); 
     String noy = jasperInputForm.getNoofYears(); 

     System.out.println("rpt format " + rptFormat); 
     System.out.println("no of years " + noy); 

     HashMap<String, Object> hmParams = new HashMap<String, Object>(); 

     hmParams.put("noy", new Integer(noy)); 

     hmParams.put("Title", "Employees working more than " + noy 
       + " Years"); 

     JasperReport jasperReport = jrdao.getCompiledFile(reportFileName, 
       request); 

     if (rptFormat.equalsIgnoreCase("html")) { 
      JasperPrint jasperPrint = JasperFillManager.fillReport(
        jasperReport, hmParams, conn); 
      jrdao.generateReportHtml(jasperPrint, request, response); // For 
      // HTML 
      // report 
     } 
     else if (rptFormat.equalsIgnoreCase("pdf")) { 
      jrdao.generateReportPDF(response, hmParams, jasperReport, conn); // For 
      // PDF 
      // report 
     } 
    } catch (SQLException sqlExp) { 
     System.out.println("Exception::" + sqlExp.toString()); 
    } finally { 
     if (conn != null) { 
      try { 
       conn.close(); 
       conn = null; 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
    return null; 
} 

は私 JasperReportDAOクラスのコードです私 JasperInputFormクラス:

public class JasperInputForm { 

    @NotEmpty 
    private String noofYears; 
    private String rptFmt="Html"; 

    public String getRptFmt() { 
     return rptFmt; 
    } 

    public void setRptFmt(String rptFmt) { 
     this.rptFmt = rptFmt; 
    } 

    public String getNoofYears() { 
     return noofYears; 
    } 

    public void setNoofYears(String noofYears) { 
     this.noofYears = noofYears; 
    } 

} 

私のJREmp1.jrxmlファイルの場所を正しく取得するには?私は春のMVCアプリケーションのためのこのレポートを開発

UPDATE:ここ (私は@Wilsonが言ったことを第二の選択肢で行く)私は@Wilsonの答えを更新した後、私の完全な機能コードです: この関数はJasperReportDAO内にある:

は、
public JasperReport getCompiledFile(String fileName, HttpServletRequest request) throws JRException, MalformedURLException, URISyntaxException { 
    System.out.println("path " + request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jasper")); 
    //File reportFile = new File(request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jasper")); 
    URL resourceUrl = request.getSession().getServletContext().getResource("/WEB-INF/jasper/" + fileName + ".jrxml"); 
    File reportFile = new File(resourceUrl.toURI()); 

    // If compiled file is not found, then compile XML template 
    if (!reportFile.exists()) { 
       JasperCompileManager.compileReportToFile(request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jrxml"),request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jasper")); 
     } 
     JasperReport jasperReport = (JasperReport) JRLoader.loadObjectFromFile(reportFile.getPath()); 
     return jasperReport; 
} 

と私、このエラー

だ "HTTPステータス500 - 要求処理が失敗し、ネストされた例外は java.lang.IllegalArgumentExceptionがある:URIスキームではありません "ファイル""

これを解決するには?

答えて

3

ServeltContextでファイルを読むために行う方法の数があります:

1. 使用ServletContext#getRealPath

String fullPath = request.getSession().getServletContext().getRealPath("/WEB-INF/jasper/" + fileName + ".jrxml"); 

これはあなたが捜しているリソースへの完全システムパスを取得します。ただし、コンテナがWARファイルを展開しない場合は機能しません。

2. 使用ServletContext#getResource

URL resourceUrl = request.getSession().getServletContext().getResource("/WEB-INF/jasper/" + fileName + ".jrxml"); 
File file = new File(resourceUrl.toURI()); 

これは関係なく、アプリケーションがインストールされている場所あなたが使用してどのような容器のURLを返しません。

3。

ServletContext#getResourceからURLリターンがファイルURLではないかもしれないし、それが問題を引き起こす可能性があります。 ユーザーServletContext#getResourceAsStream

InputStream resourceStream = request.getSession().getServletContext().getResourceAsStream("/WEB-INF/jasper/" + fileName + ".jrxml"); 

これはinputSteam

UPDATE取得するServletContext#getResourceの代替です。 JasperCompileManager#compileReportToFileServletContext#getResourceAsStreamを試してください:

JasperDesign jasperDesign = JRXmlLoader.load(resourceStream); 
JasperCompileManager.compileReportToFile(jasperDesign, jasperFilePath); 

私はあなたが避けるべきであるあなたのプログラムの配布にジャスパーレポートファイルを作成しようとしていることがわかりました。好ましい方法は、レポートをプレコンパイルしてWARファイルに入れるか、コンパイル済みのジャスパーレポートを一時ディレクトリに置くことです。続き

は、完全なコード例を次に示します。

public JasperReport getCompiledFile(String fileName, HttpServletRequest request) throws JRException, IOException { 
    // Create temporary folder to store jasper report as you should not write a resource into your program 
    // distribution 
    String tempFolderPath = System.getProperty("java.io.tmpdir") + File.separator + "jasperReport"; 
    File tempFolder = new File(tempFolderPath); 
    if (!tempFolder.exists()) { 
     tempFolder.mkdirs(); 
    } 
    String jasperFilePath = tempFolderPath + File.separator + fileName + ".jasper"; 
    File reportFile = new File(jasperFilePath); 
    // If compiled file is not found, then compile XML template 
    if (!reportFile.exists()) { 
     InputStream jRXmlStream = request.getSession().getServletContext().getResourceAsStream 
       ("/WEB-INF/jasper/" + fileName + ".jrxml"); 
     JasperDesign jasperDesign = JRXmlLoader.load(jRXmlStream); 
     JasperCompileManager.compileReportToFile(jasperDesign, jasperFilePath); 
    } 
    JasperReport jasperReport = (JasperReport) JRLoader.loadObjectFromFile(reportFile.getPath()); 
    return jasperReport; 
} 
+0

私はのServletContextを使用している2番目のオプションを、しようとします。どのようにcontext.getResourceを宣言するのですか?私はコンテキストはいくつかの変数が正しいと思いますか? –

+0

はい、 'context'は' request.getSession()。getServletContext() 'です。私にそれを更新させてください。 – Wilson

+0

大丈夫なので、コードを追加して、MalformedURLException、URISyntaxExceptionをスローするような構文エラーが表示されるので、関数をスローしてからコードを実行するとエラーがなくなり、 "java.lang .IllegalArgumentException:URIスキームは "ファイル"ではない "これを解決するには? –

関連する問題