我尝试加载我创建的jasper报告(.jrxml),我将报告命名为“JREmp1.xml”。但我得到了这个错误
“HTTP状态500 - 请求处理失败;嵌套异常是 net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: d:\ printpdf.metadata.plugins \ org.eclipse.wst.server.core \ TMP0 \ wtpwebapps \ JasperExample \碧玉\ JREmp1.jrxml (系统找不到指定的路径)“
这是我的控制器类中的代码:
@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
课程中的代码:
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();
}
这是我的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
文件位置?我为Spring MVC应用程序开发此报告
更新: 这是我用@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方案不是“文件”“
如何解决这个问题?
答案 0 :(得分: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#getResourceAsStream
InputStream resourceStream = request.getSession().getServletContext().getResourceAsStream("/WEB-INF/jasper/" + fileName + ".jrxml");
这是获得ServletContext#getResource
inputSteam
的替代方案
<强>更新强>:
从ServletContext#getResource
返回的网址可能不是文件网址,可能会导致问题。请使用ServletContext#getResourceAsStream
:
JasperCompileManager#compileReportToFile
JasperDesign jasperDesign = JRXmlLoader.load(resourceStream);
JasperCompileManager.compileReportToFile(jasperDesign, jasperFilePath);
我发现您正在尝试将jasper报告文件写入您的程序分发中,这应该避免。首选方法是预编译报告并将其放入WAR文件或将已编译的jasper报告放入临时目录中。
以下是完整的代码示例:
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;
}
答案 1 :(得分:0)
如果Resource
文件夹中存在jrxml,我们可以使用以下代码片段-
InputStream employeeReportStream = getClass().getResourceAsStream("/report.jrxml");
JasperReport report = JasperCompileManager.compileReport(employeeReportStream);