standardwrappervalve - java.lang.IllegalStateException: ya está usando la secuencia de salida
servlet service() for servlet faces servlet lanzó exception>: java lang nullpointerexception (3)
Parece que la excepción se arroja desde esta línea.
out.println(e);
En caso de que el código para enviar el PDF como Aplicación falle durante la escritura, se lanzará una excepción y, al intentar imprimir la excepción con la línea anterior, la salida outputputstream ya se está utilizando.
No mezcle UI y Business Logic en JSP. Use un servlet para hacer este trabajo.
La GUI de Windchill en el navegador del lado del cliente cuando un usuario hace clic en un botón, el archivo pdf en particular debe descargarse en su sistema. Lo he logrado utilizando el siguiente código.
<body>
<%
String pdfname= session.getAttribute("pdfname").toString();
String Pdfpath= session.getAttribute("pdfpath").toString();
File f =new File(Pdfpath);
Boolean flag=false;
if(f.exists())
{
BufferedInputStream filein = null;
BufferedOutputStream out2=null;
try {
File file = new File(Pdfpath);//specify the file path
byte b[] = new byte[1048576];
int len = 0;
filein = new BufferedInputStream(new FileInputStream(file));
out2=new BufferedOutputStream(response.getOutputStream());
response.setHeader("Content-Length", ""+file.length());
response.setContentType("application/pdf");
response.setHeader("Content-Disposition","attachment;filename="+pdfname);
response.setHeader("Content-Transfer-Encoding", "binary");
while ((len = filein.read(b)) > 0) {
out2.write(b, 0, len);
out.println("Your Pdf Document Is Generated Please close it");
}
filein.close();
out2.flush();
out2.close();
}
catch(Exception e)
{
out.println(e);
}
}else{
String error ="File Not Found Or File Has Bean Deleted Already";
request.setAttribute("error", error);
RequestDispatcher s = request.getRequestDispatcher("NoFile.jsp");
s.forward(request, response);
}
%>
</body>
Este código funciona bien y el archivo se descarga, pero después arroja una excepción. El siguiente es el registro de mi servidor de métodos
ERROR : org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/Windchill].[jsp] - Servlet.service() for servlet jsp threw exception
Thu 3/28/13 12:29:07: TP-Processor7: java.lang.IllegalStateException: Already using output stream
Thu 3/28/13 12:29:07: TP-Processor7: at wt.servlet.CompressionFilter$GzippingResponse.getWriter(CompressionFilter.java:860)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:173)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.runtime.JspWriterImpl.close(JspWriterImpl.java:187)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jsp.netmarkets.jsp.gt.get_jsp._jspService(get_jsp.java:105)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
Thu 3/28/13 12:29:07: TP-Processor7: at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
Thu 3/28/13 12:29:07: TP-Processor7: at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
Thu 3/28/13 12:29:07: TP-Processor7: ......
......
Hay muchas publicaciones disponibles en google con respecto a esta excepción, pero no puedo borrar mi error. También intenté agregar esto en servlet en lugar de jsp. Eso también muestra la misma excepción. ¿Es correcto de esta manera para descargar un archivo o estoy equivocado? necesito ayuda
Gracias
Tienes </body>
después de tu scriptlet. Te imprimirá algo en la salida de la respuesta, pero ya la has cerrado antes.
¿Qué sentido tiene incluir etiquetas <body>
en su respuesta cuando lo que realmente desea hacer es enviar un PDF de vuelta al cliente?
No puede usar getServletOutputStream()
y getWriter()
en la misma respuesta.
Llegando a tu problema Evite escribir scriptlets en JSP. Lo que sea que esté haciendo en JSP, impleméntelo en Servlet.
Está llamando a response.getOutputStream();
en JSP que es ilegal. Debe usar ServletResponse.getOutputStream()
o ServletResponse.getWriter()
. Como JSP usa ServletResponse.getWriter () de forma predeterminada. Debería escribir en ServletResponse.getWriter () en su lugar ServletResponse.getOutputStream ()
Esto es lo que dice Java Doc:
getOutputStream ...
ServletOutputStream getOutputStream () arroja IOException
Devuelve un ServletOutputStream adecuado para escribir datos binarios en la respuesta. El contenedor de servlets no codifica los datos binarios.
Llamar a flush () en ServletOutputStream confirma la respuesta. Se puede llamar a este método o getWriter () para escribir el cuerpo, no ambos.
Devuelve: un ServletOutputStream para escribir datos binarios Tira: IllegalStateException - si se ha llamado al método getWriter en esta respuesta