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: <input type="text" name="name"/> <br/><br/>
Lets do some math?<br/>
Type the first value to be added: <input type="text" name="value1"/> <br/>
Type the second value to be added: <input type="text" name="value2"/> <br/><br/>
<input type="submit" value="Do some math"/>
</form>
</body>
</html>
Código do arquivo /WebContent/WEB-INF/show.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<body>
Thanks ${name} for passing by. <br/>
The total is: ${total}. <br/>
<br/>${warning}
</body>
</html>
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:
<filter>
<filter-name>UserCheckFilter</filter-name>
<filter-class>com.UserCheckFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UserCheckFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
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<string, user=""> 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<string, user=""> getUsers() {
Map<string, user=""> users = new HashMap<string, user="">();
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;
}
}</string,></string,></string,></string,>
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:
<servlet>
<servlet-name>userValidator</servlet-name>
<servlet-class>com.UserValidator</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>userValidator</servlet-name>
<url-pattern>/userValidator</url-pattern>
</servlet-mapping>
Vamos criar 3 arquivos do tipo JSP, para: login, erro no login e login com sucesso:
/WebContent/login.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Login</title>
</head>
<body>
<form action="/Servlet/userValidator" method="post">
Name: <input type="text" name="name"/>
Password: <input type="password" name="password"/>
<input type="submit" value="LogIn"/>
</form>
</body>
</html>
/WebContent/loginError.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Error</title>
</head>
<body>
Wrong user/password
</body>
</html>
/WebContent/loginSuccess.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Success</title>
</head>
<body>
You have loged in.
</body>
</html>
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:
<filter>
<filter-name>UserCheckFilter</filter-name>
<filter-class>com.UserCheckFilter</filter-class>
<init-param>
<param-name>loginActionURI</param-name>
<param-value>/Servlet/userValidator</param-value>
</init-param>
</filter>
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.