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

Servlet no me redirije

Estas en el tema de Servlet no me redirije en el foro de Java en Foros del Web. Hola buenas, estoy haciendo una aplicación web pero me he atascado en la cosa más sencilla, que es la de hacer un simple login. Este ...
  #1 (permalink)  
Antiguo 17/07/2011, 07:11
 
Fecha de Ingreso: junio-2011
Mensajes: 151
Antigüedad: 12 años, 10 meses
Puntos: 2
Servlet no me redirije

Hola buenas, estoy haciendo una aplicación web pero me he atascado en la cosa más sencilla, que es la de hacer un simple login. Este es el código del jsp:
Código:
<jsp:include page="includes/header.jsp"/>
<jsp:include page="includes/menu.jsp"/>
<jsp:include page="includes/content.jsp"/>

<form method="post" action="login">
Usuario: <input type="text" name="username"><%=request.getAttribute("logMes")==null?"":request.getAttribute("logMes") %><p>
Password: <input type="password" name="password">
<p>
<input type="submit" name="enviar" value="Enviar"> 
</form>
<%=request.getAttribute("Logeatuta")==null?"":request.getAttribute("Logeatuta")%>
<jsp:include page="includes/sidebar.jsp"/>
<jsp:include page="includes/footer.jsp"/>
Este es el servlet:
Código:
package Servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import Dao.*;

public class ServletLogin extends ServletBase{
	HttpSession session;
	String returnCode;
	
	void execute (HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		int id = -1;
		String username=req.getParameter("username");
		String password=req.getParameter("password");
		session=req.getSession(true);
		session.setAttribute("berria","true");
		returnCode="/login.jsp";
		User user;
		
		UsersFacade facade=new UsersFacade();
		Users users=facade.users();
		
		int pos=exist(username,password,users);	
		if(pos!=-1){
			user=users.getUser(pos);
			session.setAttribute("isLogin", "true");
			session.setAttribute("username", username);
			if(user.getIdUserType()==1){
				session.setAttribute("userType", "Admin");
				returnCode="/inicio.jsp";
			}
			else{
				if(user.getIdUserType()==2){
					session.setAttribute("userType", "Trabajo");
					returnCode="/inicio.jsp";
				}
			}
		}
		session.setAttribute("iduser", pos);
		facade.closeFacade();
		RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(returnCode);
		dispatcher.forward(req, resp);		
	}

	private int exist(String username, String password, Users users) {
		int i;
		for(i=0;i<users.getLenght();i++){
			if(users.equals(users.getUser(i).getUsername())&&(users.equals(users.getUser(i).getPassword()))){
				return i;
			}		
		}
		return -1;
	}

	@Override
	Error[] validate(HttpServletRequest req, HttpServletResponse resp) {
		String user = req.getParameter("user")==null?"":req.getParameter("user");
		String password = req.getParameter("password")==null?"":req.getParameter("password");
		
		UsersFacade facade = new UsersFacade();
		Users users=facade.users();
		
		Error[] errors = new Error[10];
		int i=0;
		
		if(exist(user,password,users)==-1){
			errors[i++]= new Error("loginMessage","Erabiltzaile edo pasahitza ezegokiak!!!");
		}
		if(password.length()<4){
			errors[i++]= new Error("passwordLength","Pasahitzak hiru karaktere baino gehiago izan behar ditu!!!!");
		}
		if(i==0)return null;
		else return errors;
	}

	@Override
	void forwardErrors(HttpServletRequest req, HttpServletResponse resp,
			Error[] errors) throws ServletException, IOException {
		String returnCode="/login.jsp";
		for(int i=0;i<errors.length;i++){
			if(errors[i]!=null){
				req.setAttribute(errors[i].name,errors[i].value);
			}
		}
		RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(returnCode);
		dispatcher.forward(req, resp);
	}

	@Override
	public boolean securityRedirect(HttpServletRequest req,
			HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	void forwardSecurity(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		
	}
}

Y este es el web.xml:
Código:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Proiektua</display-name>
  <welcome-file-list>
    <welcome-file>login.html</welcome-file>
    <welcome-file>login.htm</welcome-file>
    <welcome-file>login.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
 <!-- -->
 
  <servlet>
  <servlet-name>ServletLogin</servlet-name>
  <servlet-class>Servlet.ServletLogin
  </servlet-class>
  </servlet>
  
  <servlet-mapping>
		<servlet-name>ServletLogin</servlet-name>
		<url-pattern>/login</url-pattern>
  </servlet-mapping>
  
   <!-- -->
 
 <servlet>
  <servlet-name>ServletRedirect</servlet-name>
  <servlet-class>Servlet.ServletRedirect
  </servlet-class>
  </servlet>
  
  <servlet-mapping>
		<servlet-name>ServletRedirect</servlet-name>
		<url-pattern>/RedirectServlet</url-pattern>
  </servlet-mapping>
  
  <!-- -->
   
  <servlet>
  <servlet-name>ServletLogout</servlet-name>
  <servlet-class>Servlet.ServletLogout
  </servlet-class>
  </servlet>
  
  <servlet-mapping>
		<servlet-name>ServletLogout</servlet-name>
		<url-pattern>/logout</url-pattern>
  </servlet-mapping>
 
 <!-- -->
 
 </web-app>
No sé si se necesita algún otro dato, la cosa es que si cojo. La cosa es que hago el login y cuando le doy a enviar datos me va a esta dirección: "http://localhost:8080/Proiektua/login" y la página está en blanco, me falta algún otro servlet o algo por el estilo???
Gracias de antemano
  #2 (permalink)  
Antiguo 17/07/2011, 09:24
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Servlet no me redirije

ServletContext.getRequestDispatcher
http://download.oracle.com/javaee/5/...lang.String%29

Cita:
Use getContext to obtain a RequestDispatcher for resources in foreign contexts. This method returns null if the ServletContext cannot return a RequestDispatcher.

ServletRequest.getRequestDispatcher
http://download.oracle.com/javaee/5/...lang.String%29

Cita:
The difference between this method and ServletContext.getRequestDispatcher(java.lang.Stri ng) is that this method can take a relative path.
Tu usas una ruta relativa, por lo tanto ServletRequest.getRequestDispatcher
__________________
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 17/07/2011, 14:24
 
Fecha de Ingreso: junio-2011
Mensajes: 151
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Servlet no me redirije

No entiendo, es decir yo le digo en el returnCode que vaya a un jsp distinto según lo que haga. Y con el ServletContext es lo que necesito, no??? porque entoences ServletRequest??? y donde tengo que poner eso??? porque no me dá la opción de poner en ningún lado lo de ServletRequest. Utilizo Eclipse, no se si tendrá algo que ver
  #4 (permalink)  
Antiguo 17/07/2011, 15:51
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Servlet no me redirije

No, el requestdispatcher que te devuelve un objeto ServletContext no admite rutas relativas, que es lo que tú quieres usar.

Para usar rutas relativas tienes que usar el requestdispatcher que te devuelve la request.

Cita:
porque no me dá la opción de poner en ningún lado lo de ServletRequest
Lógico, no son métodos static, tienes que llamarlos desde un objeto, no desde la clase.

Si lees la API que te enlacé, puedes ver que HttpServletRequest "hereda" de ServletRequest, lo que tienes que hacer es usar tu objeto req
__________________
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.
  #5 (permalink)  
Antiguo 17/07/2011, 16:24
 
Fecha de Ingreso: junio-2011
Mensajes: 151
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Servlet no me redirije

Pero y eso no lo consigo con el ServletBase que tengo??? el ServletLogin extiende de ServletBase que a su vez extiende de HttpServlet. Este es el código de ServletBase:
Código:
package Servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public abstract class ServletBase extends HttpServlet {
	
	Error[] errors;
	
	abstract void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
	//egin behar duena
	abstract Error[] validate(HttpServletRequest req, HttpServletResponse resp);
	//formularioko kontuak ondo idatzita dauden, Error[]-en jartzen ditu validapenen bat gaizki dagon
	abstract void forwardErrors(HttpServletRequest req, HttpServletResponse resp,Error[] errors) throws ServletException, IOException;
	//erroreak detektatzen ditu eta dispatch egiten du error pagina batera 
	//errors arrayan idazten ditu dauden erroreak
	public abstract  boolean securityRedirect(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;  
	//segurtasun kontuak. bakarrik sartu al dira logeatuta daudenak...
	abstract void forwardSecurity(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
	//zer egin segurtasun barrera pasatzen ez badu
	
	
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {process(req,resp);}

	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {process(req,resp);}
	protected void process (HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException{
		
		if(securityRedirect(req,resp) == true){
			System.out.println("security");
			errors = validate(req,resp);
		/*	for(int i=0;i<errors.length;i++)
			{
				if(errors[i]!=null)System.out.println("name: "+errors[i].name+"  value: "+errors[i].value);
			}*/
			
			if(errors!=null){
				System.out.println("forward errors");
				forwardErrors(req,resp,errors);//setAttribute de mensaje de error y redireccionar
			}else{
				System.out.println("execute");
				execute(req, resp);
			}
		}else{
			forwardSecurity(req,resp);
		}
		
	}
}
  #6 (permalink)  
Antiguo 17/07/2011, 17:14
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Servlet no me redirije

Tu servlet y el base del que hereda, me parecen un caos, por o que no los había leído. Por ejemplo tienes un método execute, típico de Struts, sin embargo no parece que estés usando Struts (ni lo has dicho). De hecho, echándole un vistazo al resto del código, dudo que lo que te he dicho sea el problema, directamente creo que tu servlet no hace nada.

Has añadido un montón de métodos al servlet que no se ejecutan si tú no los llamas, sin embargo los habituales no los has tocado.

http://download.oracle.com/javaee/1....tpServlet.html

Yo te diría que cogieses un tutorial y partieras de un servlet sencillo. El que usas parece que está pensado para ciertos frameworks, y que no creo que tú utilices.

Suerte.
__________________
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.
  #7 (permalink)  
Antiguo 18/07/2011, 04:00
 
Fecha de Ingreso: junio-2011
Mensajes: 151
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Servlet no me redirije

Ya lo he arreglado, menuda chorrada y cuanta comida de cabeza. Resulta que en el ServletLogin, el securityRedirect lo tenía puesto en false, y tiene que estar en true. Ahora ya sí que va.
Xerelo, lo del servlet y el base no lo veo caos, es simplemente que el base tengo todos los metodos que necesito, y el post y el get van a process, en process miro si hay errores y esas cosas y si todo está bien, hago el execute. Siempre lo hago así, en teoría así está todo más ordenado, no???

Etiquetas: servlet
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 12:03.