LeP*_*han 2 java servlets jasper-reports
我有如下代码.该计划停止了在线工作servletOutputStream = response.getOutputStream();.我不知道怎么解决这个问题?任何人都可以帮我解决这个问题吗?
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, SQLException, JRException, ParserConfigurationException, SAXException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println ("<html>");
out.println (" <head>");
out.println (" <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>");
out.println (" <title>JSP Page</title>");
out.println (" </head>");
out.println (" <body>");
out.println (" <h1>Hello iReport!</h1>");
String resourceName = "D:/classic.jrxml";
response.setContentType("application/pdf");
ServletOutputStream servletOutputStream = null;
servletOutputStream = response.getOutputStream(); // <--
InputStream reportStream = getServletConfig().getServletContext().getResourceAsStream(resourceName);
try {
Driver driver = new org.gjt.mm.mysql.Driver();
DriverManager.registerDriver(driver);
String conString = "jdbc:mysql://localhost:3306/quanlynhasach";
Properties info = new Properties();
info.setProperty("characterEncoding", "utf8");
info.setProperty("user", "root");
info.setProperty("password", "");
Connection con = DriverManager.getConnection(conString, info);
JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream,new HashMap<Object, Object>(), con);
con.close();
}catch(Exception e){
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
response.setContentType("text/plain");
response.getOutputStream().print(stringWriter.toString());
}
out.println (" </body>");
out.println ("</html>");
} finally {
out.close();
}
} // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
try {
processRequest(request, response);
} catch (ParserConfigurationException ex) {
Logger.getLogger(iReport.class.getName()).log(Level.SEVERE, null, ex);
} catch (SAXException ex) {
Logger.getLogger(iReport.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (SQLException ex) {
Logger.getLogger(iReport.class.getName()).log(Level.SEVERE, null, ex);
} catch (JRException ex) {
Logger.getLogger(iReport.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
try {
processRequest(request, response);
} catch (ParserConfigurationException ex) {
Logger.getLogger(iReport.class.getName()).log(Level.SEVERE, null, ex);
} catch (SAXException ex) {
Logger.getLogger(iReport.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (SQLException ex) {
Logger.getLogger(iReport.class.getName()).log(Level.SEVERE, null, ex);
} catch (JRException ex) {
Logger.getLogger(iReport.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* Returns a short description of the servlet.
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
Run Code Online (Sandbox Code Playgroud)
看这里:
PrintWriter out = response.getWriter();
// *snip*
servletOutputStream = response.getOutputStream();
Run Code Online (Sandbox Code Playgroud)
你得到双方的Writer,并OutputStream从响应.这是不允许的.阅读他们的javadocs:
的getOutputStream()
Run Code Online (Sandbox Code Playgroud)ServletOutputStream getOutputStream() throws java.io.IOException返回
ServletOutputStream适合在响应中写入二进制数据.servlet容器不对二进制数据进行编码.调用
flush()上ServletOutputStream提交的响应.无论是这种方法还是getWriter()可以被称为写身体,而不是两者.
和
的getWriter()
Run Code Online (Sandbox Code Playgroud)java.io.PrintWriter getWriter() throws java.io.IOException返回
PrintWriter可以将字符文本发送到客户端的对象.在PrintWriter使用由返回的字符编码getCharacterEncoding().如果未按照描述指定响应的字符编码getCharacterEncoding(即,该方法仅返回默认值ISO-8859-1),getWriter则将其更新为ISO-8859-1.调用
flush()上PrintWriter提交的响应.无论是这种方法还是
getOutputStream()可以被称为写身体,而不是两者.
(强调我的)
问题在于你的特殊情况,但要大得多.您试图在HTML响应中的这些HTML标记之间内联Jasper报告的PDF结果.在编写代码时我不确定你的想法或吸烟,但这绝对不会起作用.您需要以这种方式重写servlet,以便它只返回PDF而不是那堆HTML噪声.您应该将所有HTML从servlet移到某个JSP文件中.然后,您可以通过JSP中的简单下载链接调用该servlet
<a href="yourServletUrl">Download PDF</a>
Run Code Online (Sandbox Code Playgroud)
或者在<iframe>(在JSP中)
<iframe src="yourServletUrl" style="width: 500px; height: 300px;"></iframe>
Run Code Online (Sandbox Code Playgroud)
或者在<object>(也在这里,只是在JSP中)
<object data="yourServletUrl" type="application/pdf" width="500" height="300" />
Run Code Online (Sandbox Code Playgroud)
只需将该HTML放在JSP页面中,在浏览器中打开JSP,webbrowser就会注意调用servlet,并按照您的预期方式表示PDF.
你的另一个问题是异常处理并不是很好.由于未重置响应缓冲区,因此您将完全看不到任何方式.你应该做一个
} catch (Exception e) {
throw new ServletException("descriptive message here", e);
}
Run Code Online (Sandbox Code Playgroud)
因为容器完全知道如何处理异常.
你doGet()和你doPost()正在做的完全相同也是一种设计气味.您在那里使用的JDBC驱动程序已完全过时并已弃用.你如何注册驱动程序是笨拙的.数据库连接未关闭finally容易导致资源泄漏.好的,我会停止......