ステートメント: 著者によるオリジナル、全著作権所有。無断転載は禁止です。 Beanとサーブレットを利用してjspでユーザー登録とログインを実現します
。
著作権: imagebear
この例に必要なソフトウェアと動作環境:
1. Windows2000 Server オペレーティング システム
2.jdk1.4
3. JCreator2.5(Javaソースコード編集デバッガ、血を吐く人にオススメ!)
4. マクロメディア JRun MX
5. マクロメディア Dreamweaver MX (オプション)
6. MySQL データベース (MySQL Control Center をインストールするのが最善です)
1. データベースの設計 MySQL Control Center で MySQL データベースを開き、新しいデータベース ショッピングを作成し、その下に新しいテーブル tbl_user を作成します。各フィールドは次のように設定されます。
2. 接続データベース Bean を作成します: DBConn.java
//DBConn.java
//必要なクラスを含める
import java.sql.*;
//================================== = =
// ClassDBConn を定義する
//==========================================
パブリッククラスDBConn
{
public String sql_driver = "org.gjt.mm.mysql.Driver";
public String sql_url = "jdbc:mysql://localhost:3306";
public String sql_DBName = "ショッピング";
public String ユーザー = "sa";
public String pwd = "";
接続 conn = null;
ステートメント stmt = null;
ResultSet rs = null
パブリックブール setDriver(String drv)
{
this.sql_driver = drv;
true を返します。
パブリック
String getDriver()
{
this.sql_driver を返します。
public boolean setUrl(String url
)
{
this.sql_url = URL;
true を返します。
public boolean setDBName(String dbname
)
{
this.sql_DBName = データベース名;
true を返します。
パブリック
String getDBName()
{
this.sql_DBName を返します。
public boolean setUser(String user
)
{
this.user = ユーザー;
true を返します。
パブリック
String getUser()
{
this.user を返します。
public boolean setPwd(String pwd
)
{
this.pwd = パスワード;
true を返します。
パブリック String getPwd(
)
{
this.pwd を返します。
publicDBConn(
)
{
試す{
Class.forName(sql_driver);//データベースドライバーをロードする
this.conn = DriverManager.getConnection(sql_url + "/" + sql_DBName + "?user=" + user + "&password=" + pwd + "&useUnicode=true&characterEncoding=gb2312");
this.stmt = this.conn.createStatement();
}catch(例外 e){
System.out.println(e.toString());
}
}
//クエリ操作を実行します
パブリックResultSetのexecuteQuery(String strSql)
{
試す{
this.rs = stmt.executeQuery(strSql);
this.rs を返します。
}catch(SQLException e){
System.out.println(e.toString());
null を返します。
}catch(NullPointerException e){
System.out.println(e.toString());
null を返します。
}
}
//データの挿入、削除、変更操作を実行します。
パブリックブール実行(String strSql)
{
試す{
if(this.stmt.executeUpdate(strSql) == 0)
false を返します。
それ以外
true を返します。
}catch(SQLException e){
System.out.println(e.toString());
false を返します。
}catch(NullPointerException e){
System.out.println(e.toString());
false を返します。
}
}
//結果セットポインタは特定の行にジャンプします
public boolean rs_absolute(int row)
{
試す{
this.rs.absolute(行);
true を返します。
}catch(SQLException e){
System.out.println(e.toString());
false を返します。
}
public void rs_afterLast(
)
{
試す{
this.rs.afterLast();
}catch(SQLException e){
System.out.println(e.toString());
}
public void rs_beforeFirst(
)
{
試す{
this.rs.beforeFirst();
}catch(SQLException e){
System.out.print(e.toString());
}
public void rs_close(
)
{
試す{
this.rs.close();
}catch(SQLException e){
System.out.print(e.toString());
}
public void rs_deleteRow(
)
{
試す{
this.rs.deleteRow();
}catch(SQLException e){
System.out.print(e.toString());
}
パブリックブール値 rs_first(
)
{
試す{
this.rs.first();
true を返します。
}catch(SQLException e){
System.out.print(e.toString());
false を返します。
}
public String rs_getString(String 列
)
{
試す{
this.rs.getString(column) を返します。
}catch(SQLException e){
System.out.println(e.toString());
null を返します。
}
}
//このメソッドはテキストの大部分を取得するために使用されます。
//キャリッジリターンとラインフィードを<br>に置き換えます。
//HTMLページに出力
public String rs_getHtmlString(文字列列)
{
試す{
文字列 str1 = this.rs.getString(column);
文字列 str2 = "rn";
文字列 str3 = "<br>";
return this.replaceAll(str1,str2,str3);
}catch(SQLException e){
System.out.println(e.toString());
null を返します。
}
}
// str1 文字列内の str2 文字列を str3 文字列に置き換えます
private static String replaceAll(String str1,String str2,String str3)
{
StringBuffer strBuf = 新しい StringBuffer(str1);
int インデックス = 0;
while(str1.indexOf(str2,index)!=-1)
{
インデックス=str1.indexOf(str2,index);
strBuf.replace(str1.indexOf(str2,index),str1.indexOf(str2,index)+str2.length(),str3);
インデックス=インデックス+str3.length();
str1=strBuf.toString();
}
strBuf.toString() を返します。
public
int rs_getInt(文字列列)
{
試す{
this.rs.getInt(column) を返します。
}catch(SQLException e){
System.out.println(e.toString());
-1 を返します。
}
public int rs_getInt(int 列
)
{
試す{
this.rs.getInt(column) を返します。
}catch(SQLException e){
System.out.println(e.toString());
-1 を返します。
}
パブリックブール値 rs_next(
)
{
試す{
this.rs.next() を返します。
}catch(SQLException e){
System.out.println(e.toString());
false を返します。
}
}
//結果セットにデータがあるかどうかを判断します
パブリックブール値 hasData()
{
試す{
ブール値 has_Data = this.rs.first();
this.rs.beforeFirst();
has_Data を返します。
}catch(SQLException e){
System.out.println(e.toString());
false を返します。
}
パブリックブール値 rs_last(
)
{
試す{
this.rs.last() を返します。
}catch(SQLException e){
System.out.println(e.toString());
false を返します。
}
public boolean rs_previous(
)
{
試す{
this.rs.previous() を返します。
}catch(例外 e){
System.out.println(e.toString());
false を返します。
}
}
//デバッグに使用されるメインメソッド
public static void main(String args[])
{
試す{
DBConn myconn = 新しい DBConn();
//myconn.setDBName("ショッピング");
//myconn.DBConn();
//myconn.execute("tbl_test(id,name) に値を挿入('10','shandaer')");
//myconn.execute("Update tbl_test set name='yyyyyyyyyyyy' where id=10");
//myconn.execute("id=1 の tbl_test から削除");
ResultSet rs = myconn.executeQuery("select * from tbl_user order by id desc limit 1");
//boolean hasData = myconn.hasData();
//System.out.println("データがあります:" + hasData);
//rs.first();
while (myconn.rs.next())
{
int id = myconn.rs_getInt("id") + 1;
System.out.print(id);
System.out.println(myconn.rs_getInt("id") + myconn.rs_getString("name"));
//System.out.println('n' + myconn.rs_getHtmlString("name"));
//System.out.println(myconn.rs.getString("name") + myconn.rs_getInt(1));
}
}catch(例外 e){
System.err.println(e.toString());
}
}
ステートメント
: MySQL データベースを使用しているため、MySQL データベース ドライバーをダウンロードする必要があります。ダウンロード後、Bean が正常に実行できるように、DBConn.java が配置されているディレクトリに org パッケージを配置してください。
3. ユーザー登録用の Bean を作成します: reg.java
//reg.java
//必要なクラスをインポートする
java.sql.* をインポートします
。
{
public int newID = 0;
パブリックブール値の結果 = false;
public boolean reg(文字列のユーザー名、文字列のパスワード、文字列の確認、文字列の電子メール)
{
試す{
if(!this.checkUser(ユーザー名))
false を返します。
if(!this.checkPwd(パスワード))
false を返します。
if(!this.verifyPwd(パスワード,確認))
false を返します。
if(!this.checkEmail(メール))
false を返します。
if(!this.userNotExit(ユーザー名))
false を返します。
this.getNewID();
this.result = this.register(ユーザー名,パスワード,確認,電子メール);
this.result を返します。
}catch(例外 e){
System.out.println(e.toString());
false を返します。
}
}//ブール型登録の終了
public boolean checkUser(String user)
{
試す{
if(user.indexOf("'")!=-1)
{
System.out.println("名前に不正な文字が含まれています!");
false を返します。
}それ以外
true を返します。
}catch(例外 e){
System.out.println(e.toString());
false を返します。
}
}
public boolean checkPwd(String pwd)
{
試す{
if(pwd.indexOf("'")!=-1)
{
System.out.println("パスワードに不正な文字が含まれています!");
false を返します。
}それ以外
true を返します。
}catch(例外 e){
System.out.println(e.toString());
false を返します。
}
}
public boolean verifyPwd(String pwd,String verify)
{
試す{
if(!pwd.equals(確認))
{
System.out.println("2 回入力されたパスワードは矛盾しています!");
false を返します。
}それ以外
true を返します。
}catch(例外 e){
System.out.println(e.toString());
false を返します。
}
}
public boolean checkEmail(文字列メール)
{
試す{
if(email.indexOf("'")!=-1)
{
System.out.println("電子メールに不正な文字が含まれています!");
false を返します。
}それ以外
true を返します。
}catch(例外 e){
System.out.println(e.toString());
false を返します。
}
}
public boolean userNotExit(String user)
{
試す{
DBConn userDBConn = 新しい DBConn();
userDBConn.executeQuery("select * from tbl_user where name='" + user + "'");
if(userDBConn.rs_next())
{
System.out.println("そのユーザー名はすでに存在します。別のユーザー名を選択してください!");
false を返します。
}それ以外
true を返します。
}catch(例外 e){
System.out.println(e.toString());
false を返します。
}
}
public int getNewID()
{
試す{
DBConn newIDDBConn = new DBConn();
newIDDBConn.executeQuery("select * from tbl_user order by id desc limit 1");
if(newIDDBConn.rs_next())
{
this.newID = newIDDBConn.rs_getInt("id") + 1;
System.out.println(this.newID);
}それ以外{
this.newID = 1;
}
this.newID を返します。
}catch(例外 e){
System.out.println(e.toString());
-1 を返します。
}
}
public int getID()
{
this.newID を返します。
}
public boolean register(文字列のユーザー名、文字列のパスワード、文字列の確認、文字列の電子メール)
{
試す{
DBConn regDBConn = 新しい DBConn();
String strSQL = "insert into tbl_user(id,name,pwd,email)values('" + this.newID +"','" + ユーザー名 + "','" + パスワード + "','" + 電子メール + " ')";
regDBConn.execute(strSQL);
true を返します。
}catch(例外 e){
System.out.println(e.toString());
false を返します。
}
public static void main(String args[]
)
{
試す{
reg newreg = 新しいreg();
System.out.println(newreg.reg("sssssssss","ssssss","ssssss"," [email protected] "));
DBConn myconn = 新しい DBConn();
myconn.executeQuery("select * from tbl_user");
while(myconn.rs_next())
{
System.out.println(myconn.rs_getInt("id") + " " + myconn.rs_getString("name") + " " + myconn.rs_getString("pwd") + " " + myconn.rs_getString("email") );
}
System.out.println(newreg.getID());
}catch(例外 e){
System.err.println(e.toString());
}
}
例
:
1. Bean ファイルは、上記の DBConn.class ファイルと同じディレクトリに配置する必要があります。
2. この例では主に登録プロセスを検討していますが、電子メールの検出やその他の方法を適用したい場合は、独自の方法を設計してください。
4. ユーザーログイン用のサーブレットを作成します:login.java
//login.java
//必要なクラスをインポートする
java.io.* をインポートします。
javax.servlet.* をインポートします。
インポート javax.servlet.http.*;
java.sql
.*;
パブリッククラスログインはHttpServletを拡張します
{
public void doGet(HttpServletRequest req,HttpServletResponse res)
throwsIOException、サーブレット例外
{
文字列ユーザー名 = req.getParameter("ユーザー名");
文字列パスワード = req.getParameter("パスワード");
if(this.checklogin(ユーザー名,パスワード))
{
Cookie mylogin = new Cookie("ユーザー名",ユーザー名);
mylogin.setVersion(1);
mylogin.setPath("/");
mylogin.setComment("あなたのログインユーザー名");
res.addCookie(mylogin);
}
//Cookie[] myCookies = req.getCookies();
//String nameValue = this.getCookieValue(myCookies,"ユーザー名","見つかりません");
//PrintWriter out = res.getWriter();
//out.println("ユーザー名" + ":" + nameValue);
//out.println("クッキーのテストが成功しました!");
res.sendRedirect("/index.jsp");
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
throwsIOException、サーブレット例外
{
doGet(req,res);
}
public static String getCookieValue(Cookie[] cookies,String cookieName,String defaultValue)
{
for(int i=0;i<cookies.length;i++) {
クッキー クッキー = クッキー[i];
if (cookieName.equals(cookie.getName()))
return(cookie.getValue());
}
戻り値(デフォルト値);
}
public boolean checklogin(文字列のユーザー名,文字列のパスワード)
{
試す{
DBConnloginConn = 新しい DBConn();
loginConn.executeQuery("select * from tbl_user where name='" + ユーザー名 + "'");
if(loginConn.rs_next())
{
System.out.println("接続が作成されました!");
if(loginConn.rs_getString("pwd").trim().equals(パスワード))
{
System.out.println(loginConn.rs_getString("name"));
true を返します。
}
それ以外
{
false を返します。
}
}
System.out.println("テストログイン成功!");
false を返します。
}catch(例外 e){
System.out.println(e.toString());
false を返します。
}
}
public static void main(String args[])
{
ログイン mylogin = 新しいログイン();
System.out.println(mylogin.checklogin("山東","山東"));
}
}
で説明します。
1. デフォルトの jdk1.4 にはサーブレット パッケージがありません。sun 社の Web サイトにアクセスして servlet.jar をダウンロードし、それを jdk ディレクトリの下の jrelib ディレクトリに置き、servlet.jar パッケージをJCreator 2 の jdk 設定。
このサーブレットはユーザー名とパスワードを検証するために使用されます。正しい場合、ユーザー名は Cookie に書き込まれます。完了すると、現在のページがindex.jsp ページにリダイレクトされます。
5. ユーザーがログインしたかどうかを検出する Bean を作成します。 checkLogin.java
//checkLogin.java
//必要なクラスをインポートします。
java.io.* をインポートします。
javax.servlet.* をインポートします。
javax.servlet.http
.*;
パブリッククラスチェックログイン
{
public String ユーザー名 = "";
public boolean check(HttpServletRequest req,HttpServletResponse res)
throwsIOException、サーブレット例外
{
文字列 cookieName = "ユーザー名";
Cookie[] myCookies = req.getCookies();
this.username = this.getCookieValue(myCookies,cookieName,"見つかりません");
PrintWriter 出力 = res.getWriter();
if(この.ユーザー名 != null)
{
//out.println("おはようございます" + this.username + "!");
true を返します。
}それ以外{
out.println("ログインに失敗しました!");
false を返します。
}
}
パブリック String getUserName()
{
this.username を返します。
}
public static String getCookieValue(Cookie[] cookies,String cookieName,String defaultValue)
{
for(int i=0;i<cookies.length;i++) {
クッキー クッキー = クッキー[i];
if (cookieName.equals(cookie.getName()))
return(cookie.getValue());
}
戻り値(デフォルト値);
}
説明
: この Bean は Cookie 内のユーザー名を検出します。それが空でない場合はログインしていることを意味し、空でない場合はログインしていないことを意味します。この方法は完璧ではないため、自分で拡張することができます。
6. JRun でショッピング サーバーを作成します。 JRun Administrator を開き、新しいショッピング サーバーを作成します。ここでのポートは 8101 です。
上記のすべてのコンパイル済みクラス ファイルを org パッケージとともに、JRun のショッピング サーバーが配置されているディレクトリ内のクラス フォルダーにコピーします。パスは次のとおりです。
C:JRun4serversshoppingdefault-eardefault-warWEB-INFclasses
7. C:JRun4serversshoppingdefault-eardefault-war ディレクトリに jsp ファイル アプリケーション DW を作成します。次のように新しい jsp ファイルを作成します。
インデックス.jsp:
<%@ ページ contentType="text/html;charset=gb2312" pageEncoding="gb2312" %>
<html>
<頭>
<title>ショッピング 123</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"scope="page"/>
<%
ブール値ログイン = checklogin.check(リクエスト,レスポンス);
%>
<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">ショッピング123</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>
</テーブル>
<%
if(!ログイン){
%>
<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">保管場所の入り口</td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">メンバー</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">パスワード</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">登録</a></td>
<td align="center" bgcolor="#FFFFFF"><input type="submit" name="Submit" value="Enter"></td>
</tr>
</form>
</テーブル>
<%
}
それ以外
{
out.println("こんにちは、" + 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 align="center" bgcolor="#990000">
<td height="60" colspan="5" class="white">著作権©2003 Shopping123</td>
</tr>
</テーブル>
</body>
</html>
reg.jsp<%@ page contentType="text/html;charset=gb2312" pageEncoding="gb2312" %>
<html>
<頭>
<title>ショッピング 123</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">ショッピング123</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>
</テーブル>
<table width="100%" border="0" cellpadding="0" cellpacing="1" bgcolor="#CCCCCC">
<form action="regpost.jsp" method="post" name="form1">
<tr align="center">
<td height="30" colspan="2" bgcolor="#CCCCCC" class="deepred">会員登録</td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">メンバー</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">パスワード</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">パスワードを確認してください</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">電子メール</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="Register"></td>
</tr>
</form>
</table></td>
<td width="1" valign="top"></td>
<td width="100"> </td>
</tr>
<tr align="center" bgcolor="#990000">
<td height="60" colspan="5" class="white">著作権©2003 Shopping123</td>
</tr>
</テーブル>
</body>
</html>
regpost.jsp: 登録フォーム送信ページ <%@ page contentType="text/html;charset=gb2312" pageEncoding="gb2312" %>
<%@ page import="reg"%>
<html>
<頭>
<title>ショッピング 123</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 ユーザー名 = new String(request.getParameter("ユーザー名").getBytes("ISO8859_1")).trim();
文字列パスワード = new String(request.getParameter("パスワード").getBytes("ISO8859_1")).trim();
Stringconfirm = 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">ショッピング123</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>
</テーブル>
<jsp:useBean id="regID" class="reg"scope="session"/>
<%
if(regID.reg(ユーザー名,パスワード,確認,メールアドレス))
{
out.print("ok");
文字列 newID = regID.getID() + "";
%>
<table width="100%" border="0" cellpadding="0" cellpacing="1" bgcolor="#CCCCCC">
<tr align="center">
<td height="30" colspan="2" bgcolor="#CCCCCC" class="deepred">おめでとうございます。登録は成功しました。 </td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">数値</td>
<td align="center" bgcolor="#FFFFFF"><%=newID%></td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">メンバー</td>
<td align="center" bgcolor="#FFFFFF"><%=username%></td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">パスワード</td>
<td align="center" bgcolor="#FFFFFF"><%=password%></td>
</tr>
<tr>
<td width="50%" height="24" align="center" bgcolor="#FFFFFF">電子メール</td>
<td align="center" bgcolor="#FFFFFF"><%=email%></td>
</tr>
</テーブル>
<%
out.print("<br>");
out.print("<a href=javascript:window.close()>閉じる</a>");
}それ以外{
out.print("登録に失敗しました!<br>");
out.print("このユーザー名はすでに使用されています。別のユーザー名を使用してください!");
out.print("<a href=javascript:history.go(-1)>Return</a>");
}
%>
</td>
<td width="1" valign="top"></td>
<td width="100"> </td>
</tr>
<tr align="center" bgcolor="#990000">
<td height="60" colspan="5" class="white">著作権©2003 Shopping123</td>
</tr>
</テーブル>
</body>
</html>
ここまでで、ユーザー登録とログインシステムが完成しました。 これは私が学びながら完成させたものであるため、コードには多くの不完全な点があるはずです。皆さんは私を批判したり修正したりすることを歓迎します。 上記のコードはすべて私によってテストされました。