Exemplos de programas JSP: formulário de registro e login

⚡ Resumo Inteligente

Os exemplos de programas JSP aqui apresentados criam três módulos — um formulário de cadastro, um formulário de login e logout e uma página de processamento de formulários — cada um conectando uma view JSP a um controlador servlet, de forma que a divisão MVC permaneça visível para iniciantes.

  • 🔘 Fluxo de inscrição: O arquivo Register_1.jsp coleta seis campos e os envia para o servlet guru_register, que redireciona para uma página de sucesso somente quando todos os campos forem preenchidos.
  • ☑️ Entrar e sair: O arquivo Register_3.jsp envia as credenciais para o guru_login; o arquivo Register_4.jsp cumprimenta o usuário e o redireciona para a página de login para que ele possa sair.
  • Funções MVC: As páginas JSP atuam como a visualização, o servlet atua como o controlador e o RequestDispatcher move a requisição entre eles.
  • 🧪 Processamento de formulários: Os métodos getParameter(), getParameterValues(), getParameterNames() e getInputStream() leem os dados submetidos dentro de um JSP ou servlet.
  • 🛠️ GET versus POST: O método GET anexa valores codificados ao URL e tem um limite de comprimento; o método POST carrega valores no corpo da requisição, o que é adequado para senhas.
  • ⚠️ Nota de versão: Esses arquivos importam o pacote javax.servlet, portanto, funcionam no Tomcat 9 ou versões anteriores; o Tomcat 10 e versões mais recentes exigem o pacote jakarta.servlet.

Exemplos de programas com formulários de registro e login em JSP

Estes exemplos práticos mostram como desenvolver programas de exemplo com JSP e como implementar a arquitetura MVC em torno deles. Três módulos são construídos na seguinte ordem:

  • Formulário de Cadastro
  • Formulário de login e logout
  • Formulário JSP

Como criar um formulário de inscrição em JSP

Em um formulário de inscrição, temos um campo para preencher todos os dados, que incluem nome, nome de usuário, senha, endereço, número de contato, etc.

Este formulário nos ajuda a nos cadastrar no aplicativo. Ele coleta todos os nossos dados e os armazena em um arquivo. banco de dados ou cache.

Neste exemplo, vamos considerar o “Guru Formulário de inscrição”, que contém os seguintes campos:

  1. Nome
  2. Apelido
  3. Nome de Utilizador
  4. Senha
  5. Endereço
  6. Número de contato

Após preencher todos esses detalhes, temos um botão de envio; ao clicar nesse botão, todos os detalhes são enviados para o servlet.

Exemplo 1: Register_1.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>Guru Registration Form</title>
</head>
<body>
<h1>Guru Register Form</h1>
<form action="guru_register" method="post">
			<table style="with: 50%">
				<tr>
					<td>First Name</td>
					<td><input type="text" name="first_name" /></td>
				</tr>
				<tr>
					<td>Last Name</td>
					<td><input type="text" name="last_name" /></td>
				</tr>
				<tr>
					<td>UserName</td>
					<td><input type="text" name="username" /></td>
				</tr>
					<tr>
					<td>Password</td>
					<td><input type="password" name="password" /></td>
				</tr>
				<tr>
					<td>Address</td>
					<td><input type="text" name="address" /></td>
				</tr>
				<tr>
					<td>Contact No</td>
					<td><input type="text" name="contact" /></td>
				</tr></table>
			<input type="submit" value="Submit" /></form>
</body>
</html>

Explicação do código:

Code Linha 11: Aqui estamos considerando um formulário que possui uma ação, ou seja, o servlet para o qual a requisição será enviada, e o nome do servlet é guru_register.java. A requisição será processada através do método POST.

Code Linha 14-16: Aqui, estamos considerando o tipo de entrada como texto e o nome como first_name.

Code Linha 18-20: Aqui, estamos considerando o tipo de entrada como texto e o nome como sobrenome.

Code Linha 22-24: Aqui, estamos considerando o tipo de entrada como texto e o nome como nome de usuário.

Code Linha 26-28: Aqui, estamos considerando o tipo de entrada como senha (isso oculta a senha enquanto ela é digitada) e o nome como senha.

Code Linha 30-32: Aqui, estamos considerando o tipo de entrada como texto e o nome como endereço.

Code Linha 34-36: Aqui, estamos considerando o tipo de entrada como texto e o nome como contato.

Code Linha 37: Aqui, estamos usando um botão do tipo "submit" cujo valor também é "Submit". Ao clicar nesse botão, a ação é direcionada para o servlet correspondente, `guru_register`, onde todos os valores dos parâmetros são passados ​​na requisição.

Observação: o atributo da tabela em Code A linha 12 diz: style="with: 50%"A propriedade CSS correta é widthAssim, a listagem será reproduzida exatamente como publicada, mas a tabela não será redimensionada até que o erro de digitação seja corrigido em sua cópia.

2 exemplo: Guru_register.java

package demotest;

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;

/**
 * Servlet implementation class guru_register
 */
public class guru_register extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String first_name = request.getParameter("first_name");
		String last_name = request.getParameter("last_name");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String address = request.getParameter("address");
		String contact = request.getParameter("contact");
		
		if(first_name.isEmpty() || last_name.isEmpty() || username.isEmpty() || 
				password.isEmpty() || address.isEmpty() || contact.isEmpty())
		{
			RequestDispatcher req = request.getRequestDispatcher("register_1.jsp");
			req.include(request, response);
		}
		else
		{
			RequestDispatcher req = request.getRequestDispatcher("register_2.jsp");
			req.forward(request, response);
		}
	}

}

Explicação do código:

Code Linha 14: Aqui definimos o servlet guru_register, que estende HttpServlet.

Code Linha 18: Este é o método doPost(), que é chamado quando especificamos POST como o atributo method no formulário JSP acima.

Code Linha 20-25: Aqui estamos obtendo os valores da solicitação, ou seja, first_name, last_name, username, password, address e contact, usando request.getParameter.

Code Linha 27-32: Aqui, estamos usando uma condição `if` para verificar se algum dos parâmetros obtidos da requisição está vazio. Se algum parâmetro estiver vazio, o controle entra nesta condição (`first_name.isEmpty() || last_name.isEmpty() || username.isEmpty() || password.isEmpty() || address.isEmpty() || contact.isEmpty()`) e obtemos um objeto `RequestDispatcher` do objeto de requisição, que envia a requisição de volta para `register_1.jsp`. Aqui, também estamos incluindo os objetos de requisição e resposta.

Code Linha 33-37: Este ramo é executado quando nenhum dos parâmetros está vazio. Obtemos um objeto RequestDispatcher do objeto de requisição, que encaminha a requisição para register_2.jsp. Aqui, estamos encaminhando os objetos de requisição e resposta.

A diferença entre os dois ramos é importante: include() executa register_1.jsp e retorna o controle para o servlet, enquanto forward() A solicitação é encaminhada para register_2.jsp e não retorna nenhum retorno.

Exemplo 3: Register_2.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>Guru Success Page</title>
</head>
<body>
           <a><b>Welcome User!!!!</b></a>
</body>
</html>

Explicação do código:

Code Linha 10: Aqui exibimos a mensagem de boas-vindas. Este JSP é chamado quando todos os parâmetros são preenchidos.

Ao executar o código acima, você obtém a seguinte saída.

Saída:

A página de cadastro exibe os seis campos identificados com um único botão "Enviar", conforme mostrado abaixo.

Guru Formulário de inscrição em JSP com campos para nome, sobrenome, nome de usuário, senha, endereço e contato.

Após todos os campos serem preenchidos e o botão Enviar ser clicado, o guru_register redireciona para register_2.jsp e a página de sucesso é exibida.

A página Register_2.jsp exibe a mensagem de boas-vindas após o cadastro.

Ao clicar em register_1.jsp, um formulário com nome, sobrenome, nome de usuário, senha, endereço e contato é exibido. Após preencher todos os dados e clicar no botão "Enviar", a mensagem "Bem-vindo(a), usuário(a)" é exibida.

Como criar um formulário de login e logout em JSP

Assim como fizemos com o formulário de cadastro, agora vamos criar um formulário de login e um de logout.

Neste exemplo, utilizamos um formulário de login com dois campos, “nome de usuário” e “senha”, e um botão de envio.

Ao clicarmos no botão "Enviar", recebemos uma mensagem de boas-vindas com um botão "Sair".

Ao clicarmos no botão de logout, retornamos ao formulário de login.

Exemplo 1: Register_3.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>Guru Login Form</title>
</head>
<body>
<form action="guru_login" method="post">
		<table style="with: 50%">

			<tr>
				<td>UserName</td>
				<td><input type="text" name="username" /></td>
			</tr>
				<tr>
				<td>Password</td>
				<td><input type="password" name="password" /></td>
			</tr>
		</table>
		<input type="submit" value="Login" /></form>
</body>
</html>

Explicação do código:

Code Linha 10: Aqui estamos usando um formulário cuja ação é o servlet guru_login.java. O método pelo qual os dados são passados ​​é o POST.

Code Linha 13-16: Aqui estamos utilizando um campo de entrada "nome de usuário", que é do tipo texto.

Code Linha 17-20: Aqui estamos utilizando um campo de entrada chamado “senha”, que é do tipo senha.

Code Linha 22: Aqui, estamos usando um botão "enviar" com o valor "Login". Ao clicar nele, o controle é direcionado para o servlet guru_login, onde ambos os campos são lidos usando o objeto de requisição.

2 exemplo: Guru_login.java (servlet)

package demotest;

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;

/**
 * Servlet implementation class guru_login
 */
public class guru_login extends HttpServlet {

    public guru_login() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		if(username.isEmpty() || password.isEmpty() )
		{
			RequestDispatcher req = request.getRequestDispatcher("register_3.jsp");
			req.include(request, response);
		}
		else
		{
			RequestDispatcher req = request.getRequestDispatcher("register_4.jsp");
			req.forward(request, response);
		}
	}

}

Explicação do código:

Code Linha 5-9: Aqui estamos importando as classes necessárias para o código.

Code Linha 14: Aqui estamos declarando o servlet guru_login, que estende HttpServlet.

Code Linha 21: Aqui estamos usando o método doPost(), porque o formulário usa o método POST.

Code Linha 23-24: Aqui estamos lendo os parâmetros usando o objeto de requisição, ou seja, nome de usuário e senha.

Code Linha 25-29: Dessa forma, usamos uma condição "if" que verifica se o nome de usuário e a senha estão vazios. Se algum deles estiver vazio, obtemos um objeto RequestDispatcher que envia o controle de volta para register_3.jsp com os objetos de solicitação e resposta.

Code Linha 30-34: Este ramo é executado se ambos não estiverem vazios; em seguida, encaminha a solicitação para register_4.jsp com os objetos de solicitação e resposta.

Exemplo 3: Register_4.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>Guru Logged In</title>
</head>
<body>
	<table style="with: 50%">
	<tr><td>
	<% String username = request.getParameter("username"); %>
<a>Welcome   <% out.println(username); %> User!!!! You have logged in.</a></td></tr>
<tr></tr><tr><td></td><td></td><td><a href="register_3.jsp"><b>Logout</b></a></td></tr>
</table>
</body>
</html>

Explicação do código:

Code Linha 12: Aqui, obtemos o parâmetro “username” do objeto de requisição e o armazenamos no objeto String username. Isso funciona porque o método forward() mantém a requisição original, e consequentemente seus parâmetros, intactos.

Code Linha 13: Aqui temos uma mensagem de boas-vindas com o nome de usuário.

Code Linha 14: Aqui temos o link de logout, que redireciona o usuário para register_3.jsp.

Ao executar o código acima, você obtém a seguinte saída.

Saída:

Ao abrir o arquivo register_3.jsp, são exibidos os dois campos de credenciais e um botão de login.

Guru Formulário de login em JSP exibindo os campos de nome de usuário e senha com um botão de login.

Após clicar no botão Entrar, você verá a mensagem abaixo juntamente com um link para Sair.

A tela de boas-vindas Register_4.jsp cumprimenta o usuário conectado com um link para sair.

Clicar no link "Sair" o levará de volta à página de login mostrada aqui.

A página de login é exibida novamente no navegador após o usuário clicar em "Sair".

Observação: Este exemplo compara apenas valores vazios, portanto, qualquer nome de usuário não vazio é aceito. Um login de produção deve verificar as credenciais em um banco de dados e manter as senhas criptografadas, nunca em texto simples.

Processamento de formulário JSP usando getParameter()

Os formulários são o método mais comum de coletar dados em processamento web. Precisamos enviar informações para o servidor web e, em seguida, ler essas informações de volta no servidor.

Existem dois métodos comumente usados ​​para enviar e receber informações ao servidor web.

Método GET:

  • Este é o método padrão para passar informações do navegador para o servidor web.
  • Ele envia as informações codificadas anexadas à página. URL, separados por um caractere ?.
  • Também possui uma limitação de tamanho; a recomendação clássica é de aproximadamente 1024 caracteres por solicitação, embora o limite real seja definido pelo navegador e pelo servidor, e não pela especificação HTTP.
  • Devemos evitar o envio de senhas e informações confidenciais pelo método GET.

Método POST:

  • O método POST é o mais confiável para enviar informações ao servidor.
  • Ele envia as informações como um corpo de mensagem separado, em vez de na barra de endereços.
  • Porque os valores nunca aparecem depois do ? no URLEles não são armazenados no histórico do navegador nem nos registros de acesso ao servidor.
  • É comumente utilizado para enviar informações sensíveis.

O JSP processa os dados do formulário usando os seguintes métodos:

  1. getParameter(): usado para obter o valor de um único parâmetro de formulário.
  2. getParameterValues(): usado para retornar os múltiplos valores de um parâmetro.
  3. getParameterNames(): usada para obter os nomes de todos os parâmetros.
  4. getInputStream(): usado para ler os dados binários enviados pelo cliente.

Exemplo:

Neste exemplo, utilizamos um formulário com dois campos, “nome de usuário” e “senha”, e um botão de envio.

Action_form.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>Guru Form</title>
</head>
<body>
<form action="action_form_process.jsp" method="GET">
UserName: <input type="text" name="username">
<br />
Password: <input type="text" name="password" />
<input type="submit" value="Submit" />
</form>
</body>
</html>

Action_form_process.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>Insert title here</title>
</head>
<body>

<h1>Form Processing</h1>

<p><b>Welcome User:</b>
   <%= request.getParameter("username")%>
</p>

</body>
</html>

Explicação do código: Action_form.jsp

Code Linha 10: Aqui definimos um formulário cuja ação é processada por outro. JSPNo atributo `action`, adicionamos o JSP ao qual o formulário deve ser submetido através do método GET.

Aqui estamos usando o método GET para passar as informações, ou seja, nome de usuário e senha.

Code Linha 11-14: Aqui, estamos utilizando campos como nome de usuário e senha, que são campos de texto, e obtendo a entrada do usuário.

Esses dados podem ser obtidos usando o método getParameter. Também temos um botão de envio, que passa os valores dos campos para o arquivo action_form_process.jsp.

Action_form_process.jsp

Code Linha 14: Aqui, obtemos os valores dos campos de entrada do arquivo action_form.jsp usando o método getParameter do objeto de requisição.

Ao executarmos o código acima, obtemos a seguinte saída.

Saída:

O arquivo Action_form.jsp primeiro renderiza o formulário de dois campos mostrado abaixo.

O arquivo Action_form.jsp renderiza os campos de texto Nome de Usuário e Senha com um botão Enviar.

Após o envio, o arquivo action_form_process.jsp exibe o nome de usuário lido com getParameter().

A página de saída Action_form_process.jsp exibe o cabeçalho "Processamento do Formulário" e a mensagem de boas-vindas.

Ao executarmos o arquivo action_form.jsp, obtemos um formulário com dois campos, nome de usuário e senha, e um botão de envio. Após inserir o nome de usuário e a senha, clicamos em enviar, e a solicitação é processada na página seguinte, que retorna a página de Processamento do Formulário com uma mensagem de boas-vindas.

Nota de versão: Ambos os servlets acima importam javax.servlet, o que é correto para o Tomcat 9 e versões anteriores. O Jakarta EE 9 renomeou a API, portanto, no Tomcat 10 ou posterior, toda importação de javax.servlet passa a ser jakarta.servlet, ou o aplicativo deve ser convertido com a Ferramenta de Migração do Apache Tomcat para Jakarta EE.

Perguntas Frequentes

As listagens são direcionadas ao Tomcat 9 e versões anteriores, onde a API reside em javax.servlet. O Jakarta EE 9 renomeou o namespace, portanto, o Tomcat 10 e versões mais recentes precisam de importações de jakarta.servlet e uma recompilação, ou a execução da Ferramenta de Migração do Tomcat.

Nunca armazene os dados como texto simples. Use um algoritmo de criptografia lento e com salt, como o BCrypt ou o Argon2, para gerar o hash antes que os dados cheguem ao banco de dados, e compare os hashes no momento do login. O servlet de exemplo verifica apenas valores vazios, portanto, é necessário adicionar a verificação de hash.

A função `include()` executa o recurso de destino e retorna o controle para o servlet que a chamou, portanto, ambas as saídas são exibidas. Já a função `forward()` passa toda a requisição para o destino e nunca retorna, então o servlet não deve ter enviado a resposta primeiro.

As páginas JSP são a visualização, o servlet é o controlador que lê os parâmetros e decide para onde enviar os dados, e um banco de dados ou camada de beans fornece o modelo. O RequestDispatcher é a ligação entre o controlador e a visualização.

Assistentes de IA podem elaborar ramificações de validação, detectar verificações de nulo ausentes em `getParameter()`, sugerir bibliotecas de hash e explicar a pilha de chamadas. tracTrate cada sugestão como um rascunho: verifique a versão da API do servlet e teste o código gerado antes de publicar.ping .

O Copilot é eficiente em tarefas repetitivas como stubs doPost, leitura de parâmetros e chamadas ao dispatcher. Ele frequentemente utiliza por padrão importações antigas do javax.servlet, portanto, verifique o namespace, a lógica de validação e o escaneamento.ping de qualquer entrada do usuário que ele produza.

Adicione uma camada JDBC no servlet: abra uma conexão em pool, use um PreparedStatement para a inserção ou a busca de credenciais e feche os recursos em um bloco finally. Mantenha o SQL fora do JSP para que a view permaneça apenas de apresentação.

Isso ocorre porque o guru_login apenas verifica se os campos estão vazios. Um nome de usuário ou senha vazios redireciona para a página de login em vez de encaminhar o usuário, o que funciona como uma verificação de validação muito simples, e não como uma autenticação real.

Resuma esta postagem com: