Declaração: Original do autor, todos os direitos reservados.
A
reprodução não autorizada não é permitida. Use beans e servlets para implementar conjuntamente o registro e login do usuário em jsp.
Copyright: imagebear
Software e ambiente operacional necessários para este exemplo:
1. Sistema operacional Windows2000 Server
2.jdk1.4
3. JCreator2.5 (depurador de edição de código-fonte java, recomendado para quem vomita sangue!)
4. Macromedia JRun MX
5. Macromedia Dreamweaver MX (opcional)
6. Banco de dados MySQL (é melhor instalar o MySQL Control Center)
1. Design do banco de dados Abra o banco de dados MySQL com o MySQL Control Center, crie um novo banco de dados shopping e crie uma nova tabela tbl_user abaixo dele, com cada campo definido da seguinte forma:
2. Escreva o bean do banco de dados de conexão: DBConn.java
//DBConn.java
//inclui classes obrigatórias
importar java.sql.*
//======================================== = =
//Define ClassDBConn
//==========================================
classe públicaDBConn
{
string pública sql_driver = "org.gjt.mm.mysql.Driver";
string pública sql_url = "jdbc:mysql://localhost:3306";
public String sql_DBName = "compras";
public String usuário = "sa";
public String pwd = "";
Conexão conn = null;
Instrução stmt = null;
ResultSet rs = null;
public boolean setDriver(String drv)
{
este.sql_driver = drv;
retornar verdadeiro;
}
String pública getDriver()
{
retorne este.sql_driver;
}
public boolean setUrl(String url)
{
this.sql_url=url;
retornar verdadeiro;
}
public boolean setDBName(String nomebd)
{
this.sql_DBName = nome do banco de dados;
retornar verdadeiro;
}
string pública getDBName()
{
retorne este.sql_DBName;
}
public boolean setUser(String usuário)
{
este.usuário = usuário;
retornar verdadeiro;
}
string pública getUsuário()
{
retorne este.usuário;
}
público booleano setPwd(String pwd)
{
isto.pwd = pwd;
retornar verdadeiro;
}
String pública getPwd()
{
retorne isto.pwd;
}
publicDBConn()
{
tentar{
Class.forName(sql_driver);//Carrega driver do banco de dados
this.conn = DriverManager.getConnection(sql_url + "/" + sql_DBName + "?user=" + usuário + "&password=" + pwd + "&useUnicode=true&characterEncoding=gb2312");
this.stmt = this.conn.createStatement();
}catch(Exceção e){
System.out.println(e.toString());
}
}
//Executa operação de consulta
conjunto de resultados público executeQuery (String strSql)
{
tentar{
this.rs = stmt.executeQuery(strSql);
retorne isto.rs;
}catch(SQLException e){
System.out.println(e.toString());
retornar nulo;
}catch(NullPointerException e){
System.out.println(e.toString());
retornar nulo;
}
}
//Executa operações de inserção, exclusão e modificação de dados
execução booleana pública (String strSql)
{
tentar{
if(this.stmt.executeUpdate(strSql) == 0)
retornar falso;
outro
retornar verdadeiro;
}catch(SQLException e){
System.out.println(e.toString());
retornar falso;
}catch(NullPointerException e){
System.out.println(e.toString());
retornar falso;
}
}
//O ponteiro do conjunto de resultados salta para uma determinada linha
público booleano rs_absolute (int linha)
{
tentar{
this.rs.absolute(linha);
retornar verdadeiro;
}catch(SQLException e){
System.out.println(e.toString());
retornar falso;
}
}
público vazio rs_afterLast()
{
tentar{
this.rs.afterLast();
}catch(SQLException e){
System.out.println(e.toString());
}
}
público vazio rs_beforeFirst()
{
tentar{
this.rs.beforeFirst();
}catch(SQLException e){
System.out.print(e.toString());
}
}
público vazio rs_close()
{
tentar{
this.rs.close();
}catch(SQLException e){
System.out.print(e.toString());
}
}
public void rs_deleteRow()
{
tentar{
this.rs.deleteRow();
}catch(SQLException e){
System.out.print(e.toString());
}
}
público booleano rs_first()
{
tentar{
this.rs.first();
retornar verdadeiro;
}catch(SQLException e){
System.out.print(e.toString());
retornar falso;
}
}
String pública rs_getString (coluna String)
{
tentar{
retorne this.rs.getString (coluna);
}catch(SQLException e){
System.out.println(e.toString());
retornar nulo;
}
}
//Este método é usado para obter grandes seções de texto,
//Substitua o retorno de carro e o avanço de linha por <br>
//Saída para página HTML
String pública rs_getHtmlString (coluna String)
{
tentar{
String str1 = this.rs.getString(coluna);
Stringstr2 = "rn";
Stringstr3 = "<br>";
retornar this.replaceAll(str1,str2,str3);
}catch(SQLException e){
System.out.println(e.toString());
retornar nulo;
}
}
//Substitua a string str2 na string str1 pela string str3
String estática privada substituirAll(String str1,String str2,String str3)
{
StringBuffer strBuf = new StringBuffer(str1);
índice interno=0;
enquanto(str1.indexOf(str2,índice)!=-1)
{
índice=str1.indexOf(str2,índice);
strBuf.replace(str1.indexOf(str2,índice),str1.indexOf(str2,índice)+str2.length(),str3);
índice=índice+str3.comprimento();
str1=strBuf.toString();
}
retornar strBuf.toString();
}
public int rs_getInt (coluna String)
{
tentar{
retorne this.rs.getInt(coluna);
}catch(SQLException e){
System.out.println(e.toString());
retornar -1;
}
}
public int rs_getInt (coluna int)
{
tentar{
retorne this.rs.getInt(coluna);
}catch(SQLException e){
System.out.println(e.toString());
retornar -1;
}
}
público booleano rs_next()
{
tentar{
retorne isto.rs.next();
}catch(SQLException e){
System.out.println(e.toString());
retornar falso;
}
}
//Determina se há dados no conjunto de resultados
hasData booleano público()
{
tentar{
booleano has_Data = this.rs.first();
this.rs.beforeFirst();
retornar has_Data;
}catch(SQLException e){
System.out.println(e.toString());
retornar falso;
}
}
público booleano rs_last()
{
tentar{
retorne isto.rs.last();
}catch(SQLException e){
System.out.println(e.toString());
retornar falso;
}
}
público booleano rs_previous()
{
tentar{
retorne isto.rs.anterior();
}catch(Exceção e){
System.out.println(e.toString());
retornar falso;
}
}
//método principal, usado para depuração
público estático void principal(String args[])
{
tentar{
DBConn minhaconn = new DBConn();
//myconn.setDBName("compras");
//myconn.DBConn();
//myconn.execute("Inserir em tbl_test(id,nome) valores('10','shandaer')");
//myconn.execute("Atualizar tbl_test set name='yyyyyyyyyyyy' onde id=10");
//myconn.execute("Excluir de tbl_test onde id=1");
ResultSet rs = myconn.executeQuery("selecione * da ordem tbl_user por id desc limite 1");
//boolean hasData = myconn.hasData();
//System.out.println("possui dados:" + hasData);
//rs.first();
enquanto (myconn.rs.next())
{
int id = myconn.rs_getInt("id") + 1;
System.out.print(id);
System.out.println(myconn.rs_getInt("id") + myconn.rs_getString("nome"));
//System.out.println('n' + myconn.rs_getHtmlString("nome"));
//System.out.println(myconn.rs.getString("nome") + myconn.rs_getInt(1));
}
}catch(Exceção e){
System.err.println(e.toString());
}
}
}
Instrução: Como você está usando um banco de dados MySQL, você precisa baixar o driver do banco de dados MySQL. Após o download, coloque o pacote org no diretório onde DBConn.java está localizado para garantir que o bean possa ser executado normalmente.
3. Escreva o bean para registro do usuário: reg.java
//reg.java
//importa classes necessárias
java.sql
.*;
{
público int novoID = 0;
resultado booleano público = falso;
registro booleano público (String nome de usuário, String senha, String confirmação, String email)
{
tentar{
if(!this.checkUser(nome de usuário))
retornar falso;
if(!this.checkPwd(senha))
retornar falso;
if(!this.verifyPwd(senha,confirmar))
retornar falso;
if(!this.checkEmail(email))
retornar falso;
if(!this.userNotExit(nome de usuário))
retornar falso;
this.getNewID();
this.result = this.register(nome de usuário,senha,confirmação,e-mail);
retorne este.resultado;
}catch(Exceção e){
System.out.println(e.toString());
retornar falso;
}
}//Fim do registro booleano
checkUser booleano público (String usuário)
{
tentar{
if(user.indexOf("'")!=-1)
{
System.out.println("O nome contém caracteres ilegais!");
retornar falso;
}outro
retornar verdadeiro;
}catch(Exceção e){
System.out.println(e.toString());
retornar falso;
}
}
verificação booleana públicaPwd(String pwd)
{
tentar{
if(pwd.indexOf("'")!=-1)
{
System.out.println("A senha contém caracteres ilegais!");
retornar falso;
}outro
retornar verdadeiro;
}catch(Exceção e){
System.out.println(e.toString());
retornar falso;
}
}
public boolean verifyPwd(String pwd,String confirm)
{
tentar{
if(!pwd.equals(confirmar))
{
System.out.println("As senhas digitadas duas vezes são inconsistentes!");
retornar falso;
}outro
retornar verdadeiro;
}catch(Exceção e){
System.out.println(e.toString());
retornar falso;
}
}
checkEmail booleano público (String email)
{
tentar{
if(email.indexOf("'")!=-1)
{
System.out.println("E-mail contém caracteres ilegais!");
retornar falso;
}outro
retornar verdadeiro;
}catch(Exceção e){
System.out.println(e.toString());
retornar falso;
}
}
usuário booleano públicoNotExit(String usuário)
{
tentar{
DBConn userDBConn = new DBConn();
userDBConn.executeQuery("selecione * de tbl_user onde nome='" + usuário + "'");
if(userDBConn.rs_next())
{
System.out.println("O nome de usuário já existe, escolha outro nome de usuário!");
retornar falso;
}outro
retornar verdadeiro;
}catch(Exceção e){
System.out.println(e.toString());
retornar falso;
}
}
público int getNewID()
{
tentar{
DBConn novoIDDBConn = new DBConn();
newIDDBConn.executeQuery("selecione * da ordem tbl_user por id desc limite 1");
if(newIDDBConn.rs_next())
{
this.newID = newIDDBConn.rs_getInt("id") + 1;
System.out.println(this.newID);
}outro{
este.novoID = 1;
}
retorne este.newID;
}catch(Exceção e){
System.out.println(e.toString());
retornar -1;
}
}
público int getID()
{
retorne este.newID;
}
registro booleano público (String nome de usuário, String senha, String confirmação, String email)
{
tentar{
DBConn regDBConn = new DBConn();
String strSQL = "inserir em tbl_user(id,nome,pwd,email) valores('" + this.newID +"','" + nome de usuário + "','" + senha + "','" + email + " ')";
regDBConn.execute(strSQL);
retornar verdadeiro;
}catch(Exceção e){
System.out.println(e.toString());
retornar falso;
}
}
public static void main(String args[])
{
tentar{
reg novoreg = novo reg();
System.out.println(newreg.reg("ssssssss","ssssss","ssssss"," [email protected] "));
DBConn minhaconn = new DBConn();
myconn.executeQuery("selecione * de tbl_user");
enquanto(myconn.rs_next())
{
System.out.println(myconn.rs_getInt("id") + " " + myconn.rs_getString("nome") + " " + myconn.rs_getString("pwd") + " " + myconn.rs_getString("email") );
}
System.out.println(newreg.getID());
}catch(Exceção e){
System.err.println(e.toString());
}
}
};
ilustrar:
1. O arquivo bean deve ser colocado no mesmo diretório do arquivo DBConn.class mencionado acima.
2. Este exemplo estuda principalmente o processo de registro. A detecção de e-mail e outros métodos não são perfeitos. Se você quiser aplicá-lo, crie seu próprio método.
4. Escreva o Servlet para login do usuário: login.java
//login.java
//importa classes necessárias
importar java.io.*;
importar javax.servlet.*;
importar javax.servlet.http.*;
importar java.sql.*;
//login da classe
login de classe pública estende HttpServlet
{
public void doGet(HttpServletRequest req,HttpServletResponse res)
throwsIOException,ServletException
{
String nome de usuário = req.getParameter("nome de usuário");
String senha = req.getParameter("senha");
if(this.checklogin(nome de usuário,senha))
{
Cookie meulogin = new Cookie("nomedeusuário",nomedeusuario);
meulogin.setVersion(1);
meulogin.setPath("/");
mylogin.setComment("Seu nome de usuário de login");
res.addCookie(melogin);
}
//Cookie[] meusCookies = req.getCookies();
//String nomeValue = this.getCookieValue(myCookies,"nomedeusuário","não encontrado");
//PrintWriter out = res.getWriter();
//out.println("nomedeusuário" + ":" + nomeValue);
//out.println("Teste de sucesso do cookie!");
res.sendRedirect("/index.jsp");
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
throwsIOException,ServletException
{
doGet(req,res);
}
public static String getCookieValue(Cookie[] cookies,String cookieName,String defaultValue)
{
for(int i=0;i<cookies.length;i++) {
Cookie cookie = cookies[i];
if (cookieName.equals(cookie.getName()))
return(cookie.getValue());
}
return(valorpadrão);
}
checklogin booleano público (String nome de usuário,String senha)
{
tentar{
DBConn loginConn = new DBConn();
loginConn.executeQuery("selecione * de tbl_user onde nome='" + nome de usuário + "'");
if(loginConn.rs_next())
{
System.out.println("Conexão criada!");
if(loginConn.rs_getString("pwd").trim().equals(senha))
{
System.out.println(loginConn.rs_getString("nome"));
retornar verdadeiro;
}
outro
{
retornar falso;
}
}
System.out.println("Teste de login bem-sucedido!");
retornar falso;
}catch(Exceção e){
System.out.println(e.toString());
retornar falso;
}
}
público estático void principal(String args[])
{
login meulogin = novo login();
System.out.println(mylogin.checklogin("shandong","shandong"));
}
}
ilustrar:
1. Não há pacote de servlet no jdk1.4 padrão. Acesse o site da empresa sun para baixar o servlet.jar, coloque-o no diretório jrelib no diretório jdk e adicione o pacote servlet.jar ao arquivo. configuração jdk no JCreator
2. Este servlet é usado para verificar o nome de usuário e a senha. Se correto, o nome de usuário será gravado no cookie. Após a conclusão, a página atual será redirecionada para a página index.jsp.
5. Escreva um bean para detectar se o usuário efetuou login: checkLogin.java
//checkLogin.java
//importar classes necessárias
importar java.io.*;
importar javax.servlet.*;
importar javax.servlet.http.*;
/class checkLogin
verificação de classe públicaLogin
{
public String nome de usuário = "";
verificação booleana pública (req HttpServletRequest, res HttpServletResponse)
throwsIOException,ServletException
{
String cookieName = "nome de usuário";
Cookie[] meusCookies = req.getCookies();
this.username = this.getCookieValue(meusCookies,cookieName,"não encontrado");
PrintWriter out = res.getWriter();
if (este.nome de usuário! = nulo)
{
//out.println("Bom dia," + this.username + "!");
retornar verdadeiro;
}outro{
out.println("Falha no login!");
retornar falso;
}
}
String pública getUserName()
{
retorne este.nomedeusuário;
}
public static String getCookieValue(Cookie[] cookies,String cookieName,String defaultValue)
{
for(int i=0;i<cookies.length;i++) {
Cookie cookie = cookies[i];
if (cookieName.equals(cookie.getName()))
return(cookie.getValue());
}
return(valorpadrão);
}
}
Descrição: Este bean detecta o nome de usuário no cookie. Se não estiver vazio, significa que você está logado, caso contrário, significa que você não está logado. O método não é perfeito, você mesmo pode expandi-lo.
6. Crie um servidor de compras no JRun. Abra o JRun Administrator e crie um novo servidor de compras. A porta aqui é 8101.
Copie todos os arquivos de classe compilados mencionados acima junto com o pacote org para a pasta classes no diretório onde o servidor de compras do JRun está localizado.
C:JRun4serversshoppingdefault-eardefault-warWEB-INFclasses
7. Crie o aplicativo de arquivo jsp DW no diretório C:JRun4serversshoppingdefault-eardefault-war Crie um novo arquivo jsp da seguinte maneira:
index.jsp:
<%@ page contentType="text/html;charset=gb2312" pageEncoding="gb2312" %>
<html>
<cabeça>
<title>Compras123</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="styles/shoppingstyle.css" rel="stylesheet" type="text/css">
</head>
<body bgcolor="#FFFFFF" leftmargin="0" topmargin="0">
<jsp:useBean id="checklogin" class="checkLogin" escopo="page"/>
<%
login booleano = checklogin.check(solicitação,resposta);
%>
<table width="100%" height="100%" border="0" cellpadding="0" cellpacing="0">
<tr bgcolor="#990000">
<td height="80" colspan="5"><table width="100%" height="100%" border="0" cellpadding="0" cellpacing="0">
<tr>
<td width="120"> </td>
<td class="caption">Shopping123</td>
<td width="200"> </td>
</tr>
</table></td>
</tr>
<tr>
<td width="200" align="center" valign="top"><table width="100%" height="20" border="0" cellpadding="0" cellpacing="0">
<tr>
<td> </td>
</tr>
</tabela>
<%
if(!login){
%>
<table width="90%" border="0" align="center" cellpadding="0" cellpacing="1" bgcolor="#CCCCCC">
<form name="form1" method="post" action="/servlet/login">
<tr align="center" bgcolor="#CCCCCC">
<td height="30" colspan="2" class="deepred">Entrada de armazenamento</td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">Membro</td>
<td align="center" bgcolor="#FFFFFF"><input name="username" type="text" id="username" size="10"></td>
</tr>
<tr>
<td height="24" align="center" bgcolor="#FFFFFF">Senha</td>
<td align="center" bgcolor="#FFFFFF"><input name="password" type="text" id="password" size="10"></td>
</tr>
<tr>
<td height="24" align="center" bgcolor="#FFFFFF"><a href="reg.jsp" target="_blank" class="red">Registrar</a></td>
<td align="center" bgcolor="#FFFFFF"><input type="submit" name="Submit" value="Enter"></td>
</tr>
</form>
</tabela>
<%
}
outro
{
out.println("Olá," + checklogin.getUserName() + "!");
}
%>
</td>
<td width="1" valign="top" bgcolor="#CCCCCC"></td>
<td width="400"> </td>
<td width="1" valign="top" bgcolor="#CCCCCC"></td>
<td width="200"> </td>
</tr>
<tr alinhamento="center" bgcolor="#990000">
<td height="60" colspan="5" class="white">copyright© 2003 Shopping123</td>
</tr>
</tabela>
</body>
</html>
reg.jsp<%@ page contentType="text/html;charset=gb2312" pageEncoding="gb2312" %>
<html>
<cabeça>
<title>Compras123</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="styles/shoppingstyle.css" rel="stylesheet" type="text/css">
</head>
<body bgcolor="#FFFFFF" leftmargin="0" topmargin="0">
<table width="100%" height="100%" border="0" cellpadding="0" cellpacing="0">
<tr bgcolor="#990000">
<td height="80" colspan="5"><table width="100%" height="100%" border="0" cellpadding="0" cellpacing="0">
<tr>
<td width="120"> </td>
<td class="caption">Shopping123</td>
<td width="200"> </td>
</tr>
</table></td>
</tr>
<tr>
<td width="100" align="center" valign="top"> </td>
<td width="1" valign="top"></td>
<td width="400" align="center" valign="top"><table width="100%" height="20" border="0" cellpadding="0" cellpacing="0">
<tr>
<td> </td>
</tr>
</tabela>
<table width="100%" border="0" cellpadding="0" cellpacing="1" bgcolor="#CCCCCC">
<form action="regpost.jsp" método="post" name="form1">
<tr alinhar="centro">
<td height="30" colspan="2" bgcolor="#CCCCCC" class="deepred">Registro de membro</td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">Membro</td>
<td align="center" bgcolor="#FFFFFF"><input name="username" type="text" id="username" size="16"></td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">Senha</td>
<td align="center" bgcolor="#FFFFFF"><input name="password" type="password" id="password" size="16"></td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">Verificar senha</td>
<td align="center" bgcolor="#FFFFFF"><input name="confirm" type="password" id="confirm" size="16"></td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">E-mail</td>
<td align="center" bgcolor="#FFFFFF"><input name="email" type="text" id="email" size="16"></td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF"><input type="submit" name="Submit" value="Rewrite"></td>
<td align="center" bgcolor="#FFFFFF"><input type="submit" name="Submit2" value="Registrar"></td>
</tr>
</form>
</table></td>
<td width="1" valign="top"></td>
<td width="100"> </td>
</tr>
<tr alinhamento="center" bgcolor="#990000">
<td height="60" colspan="5" class="white">copyright© 2003 Shopping123</td>
</tr>
</tabela>
</body>
</html>
regpost.jsp: página de envio do formulário de registro <%@ page contentType="text/html;charset=gb2312" pageEncoding="gb2312" %>
<%@ página import="reg"%>
<html>
<cabeça>
<title>Compras123</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="styles/shoppingstyle.css" rel="stylesheet" type="text/css">
</head>
<body bgcolor="#FFFFFF" leftmargin="0" topmargin="0">
<%
String nome de usuário = new String(request.getParameter("nomedeusuário").getBytes("ISO8859_1")).trim();
String senha = new String(request.getParameter("senha").getBytes("ISO8859_1")).trim();
String confirm = new String(request.getParameter("confirm").getBytes("ISO8859_1")).trim();
String email = new String(request.getParameter("email").getBytes("ISO8859_1")).trim();
%>
<table width="100%" height="100%" border="0" cellpadding="0" cellpacing="0">
<tr bgcolor="#990000">
<td height="80" colspan="5"><table width="100%" height="100%" border="0" cellpadding="0" cellpacing="0">
<tr>
<td width="120"> </td>
<td class="caption">Shopping123</td>
<td width="200"> </td>
</tr>
</table></td>
</tr>
<tr>
<td width="100" align="center" valign="top"> </td>
<td width="1" valign="top"></td>
<td width="400" align="center" valign="top">
<table width="100%" height="20" border="0" cellpadding="0" cellpacing="0">
<tr>
<td> </td>
</tr>
</tabela>
<jsp:useBean id="regID" class="reg" escopo="sessão"/>
<%
if(regID.reg(nome de usuário,senha,confirmação,e-mail))
{
out.print("ok");
String novoID = regID.getID() + "";
%>
<table width="100%" border="0" cellpadding="0" cellpacing="1" bgcolor="#CCCCCC">
<tr alinhar="centro">
<td height="30" colspan="2" bgcolor="#CCCCCC" class="deepred">Parabéns, seu registro foi realizado com sucesso! </td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">Número</td>
<td align="center" bgcolor="#FFFFFF"><%=newID%></td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">Membro</td>
<td align="center" bgcolor="#FFFFFF"><%=nomedeusuário%></td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">Senha</td>
<td align="center" bgcolor="#FFFFFF"><%=password%></td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">E-mail</td>
<td align="center" bgcolor="#FFFFFF"><%=email%></td>
</tr>
</tabela>
<%
out.print("<br>");
out.print("<a href=javascript:window.close()>Fechar</a>");
}outro{
out.print("Falha no registro!<br>");
out.print("Este nome de usuário já está em uso, por favor use outro nome de usuário!");
out.print("<a href=javascript:history.go(-1)>Return</a>");
}
%>
</td>
<td width="1" valign="top"></td>
<td width="100"> </td>
</tr>
<tr alinhamento="center" bgcolor="#990000">
<td height="60" colspan="5" class="white">copyright© 2003 Shopping123</td>
</tr>
</tabela>
</body>
</html>
Até agora, concluímos um sistema de registro e login de usuários. Como isso foi feito por mim mesmo enquanto aprendia, deve haver muitas imperfeições no código. Todos podem me criticar e corrigir. Todos os códigos acima foram testados por mim.