JSP (Java Server Page) - comunicacion entre servlet

 
Vista:

comunicacion entre servlet

Publicado por nepthis (37 intervenciones) el 10/03/2007 20:33:34
Hola a todos!! Despues de un tiempo sin tener problemas, me han vuelto a surgir algunas dudas que os comento a continuacion. Muchas gracias por adelantado!

Mi idea es aplicar el patron MVC, es decir, pretendo que todos los links lleven a un controlador, que en función de un parámetro redirecciona a una página jsp o a otro servlet. Esto funciona bien. El problema es que, si el controlador delega en un servlet que recoge datos de un formulario, por ejemplo, un formulario para agregar un contacto, este ultimo servlet no puede redirigir la salida al controlador que es el que quiero que finalmente saque la pagina jsp resultado, es decir, el servlet NuevoContacto no puede hacer esto en su metodo doget()

..............................
int insertado = contactos.insertarContacto(contacto);
// Redireccionamos la salida

if (insertado == 1)

{
getServletConfig().getServletContext().getRequestDispatcher("/libreria/ControladorContactos?x=2").forward(request, response);

}
else
...........................................

Porque da el siguiente error

Estado HTTP 405 - El Metodo HTTP POST no es soportado por esta URL

type Informe de estado

mensaje El Metodo HTTP POST no es soportado por esta URL

descripción El método HTTP especificado no está permitido para el recurso requerido (El Metodo HTTP POST no es soportado por esta URL).
Apache Tomcat/5.5.16

Pero si funciona hacer (redireccionar directamente a la pagina jsp sin pasar otra vez por el contralador)

if (insertado == 1)

{
getServletConfig().getServletContext().getRequestDispatcher("/WEB-INF/ContactoInsertado.jsp").forward(request, response);

}

¿por qué pasa esto?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:comunicacion entre servlet

Publicado por Gonzalo (72 intervenciones) el 12/03/2007 08:10:37
Antes de contestar a la pregunta...
¿Cómo tienes definido para que las peticiones vayan a tu controlador?
Y hablas del método doGet() pero supongo que has implementado también doPost(), ¿no? (Me refiero a que ControladorContactos tendrá implementado doPost(), imagino, no?)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:comunicacion entre servlet

Publicado por nepthis (37 intervenciones) el 12/03/2007 18:45:09
Hola Gonzalo!, si, mira, controlador contactos hace sto

public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}


public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
............... (comprobaciones )

String x = request.getParameter("x");
if (x.equals("0"))
getServletConfig().getServletContext().getRequestDispatcher("/WEB-INF/administracion.jsp").forward(request, response);
................................
y así voy redirigiendo las peticines a páginas jsp o a otros servlet.

PROBLEMA:
Redirijo a un Servlet que recoje datos de un formulario, por ejemplo usuario y contraseña. Este servlet hace

public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}

public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{
........comprobaciones

if ( ( nombre.equals(login ) ) & (clave.equals(password ) ) )
{
getServletConfig().getServletContext().getRequestDispatcher("/libreria/controlador?x=12").forward(request, response);

Si hago esto me da el error que comenté antes. pero no porque no esté definido x=12 en el controlador, y si hago lo siguiente si funciona

getServletConfig().getServletContext().getRequestDispatcher("/WEB- INF/menuAdmin.jsp").forward(request, response);

}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:comunicacion entre servlet

Publicado por Gonzalo (72 intervenciones) el 12/03/2007 19:39:05
Veamos...

Y la URL /libreria/controlador la tienes definida en el web.xml?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:comunicacion entre servlet

Publicado por nepthis (37 intervenciones) el 13/03/2007 20:47:15
Muchas gracias Gonzalo! Me estas sacando de unos lios.....Parece que ahora ya funciona.

Una cosita, estoy utilizando mysql, he creado una tabla dandole a la clave un
tinyint(1) pensando que no me dejaría insertar más de 10 elementos, pero sí me deja. Entonces de qué sirve ponerle longitud?

CREATE TABLE `contactos` (
`cod_contacto` tinyint(1) NOT NULL AUTO_INCREMENT,
`.......
PRIMARY KEY (`cod_contacto`)
) ENGINE=InnoDB AUTO_INCREMENT=1;

Gracias!.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:comunicacion entre servlet

Publicado por Gonzalo (72 intervenciones) el 13/03/2007 21:56:15
Es que TINYINT no es lo que crees.

TINYINT es 1 byte. Es decir, de -128 a +127 (o de 0 a 255 si es sin signo). SI lo que necesitas es un número de 0 a 9, lo que necesitas es DECIMAL. En concreto DECIMAL(1,0).

Si quieres, mira el manual de MySQL capítulo 11, Tipos de Datos. En concreto, los Datos Numéricos están aquí: http://dev.mysql.com/doc/refman/5.0/es/numeric-types.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:comunicacion entre servlet

Publicado por nepthis (37 intervenciones) el 18/03/2007 22:33:51
Gracias!! efectivamente no era lo que pensaba. Pero sigo teniendo una duda, supongamos el rango de 0 a 255. como he puesto autoincremento, las claves se meten solas y de forma creciente. Cuando llegue a 255, es decir, si intento insertar un 256 no me va a dejar aunque la clave 6, por ejemplo, no esté utilizada porque la he borrado?
Esto sería un problema para una tabla 'avisos' en la que, sé que no va a ver más de 20 filas ocupadas simultáneamente, pero que, a lo largo de x años renovando avisos, se van a superar las 255 claves, y si el autoincremento impide reutilizar claves...¿cómo puedo solucinar esto sin tener que preocuparme de las claves?¿dándole un tipo entermo grandíiisimo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:comunicacion entre servlet

Publicado por Gonzalo (72 intervenciones) el 23/03/2007 14:52:39
Pues... el AUTO_INCREMENT cuando llega al final, se acabó y da un error (según dice el manual). Una solución es esa, dar un rango muy amplio al ID. (Por ejemplo, le puedes poner un INT(10))

Otra solución (y que me pegue algún experto en bases de datos si no le parece bien) es usar como clave primaria de la tabla de avisos, un TIMESTAMP.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar