Crítico: Servlet.service() del programa de servicio jsp generó una excepción
La razón específica es que
Después de compilar jsp en servlet en Tomcat, al final de la función _jspService (solicitud HttpServletRequest, respuesta HttpServletResponse),
Existe un código de párrafo
Finalmente {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
¡Esto será un objeto liberado usado en jsp y llamará a Response.getWriter() porque este método entra en conflicto con
respuesta.getOutputStream()! Por lo tanto se produce la excepción anterior.
En este momento, por supuesto, tenemos que proponer una solución, que en realidad es muy simple (no se lo digas a algunos amigos:
jsp eliminará todos los espacios y retornos de carro dentro Todo el contenido será eliminado),
Simplemente llame a las siguientes dos líneas de código después de usar el flujo de salida:
out.clear();
out =pageContext. pushBody();
Finalmente, aquí hay un ejemplo de cómo generar un código de verificación en color (tales ejemplos se pueden encontrar en casi todas partes)
image.jsp
<%@ página import="java.awt.*,java.awt.image.*, java.util. java.util.*,javax.imageio.*"%>
<% @ página import=" java.io.OutputStream" %>
<%!
Color getRandColor(int fc,int bc){
Aleatorio aleatorio = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random .nextInt(bc-fc);
int b=fc+random.setDateHeader("Expires", 0
int width=60, height=20); >
Imagen BufferedImage = new BufferedImage(ancho, alto, BufferedImage.TYPE_INT_RGB
OutputStream os=response.getOutputStream()
Gráficos g = image.getGraphics();
OutputStream os=response.getOutputStream();
Gráficos g = image.getGraphics()setColor(getRandColor(160,200));
for (int) i=0;i<155;i++)
{
int x = random.nextInt(ancho);
int y = random.nextInt(alto );
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y ,x+xl,y+yl);
}
Cadena sRand="";
for (int j=0;j<4;j++ ){
String rand=String.valueOf( random.nextInt(10));
g.nextInt(10));
sRand+=rand;
g.setColor(nuevo Color(2random.nextInt(110),2random.nextInt(110),2random.nextInt(110));
g .drawString(rand,13*j+6,16);
}
s
session.setAttribute("rand",sRand);
g.dispose();
g.dispose()dispose();
ImageIO.write (imagen, "JPEG",os);
os.flush();
os.close();
os=null;
response.flushBuffer();
out.clear();
out = pageContext.pushBody();
}
catch(IllegalStateException e)
{
System.out.println(e.getMessage());
printStackTrace();
}%>
¡Bienvenidas las correcciones, si las hay!
2
Se ha llamado a la solución getOutputStream() para resolver este problema de respuesta.
Cuando jsp genera una imagen en la página, use Response.getOutputStream( ) Dará como resultado el siguiente mensaje: java.lang.IllegalStateException: se ha llamado a getOutputStream() para esta respuesta y se generará una excepción
Causa 1:
La salida predeterminada El flujo de JSP es PrintWriter, es decir, <% %> algo distinto de la salida predeterminada dará como resultado un error si intenta utilizar un ServletOutputStream en un JSP. Ya sea que se envíe directamente al servlet (anulando el método de servicio) o que se elimine cualquier cosa excepto %% > < %%
(incluidas etiquetas HTML, espacios, retornos de carro, etc.), debería estar bien.
Para esta situación, se debe resolver así: eliminar todo entre %><%, incluidos espacios y nuevas líneas, y finalmente eliminar los espacios y nuevas líneas.
Lo mejor es Agregar una frase respuesta.reset().
Razón dos:
Hay este contenido en la referencia de la API J2EE:
El método ServletResponse getWriter() generará esta excepción,
IllegalStateException: si se ha llamado al método getOutputStream de este objeto de respuesta
y su método getOutputStream() arroja esta excepción.
IllegalStateException: este método se puede llamar si se ha llamado al método getOutputStream de este objeto de respuesta
, y esta declaración está presente en ambas declaraciones de función
o getOutputStream() para escribir el texto, en lugar de llamar a ambos.
La descripción anterior también explica por qué se debe utilizar el siguiente formato de bucle al escribir imágenes en la página
OutputStream output=response.getOutputStream();
while ( (len=in.read(b)) >0)
{
salida.write(b,0,len
}); p >
output.flush();
En lugar de escribir respuesta.getOutputStream().write() en el bucle:
<%
response.getOutputStream();
%>
<
Aparecerá el siguiente mensaje de error:
java.lang.ResponseFacade.getWriter( ResponseFacade .java:198)
org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer( JspWriterImpl.java:118)