Jsp y servlet

Hola icalv000.
Tengo un pequeño problema y no se como solucionarlo, te cuento:
Estoy usando un servidor iplanet, y en el tengo un monton de "legaci servlet" pero dentro de un servlet deseo ejecutar un jsp que esta en una aplicación web y me da el siguiente error:
[26/Jun/2003:17:54:37] failure ( 1556): Internal error: servlet service function had thrown ServletException (uri=/aplicacionweb/top.jsp): javax.servlet.ServletException: General error, stack: javax.servlet.ServletException: General error
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:453)
at _jsps._top_jsp._jspService(_top_jsp.java:250)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:247)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.access$6(JspServlet.java:237)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:520)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:589)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at com.iplanet.server.http.servlet.NSServletRunner.invokeServletService(NSServletRunner.java:891)
at com.iplanet.server.http.servlet.WebApplication.service(WebApplication.java:1064)
at com.iplanet.server.http.servlet.NSServletRunner.ServiceWebApp(NSServletRunner.java:953)
, root cause: java.sql.SQLException: General error
at sun.jdbc.odbc.JdbcOdbc.throwGenericSQLException(JdbcOdbc.java:6155)
at sun.jdbc.odbc.JdbcOdbc.SQLFreeEnv(JdbcOdbc.java:2737)
at sun.jdbc.odbc.JdbcOdbcDriver.closeConnection(JdbcOdbcDriver.java:837)
at sun.jdbc.odbc.JdbcOdbcConnection.close(JdbcOdbcConnection.java:731)
at _jsps._top_jsp._jspService(_top_jsp.java:170)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:247)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.access$6(JspServlet.java:237)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:520)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:589)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at com.iplanet.server.http.servlet.NSServletRunner.invokeServletService(NSServletRunner.java:891)
at com.iplanet.server.http.servlet.WebApplication.service(WebApplication.java:1064)
at com.iplanet.server.http.servlet.NSServletRunner.ServiceWebApp(NSServletRunner.java:953)
si el jsp lo ejecuto indipendientemente del servlet y funciona correctamente.
¿Como puedo solucionarlo?
Gracias.

1 respuesta

Respuesta
1
Pon una traza en la página para ver si recibe los dos parámetros...
Salu2,
N.
Hola icalv000
esto es lo que me da la traza:
1/07/2003 12:03:04 Fini: 1049155200 Ffinal: 1051740000
01/07/2003 12:03:04 MM_FujTopImp_USD_DRIVER: sun.jdbc.odbc.JdbcOdbcDriver
01/07/2003 12:03:04 MM_FujTopImp_USD_USERNAME: usrdb
01/07/2003 12:03:04 MM_FujTopImp_USD_PASSWORD: -uea1234--
01/07/2003 12:03:04 MM_FujTopImp_USD_STRING: jdbc:odbc:sqlDB
01/07/2003 12:03:05 Error del Catch: General error error nº: 0 state: S1000
¿Puedes probar de pasar los parámetros por url la pag top.jsp?
Salu2,
N.
hola icalv000
He seguido haciendo pruebas y solo me da error al cerrar las conexiones.
Conneje_proc_almacenado.close();
ConnRecordset1.close();
si,la página recibe dos parametros via post.
Hola icalv000
he probado lo que me comentastes pero nada, sigue dandome el mismo error.
un saludo.
Hola icalv000
la conexion si exite, ademas he comentado solo estas dos lineas y me muestra los datos de la consulta, por lo que entiendo que la conexión si la abre, pero no la puede cerrar.
Un Saludo.
Hola icalv000.
Este error esta siendo duro de roer...
he colocado un try/catch como me has indicado en la primera consulta:
try {
Driver Drivereje_proc_almacenado = (Driver)Class.forName(MM_FujTopImp_USD_DRIVER).newInstance();
Connection Conneje_proc_almacenado = DriverManager.getConnection(MM_FujTopImp_USD_STRING,MM_FujTopImp_USD_USERNAME,MM_FujTopImp_USD_PASSWORD);
CallableStatement eje_proc_almacenado = Conneje_proc_almacenado.prepareCall("{?= call dbo.NumInc_Imp_By_Ubicacion(?,?)}");
Object eje_proc_almacenado_data;
eje_proc_almacenado.registerOutParameter(1,Types.LONGVARCHAR);
eje_proc_almacenado.setString(2,eje_proc_almacenado__Fini);
eje_proc_almacenado.setString(3,eje_proc_almacenado__Ffinal);
eje_proc_almacenado.execute();
Conneje_proc_almacenado.close();
}
catch (SQLException errores){
MsgLog.write(Flog,"Error del Catch: "+errores.getMessage()+" error nº: "+errores.getErrorCode()+" state: "+errores.getSQLState());
}
y he comprobado tambien que recibe los parametros. la parte del fichero log que tengo cuando se genera el error es el siguiente:
01/07/2003 11:19:14 Inicio ejecucuion JSP.
01/07/2003 11:19:14 Fini: 946681200 Ffinal: 978303600
01/07/2003 11:19:15 Error del Catch: General error error nº: 0 state: S1000
Un SAludo.
hola icalv000
he puesto trazas a tutiplen... y me dado cuenta que me da los errores en las lineas donde se cierran las conexiones a base de datos, es decir, en las lineas:
...
Conneje_proc_almacenado.close();
...
Recordset1.close();
StatementRecordset1.close();
ConnRecordset1.close();
NO es un poco raro que me de el error al cerrar???
Según el stack trace q me has pasado veo que el problema es a la hora de cerrar la conexión. Seguramente es que la conexión NO se te ha abierto... Prueba lo siguiente: pon entre un try/catch las zonas de código donde cierres conexiones y statements y captura la excepción .
¿Esta página recibe parámetros?
Salu2,
N.
Pon trazas para saber el valor de :
MM_FujTopImp_USD_DRIVER
MM_FujTopImp_USD_STRING
MM_FujTopImp_USD_USERNAME
MM_FujTopImp_USD_PASSWORD
Ponlas justo antes del try y dime los valores...
Salu2,
N.
hola icalv000
probare a paserle los parametros por la url, pero los parametros los pasa correctamente, mira uno de los trozos de traza que te he enviado y veras que Fini y Ffinal contienen un valor, es por que ha recogido los parametros de top.html y los ha covertido la fecha a segundos.
Un saludo.
hola icalv000
desdel el servlet lo llamo desde un link
<a href="http://10.234.23.24/topfujitsu/top.html">Top Impresoras</a>
Realmente el servlet no llama al jsp sino a una pagina html que tiene un formularo que le pasa por post los parametros.
Un Saludo.
Parece ser q la conexión no se abre... ¿en la máquina donde se abre existe esa conexión?
Salu2,
N.
hola icalv000
cuando digo que el jsp funciona correctamente es cuando lo llamo a parte, es decir, es por que en el navegador entro por top.html(el que tiene el formulario y envia la información del formulario al top.jsp), pero cuando llamo al top.html desde el servlet es cuando no funciona el top.jsp.
pd: para mi ya es personal, ...
Estoy completamente desorientado!
Por un lado la JSP te funciona si la llamas a parte... pero si la llamas desde el formulario pasando los parámetros No te funciona.
Por otro lado lo q no te funciona cuando la JSP es llamada desde el formulario es el cierre de las conexiones, ya que si comentas estas líneas la página te carga...
¿Me dejo algo?
Salu2,
N.
(Pd. Se está convirtiendo en algo personal!)
Tienes razón...
Sa prueba no tiene fundamento.
Cuando dices q los legacy servlets son capaces de ejecutar jsp's en otras aplicaciones, ¿q significa ex´ctamente? ¿Tú lo estás mandando contra la misma aplicaión?
Salu2,
N.
¿Cómo llamas a la jsp desde el legacy servlet?
Salu2,
N.
Estamos cerca...
Prueba con esto:
pon una traza del estilo System.out.prinln("Traza 1");
Después de cada línea...
Es decir:
try{
System.out.prinln("Traza 1");
Driver...
System.out.prinln("Traza 2");
Y sucesivamente...
Dime q pasa...
Salu2,
N.
En la excepción aparece una java.sql.SQLException... y me extraña un poco!
¿Puedes pasarme los ficheros para revisarlos?
¿Qué es un legaci servlet?
Salu2,
N.
hola icalv000
de la conexión de la base de datos, ya que si lo ejecuto independientemente del servlet y me funciona correctamente.
los "legaci servlet" son un poco antiguos y son servlet en los que se pueden ejecutar desde cualquier aplicación web.
un Saludo.
¿Puedes pasarme los ficheros fuente?
Salu2,
N.
<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="java.util.*" %>
<%@ page import="java.lang.*" %>
<%@ page import="helperClasses.*" %>
<%@ include file="Connections/conex.jsp" %>
<%
String Flog = "C:\\logs\\topfujitsu.trz";
String lTitulo="";
String[] meses = new String[12];
meses[0] = "Enero";
meses[1] = "Febrero";
meses[2] = "Marzo";
meses[3] = "Abril";
meses[4] = "Mayo";
meses[5] = "Junio";
meses[6] = "Julio";
meses[7] = "Agosto";
meses[8] = "Septiembre";
meses[9] = "Octubre";
meses[10] = "Noviembre";
meses[11] = "Diciembre";
String tipo = (String)request.getParameter("radioAnual_Mensual");
java.util.Date fecha = new java.util.Date();
java.util.Date fi=null;
java.util.Date ff=null;
// Calcula el año actual
String f = new String(fecha.toString());
String ano = f.substring(f.length()-4);
String eje_proc_almacenado__Fini = "0";
String eje_proc_almacenado__Ffinal = "0";
MsgLog.write(Flog,"Inicio ejecucuion JSP.");
if (tipo.equalsIgnoreCase("Anual"))
{
lTitulo="Año "+request.getParameter("anno");
//Calculamos los segundos para realizar la consulta
fi=new java.util.Date(Integer.parseInt(request.getParameter("anno"))-1900,0,1,0,0,0);
ff=new java.util.Date(Integer.parseInt(request.getParameter("anno"))-1900+1,0,1,0,0,0);
}
else
{
fi=new java.util.Date(Integer.parseInt(ano)-1900,Integer.parseInt(request.getParameter("mes"))-1,1,2,0,0);
MsgLog.write(Flog,request.getParameter("mes"));
if (request.getParameter("mes").equalsIgnoreCase("12"))
{
ff=new java.util.Date(Integer.parseInt(ano)-1900+1,0,1,0,0,0);
}
else
{
ff=new java.util.Date(Integer.parseInt(ano)-1900,Integer.parseInt(request.getParameter("mes")),1,0,0,0);
}
lTitulo=meses[Integer.parseInt(request.getParameter("mes"))-1]+" "+ano;
}
/*String Linea = "Valores de la consulta: "+Tipo;
Linea = Linea+" "+(Fi.getTime()/1000)+" "+(Ff.getTime()/1000)+" "+Fi.getTimezoneOffset()+" "+"hola"+request.getParameter("mes"); */
%>
<%
//Linea = Linea+" "+eje_proc_almacenado__Fini+"|"+eje_proc_almacenado__Ffinal;
eje_proc_almacenado__Fini = ""+fi.getTime()/1000+"";
eje_proc_almacenado__Ffinal = ""+ff.getTime()/1000+"";
%>
<%
Driver Drivereje_proc_almacenado = (Driver)Class.forName(MM_FujTopImp_USD_DRIVER).newInstance();
Connection Conneje_proc_almacenado = DriverManager.getConnection(MM_FujTopImp_USD_STRING,MM_FujTopImp_USD_USERNAME,MM_FujTopImp_USD_PASSWORD);
CallableStatement eje_proc_almacenado = Conneje_proc_almacenado.prepareCall("{?= call dbo.NumInc_Imp_By_Ubicacion(?,?)}");
Object eje_proc_almacenado_data;
eje_proc_almacenado.registerOutParameter(1,Types.LONGVARCHAR);
eje_proc_almacenado.setString(2,eje_proc_almacenado__Fini);
eje_proc_almacenado.setString(3,eje_proc_almacenado__Ffinal);
eje_proc_almacenado.execute();
Conneje_proc_almacenado.close();
%>
<%
Driver DriverRecordset1 = (Driver)Class.forName(MM_FujTopImp_USD_DRIVER).newInstance();
Connection ConnRecordset1 = DriverManager.getConnection(MM_FujTopImp_USD_STRING,MM_FujTopImp_USD_USERNAME,MM_FujTopImp_USD_PASSWORD);
PreparedStatement StatementRecordset1 = ConnRecordset1.prepareStatement("SELECT * FROM AHD.Top10ImpreFujitsu");
ResultSet Recordset1 = StatementRecordset1.executeQuery();
boolean Recordset1_isEmpty = !Recordset1.next();
boolean Recordset1_hasData = !Recordset1_isEmpty;
Object Recordset1_data;
int Recordset1_numRows = 0;
%>
<%
int Repeat1__numRows = -1;
int Repeat1__index = 0;
Recordset1_numRows += Repeat1__numRows;
%>
<html>
<head>
<title>Top Impresoras</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
h1 {
font-family: Verdana, Arial, Helvetica, sans-serif;
}
.Titulo {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 14px;
font-style: italic;
font-weight: bold;
}
.detailro
{
/* background-color: #000060;*/
background-color: #AAAAAA;
/* color: #CED7E7; */
color: white;
font-family: arial, helvetica, sans-serif;
font-size: 10pt;
font-weight: bold;
padding: 2px 2px 2px 4px;
}
.resultado
{
FONT: 9pt Arial, Helvetica, sans-serif
}
.boton {
background: #008348;
color: white;
font-family: Verdana, arial, helvetica, sans-serif;
font-size: 9pt;
font-weight: bold;
}
-->
</style>
</head>
<TABLE cellSpacing=0 width="100%" border=0>
<TBODY>
<TR>
<TD bgColor=#008348 colSpan=2 height=62><strong></strong><IMG src="imagenes/consejeria.gif" width="290" height="60"></TD>
<TD bgColor=#008348>
<DIV align=right></DIV>
<DIV align=right></DIV></TD>
<TD bgColor=#008348>
<DIV align=right><IMG src="imagenes/cab_ceges.gif" width="375" height="54"></DIV></TD></TR>
<TR>
<TD height=21> </TD>
<TD> </TD>
<TD>
<DIV align=right></DIV></TD>
<TD width=377>
<DIV align=right></DIV></TD></TR></TBODY>
</TABLE>
<h1 align="center">Top 10 de Impresoras</h1>
<h3 align="center"><%=lTitulo %></h3>
<div align="center">
<table width="47%" border="0">
<tr class="detailro">
<td width="70%" align="center" nowrap>Centro de Salud</td>
<td width="30%" align="center" nowrap>Indice de Criticidad </td>
</tr>
<% while ((Recordset1_hasData)&&(Repeat1__numRows-- != 0)) { %>
<tr class="resultado">
<td nowrap><%=(((Recordset1_data = Recordset1.getObject("l_name"))==null || Recordset1.wasNull())?"":Recordset1_data)%> (<%=(((Recordset1_data = Recordset1.getObject("si_name"))==null || Recordset1.wasNull())?"":Recordset1_data)%>)</td>
<td align="center" nowrap><%=(((Recordset1_data = Recordset1.getString("Ratio"))==null || Recordset1.wasNull())?"":Recordset1_data)%></td>
</tr>
<%
Repeat1__index++;
Recordset1_hasData = Recordset1.next();
}
%>
</table>
</div>
<p align="center">
<input type="submit" name="Submit" value="Volver" class="boton" onClick="javascript:history.back();">
</p>
</body>
</html>
<%
Recordset1.close();
StatementRecordset1.close();
ConnRecordset1.close();
%>
Este es el codigo de la pagina jsp.
un Saludo.
Me da la impresión que el inlude <%@ include file="Connections/conex.jsp" %> no te lo hace correctamente... ¿Puedes probar de no hacer el include y añadir el código en la jsp directamente? La idea sería que vuelvas a probar otra vez lo mismo pero elimina el include <%@ include file="Connections/conex.jsp" %> y pongas el código de conex.jsp dentro de la JSP q me has pasado.
Dime algo,
salu2,
N.
hola icalv000
lo que voy a hacer es intetarlo con un pool de conexiones a ver si asi lo soluciono, yo es que estoy empezando con jsp y java, y mis conocimientos no son muy buenos, soy mas de microsoft vb y asp pero hay que saber de todo no???...
Muchisimas Gracias por todos.
Una cosa más...
Deberías encapsular toda la lógica que puedas fuera de la JSP... Tal y como lo estás haciendo te será muy difícil de mantener!
Lo del pool de conexiones... es posible q te valga... pero me da la impresión que si es un tema de configuración tampoco te funcionará.
Nada más
Suerte y hablamos.
Salu2,
N.
Ayer estuve mirando la doc de Nestscape para saber q eran los legacy servlets... Sinceramente, NO VEO EL PROBLEMA...
No sé q puede ser... empiezo a pensar q no es un problema de código si no que es un problema de configuración del entorno... Sólo me queda pasarme por tu oficina y ponernos los dos ;-) Siento no poder ayudarte pero desde aquí y con este sistema no se me ocurre nada más...
Siento no poder ayudarte mejor
Salu2
N.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas