Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Error java.lang.NullPointerException al redireccionar con Servlet

Estas en el tema de Error java.lang.NullPointerException al redireccionar con Servlet en el foro de Java en Foros del Web. Buenas a todos, el caso es que estoy haciendo un mini-proyecto para clase, y me he quedado atascado en una parte que creo que esta ...
  #1 (permalink)  
Antiguo 16/05/2015, 03:31
 
Fecha de Ingreso: mayo-2015
Mensajes: 7
Antigüedad: 9 años
Puntos: 0
Pregunta Error java.lang.NullPointerException al redireccionar con Servlet

Buenas a todos, el caso es que estoy haciendo un mini-proyecto para clase, y me he quedado atascado en una parte que creo que esta bien, pero me sigue dando fallo sin motivo aparente (la excepción es java.lang.nullpointerexception ).

El caso es, estoy haciendo una especie de biblioteca, donde se pueden reservar y prestar libros, bueno, tengo un JSP llamado libros.jsp (el cual está dentro de WEB-INF), en esta página JSP se muestran los libros en una tabla, luego dentro de cada fila hay un radio button, si señalamos uno y pulsamos sobre un submit que hay, debería volver a recargarse la misma página, pero con otra tabla debajo de la primera donde muestra los ejemplares de ese libro.

Código de libros.jsp

Código:
<%@page import="Clases.MetodosBD"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>

<sql:setDataSource var="consulta" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/biblioteca" user="root"  password=""/>

<c:if test="${usuario==null || usuario==''}">
    <% response.sendRedirect("index.jsp");%>
</c:if>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <c:set var="i" value="${sessionScope['javax.servlet.jsp.jstl.fmt.locale.session']}"></c:set>
        <fmt:setBundle basename="Bundle.etiquetas"/>
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Libros de la biblioteca</h1>
        <c:if test="${usuario!=null && usuario!=''}">
            <% if (request.getParameter("id") == null) {
            %>
            <sql:query dataSource="${consulta}" var="result">
                SELECT * FROM libros;
            </sql:query>
            <form action="Redirect">
                <table border="1">
                    <tr>
                        <th><fmt:message key="id"/></th>
                        <th><fmt:message key="titulo"/></th>
                        <th><fmt:message key="autor"/></th>
                        <th><fmt:message key="reservar"/></th>
                        <th><input type="submit" value="Ejemplares"></th>
                    </tr>
                    <c:forEach var="row" items="${result.rows}">
                        <tr>
                            <td><c:out value="${row.id}"/></td>
                            <td><c:out value="${row.titulo}"/></td>
                            <td><c:out value="${row.autor}"/></td>
                            <td>Reservar</td>
                            <td><input type='radio' name="idlibro" value="${row.id}"/> </td>
                        </tr>
                    </c:forEach>
                </table>
            </form>
            <% } else {
            %>
            <sql:query dataSource="${consulta}" var="result">
                SELECT * FROM libros;
            </sql:query>
            <table border="1">
                <tr>
                    <th><fmt:message key="id"/></th>
                    <th><fmt:message key="titulo"/></th>
                    <th><fmt:message key="autor"/></th>
                    <th><fmt:message key="reservar"/></th>
                    <th><input type="submit" value="Ejemplares"></th>
                </tr>
                <c:forEach var="row" items="${result.rows}">
                    <tr>
                        <td><c:out value="${row.id}"/></td>
                        <td><c:out value="${row.titulo}"/></td>
                        <td><c:out value="${row.autor}"/></td>
                        <td>Reservar</td>
                        <td><input type='radio' name="idlibro" value="${row.id}"/> </td>
                    </tr>
                </c:forEach>
            </table><br>
            <h1> Ejemplares de:</h1>
            <sql:query dataSource="${consulta}" var="result">
                SELECT * FROM ejemplares where idLibro=<% request.getParameter("id"); %>;
            </sql:query>
            <c:out value=" SELECT * FROM ejemplares where idLibro=<% request.getParameter('id'); %>;"/>
            <table border="1">
                <tr>
                    <th><fmt:message key="idLibro"/></th>
                    <th><fmt:message key="idEjemplar"/></th>
                    <th><fmt:message key="edicion"/></th>
                    <th><fmt:message key="Disponible"/></th>
                </tr>
                <tr>
                    <td><c:out value="${row.idLibro}"/></td>
                    <td><c:out value="${row.idEjemplar}"/></td>
                    <td><c:out value="${row.edicion}"/></td>
                    <td>Disponible/No disponible</td>
                </tr>
            </table>

            <% }%>
        </c:if>
        <a href="index.jsp">Volver</a>
    </body>
</html>
El fallo da cuando debería aparecer la segunda tabla de los ejemplares después de hacer el submit

Dejo el código del Servlet que me redirecciona (redirect.java), solo he puesto el código relevante, lo demas es creado automáticamente por netbeans:

Código:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        HttpSession session = request.getSession();
        synchronized (session) {
            String hidden = request.getParameter("hid");
            String hiddenId = request.getParameter("id");
            //String hiddenTi = request.getParameter("ti");
            String address="";
            if (hidden.equals("pres")) {
                address = "WEB-INF/resultados/prestamos.jsp";
            }else if (hidden.equals("lib")) {
                address = "WEB-INF/resultados/libros.jsp";
            }else if(hidden.equals("cr")){
                address = "WEB-INF/resultados/closesession.jsp";
            }
            
            if (hiddenId!=null) {
                 address = "WEB-INF/resultados/libros.jsp";
                 request.setAttribute("id", hiddenId);
                 //request.setAttribute("Ti", hiddenTi);
            }
            RequestDispatcher dispatcher = request.getRequestDispatcher(address);
            dispatcher.forward(request, response);
        }
    }
Un saludo y gracias

EDIT: Olvidé las líneas del error:

Cita:
java.lang.NullPointerException
at Servlet.Redirect.processRequest(Redirect.java:43)
at Servlet.Redirect.doGet(Redirect.java:73)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:790)
at org.apache.catalina.core.StandardWrapper.service(S tandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(S tandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipel ine.java:99)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doServ ice(CoyoteAdapter.java:415)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:282)
at com.sun.enterprise.v3.services.impl.ContainerMappe r$HttpHandlerCallable.call(ContainerMapper.java:45 9)
at com.sun.enterprise.v3.services.impl.ContainerMappe r.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runS ervice(HttpHandler.java:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHa ndle(HttpHandler.java:175)
at org.glassfish.grizzly.http.server.HttpServerFilter .handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver $9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterCha in.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterCha in.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterCha in.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterCha in.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(Pr ocessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTranspor t.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrateg y.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStr ategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStr ategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStr ategy$WorkerThreadRunnable.run(WorkerThreadIOStrat egy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPoo l$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPoo l$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:745)

Última edición por antoniower; 16/05/2015 a las 03:38
  #2 (permalink)  
Antiguo 16/05/2015, 06:31
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Error java.lang.NullPointerException al redireccionar con Servlet

Para mí es un error meter las jsp dentro de WEB-INF, y también hacer la conexión a la BBDD desde la JSP. Una JSP debería únicamente presentar los datos

No sé cuál es la línea 43

Cita:
at Servlet.Redirect.processRequest(Redirect.java:43)
pero me imagino que es esta

Cita:
dispatcher.forward(request, response);
y el problema vendría porque no es capaz de encontrar la jsp

http://stackoverflow.com/questions/2...web-inf-folder

Prueba añadiéndole / antes del WEB-INF
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 16/05/2015, 07:39
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Error java.lang.NullPointerException al redireccionar con Servlet

Buenas,

Meter las JSP dentro del WEB-INF es correcto y es muy útil cuando no queremos que se pueda acceder a éstas directamente.

Por otro lado, estoy de acuerdo con la solución que propone Xerelo. Habría que añadir el / en la ruta antes del WEB-INF.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #4 (permalink)  
Antiguo 16/05/2015, 09:19
 
Fecha de Ingreso: mayo-2015
Mensajes: 7
Antigüedad: 9 años
Puntos: 0
Respuesta: Error java.lang.NullPointerException al redireccionar con Servlet

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Buenas,

Meter las JSP dentro del WEB-INF es correcto y es muy útil cuando no queremos que se pueda acceder a éstas directamente.

Por otro lado, estoy de acuerdo con la solución que propone Xerelo. Habría que añadir el / en la ruta antes del WEB-INF.

Un saludo
No, añadir / a la ruta no ha solucionado el fallo, igualmente si debería encontrarlo, si no sería error 404

EDIT:

Buenas y malas noticias, la buena, he creado otro servlet (Redirect2.java):

Código:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        HttpSession session = request.getSession();
        synchronized (session) {
            String address = "";
            String hiddenId = request.getParameter("idLibro");

            address = "WEB-INF/resultados/libros.jsp";
            request.setAttribute("clave", hiddenId);

            RequestDispatcher dispatcher = request.getRequestDispatcher(address);
            dispatcher.forward(request, response);
        }
    }
Usando este si me funciona, pero el problema ahora es que no recoge la clave que le paso con el request.setAttribute... Y por lo tanto da fallo de sql porque intenta igualar algo a nada...

Los he intentado recoger con request.getParameter y con request.getAttribute pero ninguno ha funcionado, aparece esto en la url cuando da fallo:

Cita:
http://localhost:8080/biblioteca_jsp/Redirect2?idLibro=1
Al menos ahora se que ha llegado al servlet y ha vuelto porque ha intentado hacer la consulta sql

Última edición por antoniower; 16/05/2015 a las 10:12
  #5 (permalink)  
Antiguo 17/05/2015, 00:58
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Error java.lang.NullPointerException al redireccionar con Servlet

Cita:
No, añadir / a la ruta no ha solucionado el fallo
No soluciona el fallo del nullpointer, pero es uno de los múltiples fallos en ese código.

Cita:
java.lang.NullPointerException
at Servlet.Redirect.processRequest(Redirect.java:43)
Te está indicando claramente que tienes un NullpointerException en la línea 43 de tu clase Redirect.
Como ya te preguntaba Xerelo. ¿Cual es la línea 43? ¿Porqué no has depurado?

Yo supongo que es porque uno de los parámetros (hidden) que recibes está a null (quizás porque estás enviando por parámetros por GET y solo los estás procesando en el Servlet en el doPost?). Como no haces ningún tipo de chequeo entonces estás condenado a tener errores de ejecución como este.

Para evitar los nullpointers en los equals bastaría que inviertas la condición y en lugar de
Código Java:
Ver original
  1. if (hidden.equals("pres")) {
Pongas
Código Java:
Ver original
  1. if ("pres".equals(hidden)) {

Por otro lado tu código tiene muchas inconsistencias:
-Si hiddenId no es nulo siempre vas a redirigir a libros.jsp, por lo que lo que contenga hidden es indiferente y vas a machacar el valor ya asignado a address.
-Si hiddenId es nulo y hidden contiene un valor diferente de "pres", "lib" o "cr" va a redirigir a "" y vas a tener un error incontrolado. Habría que dirigir en ese caso quizás a una página de error que trace el problema.

Por útimo, ojo a las nomenclaturas. Los paquetes deben nombrarse siempre en minúsculas:
http://www.oracle.com/technetwork/ja...ons-150003.pdf


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #6 (permalink)  
Antiguo 17/05/2015, 03:02
 
Fecha de Ingreso: mayo-2015
Mensajes: 7
Antigüedad: 9 años
Puntos: 0
Respuesta: Error java.lang.NullPointerException al redireccionar con Servlet

Cita:
Iniciado por Profesor_Falken Ver Mensaje
No soluciona el fallo del nullpointer, pero es uno de los múltiples fallos en ese código.



Te está indicando claramente que tienes un NullpointerException en la línea 43 de tu clase Redirect.
Como ya te preguntaba Xerelo. ¿Cual es la línea 43? ¿Porqué no has depurado?

Yo supongo que es porque uno de los parámetros (hidden) que recibes está a null (quizás porque estás enviando por parámetros por GET y solo los estás procesando en el Servlet en el doPost?). Como no haces ningún tipo de chequeo entonces estás condenado a tener errores de ejecución como este.

Para evitar los nullpointers en los equals bastaría que inviertas la condición y en lugar de
Código Java:
Ver original
  1. if (hidden.equals("pres")) {
Pongas
Código Java:
Ver original
  1. if ("pres".equals(hidden)) {

Por otro lado tu código tiene muchas inconsistencias:
-Si hiddenId no es nulo siempre vas a redirigir a libros.jsp, por lo que lo que contenga hidden es indiferente y vas a machacar el valor ya asignado a address.
-Si hiddenId es nulo y hidden contiene un valor diferente de "pres", "lib" o "cr" va a redirigir a "" y vas a tener un error incontrolado. Habría que dirigir en ese caso quizás a una página de error que trace el problema.

Por útimo, ojo a las nomenclaturas. Los paquetes deben nombrarse siempre en minúsculas:
[url]http://www.oracle.com/technetwork/java/codeconventions-150003.pdf[/url]


Un saludo
Bueno, he revisado todo lo que me has comentado y lo he puesto correctamente, no sabía que el no poner / delante podía ocasionar fallos (no me había pasado)

No vi la pregunta de cual era la línea 43, esa es la primera línea donde empiezan los if, he realizado el cambio en los if como has comentado para comparar el string con la variable y no al revés.

Respecto a lo de hiddenId, si, si hiddenId no es nulo siempre va a ir a libros.jsp, es lo que quiero que haga, ya que si hiddenId no es nulo significa que hidden no existe y no machaca ningún dato porque hidden tendría valor nulo (hidden solo tiene valor cuando accedo a algo del menú principal).

(Supongo que ya os habéis dado cuenta, pero uso el mismo servlet Redirect.java para redireccionar a distintos sitios, quiero decir, lo uso en el menú principal y también en libros.jsp)

Hidden no puede tener un valor distinto de pres, lib o cr, ya que son los únicos datos que se pueden enviar desde el menú (uno para cada opción), y no se pueden modificar porque estoy usando post para enviar el form, y no se ve en la url ningún parametro.


Ahora que creo que esta un poco mas claro, el error de ahora es de sql

Cita:
javax.servlet.ServletException:
SELECT * FROM ejemplares where idLibro=;
: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
El problema viene porque no consigo hacer que recoja el parámetro que se supone estoy enviando en el servlet, de ahí que falle al hacer la consulta.

Código:
if (hiddenId!=null) {
                 address = "/WEB-INF/resultados/libros.jsp";
                 request.setAttribute("clave", hiddenId);
                 
            }
Ahí, donde se vuelve a redireccionar a libros.jsp, al hacer después el dispatcher.forward se supone que debe enviar el attribute que se esta estableciendo en esas líneas, pero por algún motivo aparece sin nada.

No es un valor nulo al parecer, ya que si fuera nulo no intentaría hacer la consulta (la parte de la consulta está en el ELSE del if que comprueba que "clave " sea nulo, si es nulo es que no he intentado ver los ejemplares de un libro).


Este mismo mini-proyecto lo hice primero en php, y ni punto de comparación con la facilidad que lo hice en php.

Gracias por contestar, a ver si consigo salir del problema
  #7 (permalink)  
Antiguo 17/05/2015, 04:15
 
Fecha de Ingreso: mayo-2015
Mensajes: 7
Antigüedad: 9 años
Puntos: 0
Respuesta: Error java.lang.NullPointerException al redireccionar con Servlet

Solucionado, por fin, al recoger el dato en el jsp, al final decidí probar a quitar el código del request y reemplazarlo con jstl, bastó con poner ${clave}, y ya funcionó a la perfección.

Este tipo de fallos me hierven la sangre jeje

Un saludo y gracias a los que contestaron, me han quedado claras unas cuantas cosas con vuestras explicaciones

EDIT: Cualquier problema que no consiga resolver, les volveré a preguntar
  #8 (permalink)  
Antiguo 17/05/2015, 09:37
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Error java.lang.NullPointerException al redireccionar con Servlet

Cita:
Este mismo mini-proyecto lo hice primero en php, y ni punto de comparación con la facilidad que lo hice en php.
Cierto. Por desgracia en Java la curva de aprendizaje es mucho más elevada.

Quizás te resultaria más similar a PHP si haces uso sólo de páginas JSP. Es posible trabajar con ellas mediante scriptlets y expression language de forma muy similar a PHP.


Un saludo
__________________
If to err is human, then programmers are the most human of us

Etiquetas: clase, jsp, netbeans, redireccionar, servlet, sql, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:03.