JSP, contexto

Estoy haciendo una aplicación dinámica MVC (sin usar struts)
Estoy usando:
- Tomcat 4.1
- MySQL Server 5.0
- J2SDK 1.4.2
- Controlador JDBC -> mysql-connector-java-3.1.13-bin.jar
Intento logarme en la página LoginForm.jsp, no pasa los parámetros a la página ValidateLogin.jsp, para ver si instanciaba un DataSource intenté en la misma página acceder a la BBDD y meter una serie de parámetros en la tabla USER y no lo hacía.
Página LoginForm.jsp:
<%
try{
STPViewDB stpview = (STPViewDB) application.getAttribute("BaseDatos");
User user = new User();
Stpview. AddUser(stpview. Getconnection(), "123", "Ernest", "Gonz", "er", "ertyuio", "hkjhk@jkbk", "65754645", "M");
}
catch(Exception e){
e.getMessage();
}
%>
- El archivo de configuración stpview.xml:
<?xml version="1.0" encoding="iso-8859-1"?>
<Context path="/stpview" docBase="stpview"
debug="0" reloadable="false" crossContext="true">
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="stpview_log." suffix=".log" timestamp="true"/>
<Resource name="jdbc/stpview" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/stpview">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost:3306/stpview?autoReconnect=true</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
..............................
- web.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>STPView Web Application</display-name>
<description>
Aplicación Web para controlar la carga de los enlaces de señalización de los STPs.
</description>
<listener>
<listener-class>stpview.ContextListener</listener-class>
</listener>
<!-- Establish the default list of welcome files -->
<welcome-file-list>
<welcome-file>LoginForm.jsp</welcome-file>
</welcome-file-list>
</web-app>

1 Respuesta

Respuesta
1
¿Y quién pone "BaseDatos" en el contexto de la aplicación?
Para acceder a un Datasource se suele hacer así :
InitialContext ic2 = new InitialContext();
DataSource ds = (DataSource) ic2.lookup("jdbc/stpview");
...
Connection conn = ds.getConnection();
Quizás el problema lo tienes al hacer esta recuperación y al guardarlo en el en contexto de la aplicación
Creo que me falta información.
Tengo una clase servlet que quiero que actúe como controlador de la aplciación:
public final class ContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
try {
STPViewDB STPViewDB = new STPViewDB();
servletContext.setAttribute("BaseDatos", STPViewDB);
}catch(Exception e) {
servletContext.log ("No se pudo crear el atributo BaseDatos: " + e.getMessage());
}
}
public void contextDestroyed(ServletContextEvent servletContextEvent) { ServletContext servletContext = servletContextEvent.getServletContext();
STPViewDB STPViewDB = (STPViewDB) servletContext.getAttribute("BaseDatos");
STPViewDB.close();
servletContext.removeAttribute("BaseDatos");
}
}
Hay una clase STPViewDB que identifica la base de datos, definida como:
public STPViewDB() throws Exception{
try{
InitialContext initialcontext = new InitialContext();
Context envcontext =(Context) initialcontext.lookup("java:comp/env");
DataSource datasource =(DataSource) envcontext.lookup("jdbc/stpview");
this.connection = datasource.getConnection();
}catch(Exception e){
throw new Exception("No se puede abrir la base de datos: " + e.getMessage());
}
}
public synchronized Connection getconnection(){
while(this.connectionfree == false){
try{
wait();
}catch(InterruptedException e){
}
}
this.connectionfree = false;
notify();
return this.connection;
}
protected synchronized void releaseconnection(){
while(this.connectionfree == true){
try{
wait();
}catch(InterruptedException e){
}
}
this.connectionfree = true;
notify();
}
¿Pero qué excepción te produce?
Bueno, primero, haciendo eso solo estas permitiendo una conexión para toda la aplicación con lo que limitas mucho el numero de usuarios que pueden acceder a ella.
Otra cosa ¿qué version de tomcat usas? Si usas la version 5.5 no puedes usar ResourceParams, usa atributos directamente :
<Resource
name="jdbc/base"
ype="javax.sql.DataSource"
password="password"
driverClassName="com.mysql.jdbc.Driver"
maxIdle="5"
maxWait="5000"
validationQuery="SELECT COUNT(*) FROM tabla"
username="user"
url="jdbc:mysql://localhost/bd"
maxActive="10"
removeAbandoned="true"
emoveAbandonedTimeout="60"
logAbandoned="true"
/>
quizás sea ese el porque no puedes hacer conexiones.
para probar si tienes configurado bien el datasource sigue el ejemplo de :
http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html
recuerda que para probar las taglib de jslt debes descargarlas de :
http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html
He probado el ejemplo para Tomcat 4.1:
http://tomcat.apache.org/tomcat-4.1-doc/jndi-datasource-examples-howto.html
Y el resultado es el siguiente:
Results
Foo Not Connected
Bar -1
Estoy algo perdido, ¿Qué significado tiene este resultado? ¿Cómo lo ves?
Gracias
Está claro, no se conecta a la base de datos :P
Observa esta parte :
DataSource ds = (DataSource)ctx.lookup(
"java:comp/env/jdbc/TestDB");
if (ds != null) {
// Aqui supongo que llega.
// pero puedes probar con:
// foo = foo + " DS";
// o el clasico:
// System.out.print ("DS NO NULO");
// Es este punto donde recupera la conexion.
Connection conn = ds.getConnection();
if(conn != null) {
// Aqui nunca entra
foo = "Got Connection "+conn.toString();
Statement stmt = conn.createStatement();
ResultSet rst =
stmt.executeQuery(
"select id, foo, bar from testdata");
if(rst.next()) {
foo=rst.getString(2);
bar=rst.getInt(3);
}
conn.close();
}
Si el DS es nulo es que el método "lookup" no encuentra la configuración. Revisa el nombre del context.
Si el DS no es nulo pero la conexión si, revisa la url de conexión a la base de datos, el usuario y la contraseña...
Perla, siento ser tan pesado, pero no veo ningún tipo de fallo. La aplicación salta a la rutina de excepción en:
DataSource ds = (DataSource)ctx.lookup(
"java:comp/env/jdbc/TestDB");
Es decir: Si el DS es nulo es que el método "lookup" no encuentra la configuración. Revisa el nombre del context.
Pero he revisado la conf y es correcta:
- En el fichero server.xml
<Context path="/DBTest" docBase="DBTest".....
<Resource name="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/TestDB">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
- En el fichero web.xml:
web-app>
<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
Se me debe escapar algo, de a lo mejor versiones, o la necesidad de algún tipo más de SW. Estoy usando:
- Tomcat 4.1
- MySQL Server 5.0
- J2SDK 1.4.2
- Controlador JDBC -> mysql-connector-java-3.1.13-bin.jar
¿No se que puede pasar? Me estoy volviendo loco!
Lo de acceder sólo un user a la base de datos entiendo que lo dices por lo de synchronized, ¿no?
Estoy usando Tomcat 4.1
Lo he probado como viene en el ejemplo y no funciona sale el siguiente error:
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: This absolute uri (http://java.sun.com/jsp/jstl/sql) cannot be resolved in either web.xml or the jar files deployed with this application
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:105)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:430)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:154)
at org.apache.jasper.compiler.TagLibraryInfoImpl.(TagLibraryInfoImpl.java:159)
at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:354)
at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:381)
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:795)
at org.apache.jasper.compiler.Parser.parse(Parser.java:122)
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:199)
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:153)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:227)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:369)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:473)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:190)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2417)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:193)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:781)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:549)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:589)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:666)
at java.lang.Thread.run(Thread.java:534)
Gracias
Este error es porque te falta el JAR de las tag de JSTL.
Toda la información aquí :
http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html
Pero los Jar desde aqui :
http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi
Descárgalo y ponlo en WEB-INF/lib
Bueno, eso es para ir conociendo los TAG de JSLT que son muy prácticos.
Pero si quieres probar si tienes bien configurado el DataSource define el contexto con el XML y pon en cualquier sitio (en un JSP mismo) :
Context envcontext =(Context) initialcontext.lookup("java:comp/env");
DataSource datasource =(DataSource) envcontext.lookup("jdbc/stpview");
connection = datasource.getConnection();
Y si no da un error es otro problema.
Te recomiendo que uses el DEBUG de eclipse con las web-tools para localizar el problema.
He probado el ejemplo para Tomcat 4.1:
http://tomcat.apache.org/tomcat-4.1-doc/jndi-datasource-examples-howto.html
Y el resultado es el siguiente:
Results
Foo Not Connected
Bar -1
Estoy algo perdido, ¿Cómo lo ves?
Gracias
Perdona que no haya podido contestarte antes. Revisa tu aplicación. Es posible que estés escribiendo en mayúsculas cuando es minúsculas.
Si tu aplicación se llama DBTest (MAY) y accedes a la url con DBTest, ok, pero por si acaso, ponlo todo en minúsculas:
Dbtest
Los que venimos de Windows no nos damos cuenta de esas cosas.
Hola Perla,
Ya he encontrado el problema. Había que ubicar en la carpeta: <CATALINA_HOME>/common/lib/
Los ficheros:
commons-dbcp.jar
commons-pool.jar
Y ha funcionado sin problemas!
Te adjunto link:
http://www.developer.com/java/data/print.php/10932_2172891_3
Muchas gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas