Erro HTTP Status 404 - /Servlet/login.jsp na validação usuário

Olá,
não consigo visualizar porque não chama a tela de login já debuguei mais não vai para o jsp não sei por que …alguém já passou por isso !!!
Estou usando Eclipse Helios,java 6,tomcat 6…
abs

HTTP Status 404 - /Servlet/login.jsp

type Status report

message /Servlet/login.jsp

description The requested resource (/Servlet/login.jsp) is not available.
Apache Tomcat/6.0.26
WebContent/WEB-INF
<?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>Servlet</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
 
    <servlet>
        <servlet-name>hello</servlet-name>
        <jsp-file>/index.html</jsp-file>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
 
    <servlet>
        <servlet-name>final</servlet-name>
        <servlet-class>com.Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>final</servlet-name>
        <url-pattern>/mathit</url-pattern>
    </servlet-mapping>
</web-app>

Código do arquivo com.Servlet.java
	
package com;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class Servlet extends HttpServlet {
    public void doPost(HttpServletRequest req, HttpServletResponse res)    throws ServletException, IOException {
        int value1;
        int value2;
        int total = 0;
        String name = (String) req.getParameter("name");
        String warning = "";
 
        try {
            value1 = Integer.parseInt((String) req.getParameter("value1"));
            value2 = Integer.parseInt((String) req.getParameter("value2"));
        } catch (NumberFormatException e) {
            value1 = 0;
            value2 = 0;
            warning = "We got some bad value(blank or non numerics values, we set 0 instead";
        }
 
        req.setAttribute("name", name);
        req.setAttribute("warning", warning);
 
        total = value1 + value2;
 
        req.setAttribute("total", total);
 
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/WEB-INF/show.jsp");
 
        requestDispatcher.forward(req, res);
    }
}

Código do arquivo /WebContent/index.html
	
<html>
    <body>
        <form action="/Servlet/mathit" method="post">
            <h1>Hello</h1>
            Type your name: &lt;input type="text" name="name"/&gt; <br/><br/>
            Lets do some math?<br/>
            Type the first value to be added: &lt;input type="text" name="value1"/&gt; <br/>
            Type the second value to be added: &lt;input type="text" name="value2"/&gt; <br/><br/>
            &lt;input type="submit" value="Do some math"/&gt;
        &lt;/form&gt;
    &lt;/body&gt;
&lt;/html&gt;

Código do arquivo /WebContent/WEB-INF/show.jsp
	
&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
    &lt;body&gt;
        Thanks ${name} for passing by. <br/>
        The total is: ${total}. <br/>
 
        <br/>${warning}
    &lt;/body&gt;
&lt;/html&gt;

Para acessar, basta iniciar o Tomcat e acessar pelo endereço: http://localhost:8080/Servlet/hello.

O Filtro é uma classe do Java que pode interceptar as requisições feitas, apenas por mapear um padrão de requisição (URL, Servlet, etc?). Para começar, vamos criar uma classe de filtro e colocá-la para trabalhar.
O código da nossa classe filtro ficará assim:
	
package com;
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
 
/**
 * Servlet Filter implementation class UserCheckFilter
 */
public class UserCheckFilter implements Filter {
    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
    }
 
    /**
     * @see Filter#destroy()
     */
    public void destroy() {
    }
 
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 
        System.out.println("Hello World");
 
        chain.doFilter(request, response);
    }
}

Note que o método init e destroy pertencem à interface Filter e devem ser implementados. Estamos apenas exibindo ?Hello World? para certificar que nosso filtro esteja correto e funcionando.

Temos agora que adicionar as seguintes tags ao arquivo web.xml:
	
&lt;filter&gt;
    &lt;filter-name&gt;UserCheckFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;com.UserCheckFilter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;UserCheckFilter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;

Explicando as tags: ?url-pattern? define a url que estaremos mapeando, e em nosso caso estamos capturando qualquer url que for solicitada. ?filter-name? define o nome do filtro mapeado que será acionado. O ?filter-class? é a nossa classe Java que já foi criada.

Inicie o Tomcat e acesse pelo link: http://localhost:8080/Servlet/hello (caso você tenha problemas em visualizar a página, visite o primeiro post para tirar suas dúvidas: Criando um WebServer)
Olhe no console e veja que a nossa mensagem irá aparecer lá.
Hello World Screen

Com nosso filtro em pleno funcionamento, vamos criar uma classe de usuário. Um POJO simples, contendo nome do usuário e senha. Nossa classe ficará assim:
	
package com;
 
public class User {
    private String name = "UNKNOW";
    private String password = "UNKNOW";
 
    public User(String name, String password){
        this.name = name;
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

Precisamos de um Servlet para fazer a validação de quem está acessando nosso servidor, vamos criá-lo de modo que valide nome/senha do usuário. Vamos criar nosso Servlet com um método para fazer essa validação (não vamos entrar em detalhes de patterns no momento).
	
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
public class UserValidator extends HttpServlet {
    private static final Map&lt;string, user=""&gt; users = getUsers();
 
    /**
     * Creates valid users
     *
     * This User Map could be users returned from a database
     * or a simple select with the user.name
     *
     * @return a Map of valid users
     */
    private static Map&lt;string, user=""&gt; getUsers() {
        Map&lt;string, user=""&gt; users = new HashMap&lt;string, user=""&gt;();
 
        User userOne = new User("one","one");
        User userTwo = new User("two","TWO");
 
        users.put(userOne.getName(), userOne);
        users.put(userTwo.getName(), userTwo);
 
        return users;
    }
 
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        doPost(req, res);
    }
 
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        RequestDispatcher rd;
        String name = req.getParameter("name");
        String password = req.getParameter("password");
 
        User user = validateLogin(name, password);
 
        if (user == null){
            rd = req.getRequestDispatcher("/loginError.jsp");
        }
        else{
            HttpSession session = req.getSession();
            session.setAttribute("user", user);
            rd = req.getRequestDispatcher("/loginSuccess.jsp");
        }
 
        rd.forward(req, res);
    }
 
    /**
     * Validate the entered data
     *
     * If there is no valid data, the method will return null
     *
     * @param name given at the jsp
     * @param password given at the jsp
     * @return a user if one was found and validated
     */
    private User validateLogin(String name, String password) {
        // All parameters must be valid
        if (name == null || password == null){
            return null;
        }
 
        // Get a user by key
        User user = users.get(name);
 
        if (user == null){
            return null;
        }
 
        // Check if the password is valid
        if (!user.getPassword().equals(password.trim())){
            return null;
        }
 
        return user;
    }
}&lt;/string,&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/string,&gt;

O Map ?users? e a função ?getUsers? existem apenas para gerar usuários válidos. Caso nosso usuário não tenha seus dados válidos o método ?validateLogin? retorna o valor null. Dependendo dos dados fornecidos pelo usuário, caso válido ele será redirecionado para a página de sucesso, caso contrário, irá para a página de erro.

Precisamos alterar o arquivo ?web.xml? e adicionar o mapeamento do Servlet que acabamos de criar:
	
&lt;servlet&gt;
    &lt;servlet-name&gt;userValidator&lt;/servlet-name&gt;
    &lt;servlet-class&gt;com.UserValidator&lt;/servlet-class&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;userValidator&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/userValidator&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;

Vamos criar 3 arquivos do tipo JSP, para: login, erro no login e login com sucesso:
/WebContent/login.jsp
	
&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt;
        &lt;title&gt;Login&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;form action="/Servlet/userValidator" method="post"&gt;
            Name: &lt;input type="text" name="name"/&gt;
            Password: &lt;input type="password" name="password"/&gt;
            &lt;input type="submit" value="LogIn"/&gt;
        &lt;/form&gt;
    &lt;/body&gt;
&lt;/html&gt;

/WebContent/loginError.jsp
	
&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt;
        &lt;title&gt;Error&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        Wrong user/password
    &lt;/body&gt;
&lt;/html&gt;

/WebContent/loginSuccess.jsp
	
&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt;
        &lt;title&gt;Success&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        You have loged in.
    &lt;/body&gt;
&lt;/html&gt;

Precisamos alterar agora nosso Filtro. Essa será a alteração mais delicada, pois será nosso filtro que irá definir se nosso usuário pode continuar em sua requisição ou não.
	
package com;
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
 
/**
 * Servlet Filter implementation class UserCheckFilter
 */
public class UserCheckFilter implements Filter {
    private String LOGIN_ACTION_URI;
 
    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        LOGIN_ACTION_URI = fConfig.getInitParameter("loginActionURI");
    }
 
    /**
     * @see Filter#destroy()
     */
    public void destroy() {
    }
 
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpSession session = req.getSession();
        User user = (User) session.getAttribute("user");
 
        if (user == null && !LOGIN_ACTION_URI.equals(req.getRequestURI())){
            RequestDispatcher rd = req.getRequestDispatcher("/login.jsp");
            rd.forward(request, response);
            return;
        }
 
        chain.doFilter(request, response);
    }
}

Alguns detalhes sobre o código acima: ?req.getSession()? ? retorna a sessão do usuário, mas caso não tenha nenhuma sessão o próprio container fica encarregado de criar uma. Buscamos dentro da sessão o objeto usuário, em nosso servlet ao efetuar o login um objeto do tipo User é inserido na sessão. Caso não exista um objeto do tipo User na sessão, o valor retornado é null e com isso direcionamos o usuário para a tela de login. Note também que temos um atributo LOGIN_ACTION_URI que é retornado das configurações do filtro, ele será configurado daqui a pouco no arquivo web.xml. O atributo LOGIN_ACTION_URI existe para caso o usuário esteja tentando realizar a validação ele possa chegar ao nosso Servlet de validação de usuário, caso esse atributo não existisse, não seria possível realizar o login pois o objeto User nunca seria adicionado à sessão.

Falta agora colocar o parâmetro de inicialização do filtro no arquivo web.xml:
	
&lt;filter&gt;
    &lt;filter-name&gt;UserCheckFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;com.UserCheckFilter&lt;/filter-class&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;loginActionURI&lt;/param-name&gt;
        &lt;param-value&gt;/Servlet/userValidator&lt;/param-value&gt;
    &lt;/init-param&gt;
&lt;/filter&gt;

Ao acessar o link http://localhost:8080/Servlet/hello, o usuário será redirecionado para a página de login. Após digitar um usuário/senha que sejam válidos, ele terá sua sessão validada. E não será mais necessário realizar essa validação.

ao debugar entra no metodo doFilter

e entra no if pois a session esta null mais não chama a página login.jsp

e cai no erro [code]HTTP Status 404 - /Servlet/login.jsp

type Status report

message /Servlet/login.jsp

description The requested resource (/Servlet/login.jsp) is not available.
Apache Tomcat/6.0.26[/code]

porque ainda não consegui !!!


public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpSession session = req.getSession();
        User user = (User) session.getAttribute("user");
    //    User user = new User("paulo","paulo");
        
 
        if (user == null && !LOGIN_ACTION_URI.equals(req.getRequestURI())){
            RequestDispatcher rd = req.getRequestDispatcher("/login.jsp");
            rd.forward(request, response);
            return;
            
        }