本文主要參考了,JSP+javabean循序漸進
開發平臺:winxp+tomcat4+mysql+javabean
在實現在了用servlet注冊還有登錄以后,打算做一個注冊頁面
首先創建一個表:username VARCHAR2(20) 用戶名
password VARCHAR2(20) 密碼
email VARCHAR2(30) Email地址
homepage VARCHAR2(50) 主頁
signs VARCHAR2(200) 簽名
regtime DATE 注冊時 //這個date我沒有實現
主要有三個jsp頁面:
addnewuser.jsp,主要用來實現注冊用戶的界面,
doadduser.jsp 實現填加到數據庫中的具體功能
listuser.jsp 來實現顯示所有用戶信息
兩個bean:
db.java實現數據庫的操作,主要有兩個方法public ResultSet executeQuery(sql)返回rs用來進行記錄的查詢
public boolean executeUpdate(String sql)用來進行記錄的更新
adduser.java繼承了db類用來提供所需更新和查詢的sql語句;
我直接調用原文的代碼時后發現調用了span什么,不太懂,而且有很多字符不對,所以調試時的問題基本上都是html代碼的問題.這是一個僅有基本功能,很多方面還需進一步完善,比如實現注冊時間(雖然這不難,可是我還沒看util.date和sql.date 區別),email地址的識別,連登錄都沒有做 :) ,我發現基于這種bean結構的功能很吸引人,比servlet要好,膚淺之見
源碼如下:db.java
package rkind;
import java.net.*;
import java.sql.*;
import java.lang.*;
import java.io.*;
import java.util.*;
public class db {
//成員變量初始化
Connection conn = null; //數據庫連接
ResultSet rs = null; //記錄集
String Username=""; //用戶名
String Password=""; //密碼
String Email=""; //email
String Homepage=""; //主頁
String Signs=""; //簽名
String url="jdbc:mysql://172.20.0.73/rk";
//db的構建器
public db() {
try {
//注冊數據庫驅動程序為Oracle驅動
String name="org.gjt.mm.mysql.Driver";
Class.forName(name);
conn = DriverManager.getConnection(url,"root","你的密碼");
System.out.println("success");
}
catch(Exception e) {
//這樣寫是為了方便調試程序,出錯打印mydb()就知道在什么地方出錯了
System.err.println("mydb(): " + e.getMessage());
}
}
//executeQuery方法用于進行記錄的查詢操作
//入口參數為sql語句,返回ResultSet對象
public ResultSet executeQuery(String sql) {
rs = null;
try {
//建立數據庫連接,使用Oracle的一種thin連接方式,demo為主機名字,demodb為數據庫,后面的兩個
//demo為用戶名和密碼
Statement stmt = conn.createStatement();
//執行數據庫查詢操作
rs = stmt.executeQuery(sql);
}
catch(SQLException ex) {
System.err.println("db.executeQuery: " + ex.getMessage());
}
return rs;
}
//executeUpdate方法用于進行add或者update記錄的操作
//入口參數為sql語句,成功返回true,否則為false
public boolean executeUpdate(String sql) {
boolean bupdate=false;
rs = null;
try {
//建立數據庫連接,其它參數說明同上面的一樣
Statement stmt = conn.createStatement();
int rowCount = stmt.executeUpdate(sql);
//如果不成功,bupdate就會返回0
if(rowCount!=0)bupdate=true;
}
catch(SQLException ex) {
//打印出錯信息
System.err.println("db.executeUpdate: " + ex.getMessage());
}
return bupdate;
}
//toChinese方法用于將一個字符串進行中文處理
//否則將會是???這樣的字符串
public static String toChinese(String strvalue) {
try{
if(strvalue==null)
{
return null;
}
else {
strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");
return strvalue;
}
}catch(Exception e){
return null;
}
}
}
adduser.java
package rkind;
import java.sql.*;
import java.lang.*;
import java.util.Date;
//adduser由db派生出來,擁有db的成員變量和方法
public class adduser extends db {
//構建器
public boolean addNewUser(){
boolean boadduser=false;
try {
//進行用戶注冊的記錄添加操作,生成sql語句
String sSql=new String("insert into demo(username,password,email,homepage, signs)");
sSql=sSql+ " values('"+Username+"','"+Password+"','"+Email+"','"+Homepage +"','"+Signs+"')";
//一種調試的方法,可以打印出sql語句,以便于查看錯誤
System.out.println(sSql);
//調用父類的executeUpdate方法,并根據成功以否來設置返回值
if(super.executeUpdate(sSql))boadduser=true;
}
catch(Exception ex) {
//出錯處理
System.err.println("adduser.addNewUser: " + ex.getMessage());
}finally{
//無論是否出錯,都要返回值
return boadduser;
}
}
//checkUser()方法用來檢查用戶名是否重復
//如果重復返回一個false
public boolean checkUser(){
boolean boadduser=false;
try {
//構建sql查詢語句
String sSql="select * from demo where username='"+Username+"'";
//調用父類的executeQuery方法
if((super.executeQuery(sSql)).next()){
//查詢出來的記錄集為空
boadduser=false;
}else{
boadduser=true;
}
}
catch(Exception ex) {
//出錯處理
System.err.println("adduser.addNewUser: " + ex.getMessage());
}finally{
//返回值
return boadduser;
}
}
public String getUsername(){ return Username;}
public void setUsername(String newUsername){
//用戶名有可能是中文,需要進行轉換
Username =db.toChinese(newUsername);}
//屬性密碼Password的get/set方法
public String getPassword(){
return Password;}
public void setPassword(String newPassword){ Password = newPassword;}
//屬性Email的get/set方法
public String getEmail(){ return Email;}
public void setEmail(String newEmail){ Email = newEmail;}
//屬性主頁Homepage的get/set方法
public String getHomepage(){ return Homepage;}
public void setHomepage(String newHomepage){ Homepage = newHomepage;}
//屬性主頁Signs的get/set方法
public String getSigns(){ return Signs;}
public void setSigns(String newSigns){
//簽名有可能是中文,需要進行轉換
Signs = db.toChinese(newSigns);}
}
newuser.jsp
<%@ page contentType="text/html;charset=gb2312"%>
<% response.setHeader("Expires","0"); %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>新用戶注冊 </title>
</head>
<body bgcolor="#FFFAD9">
<script language="JavaScript">
function valid(form)
{
if(form.username.value.length==0)
{
alert("Please enter username!");
form.username.focus();
return false;
}
if(form.Password.value==form.password1.value){
alert("你輸入的驗證密碼不正確");
form.password1.focus();
}
}
</script>
<p align="center"><font color="#8484FF"><strong><big>新個人
用戶注冊 </font>
<form onsubmit="return valid(this)" method="POST" name="formreg" action="donewuser.jsp">
<div align="center"><center>
<table width="49%" height="281"
border="1"
cellspacing="0">
<tr>
<td width="27%" bgcolor="#DDDDFF" align="center">用戶名:
<td width="73%" bgcolor="#DDDDFF"><input type="text"
name="username" size="20" >
<font color="#00CCFF"><b>* </b></font>
</tr>
<tr>
<td width="27%" bgcolor="#DDDDFF" align="center">輸入密碼:
<td width="73%" bgcolor="#DDDDFF"><input type="password" name="password" size="20"
>
<font color="#FF0000"><b>* </b></font>
</tr>
<tr>
<td width="27%" bgcolor="#DDDDFF" align="center">校驗密碼:
<td width="73%" bgcolor="#DDDDFF"><input type="password" name="password1" size="20"
>
<font color="#FF0000"><b>* </b></font>
</tr>
<tr>
<td width="27%" bgcolor="#DDDDFF" align="center">E-mail
<td width="73%" bgcolor="#DDDDFF"><input type="text" name="email" size="20" >
<font color="#FF0000">* </font>
</tr>
<tr>
<td width="27%" bgcolor="#DDDDFF" align="center">主頁地址:
<td width="73%" bgcolor="#DDDDFF"><input type="text" name="homepage" size="20"
value="http://">
</tr>
<tr>
<td width="100%" height="20" colspan="2" bgcolor="#DDDDFF"><br>
<center>
<font color="red"><b>介紹自己: (介紹自己,不能超過120字)</span></b></font>
</center> </tr>
<td width="70%">
<tr>
<td><textarea rows="6"
name="signs" cols="30" ></textarea>
</tr>
<tr>
<td width="30%" bgcolor="#DDDDFF" colspan="2"><center>
<p>
<input
type="submit" value="遞交" onClick="return checkmsg();" name="B1" >
<input type="reset" value="清除" name="B2" >
</center>
</tr>
</table>
</div>
</form>
<hr size="1" color="#FF0000">
<p align="center">Better View:800*600 Best View:1024x768
為了本系統能夠更好的為您服務,請使用IE4.0或以上版本瀏覽器
<font color="#000000"></font><a href="javascript:%20newGuide("copyright.htm")"
target="_self">版權所有 </a>
</body>
</html>
listuser.jsp
<%@ page contentType="text/html;charset=gb2312"%>
<% response.setHeader("Expires","0"); %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="org.gjt.mm.mysql.Driver.*" %>
<!--生成一個JavaBean:lyf.db的實例-->
<jsp:useBean id="db" class="rkind.db" scope="request"/>
<jsp:setProperty name="db" property="*"/>
<%
java.lang.String strSQL; //SQL語句
int intPageSize; //一頁顯示的記錄數
int intRowCount; //記錄總數
int intPageCount; //總頁數
int intPage; //待顯示頁碼
java.lang.String strPage;
int i,j,k;
//設置一頁顯示的記錄數
intPageSize = 15;
//取得待顯示頁碼
strPage = request.getParameter("page");
if(strPage==null){//表明在QueryString中沒有page這一個參數,此時顯示第一頁數據
intPage = 1;
}
else{//將字符串轉換成整型
intPage = java.lang.Integer.parseInt(strPage);
if(intPage<1) intPage = 1;
}
//獲取記錄總數
strSQL = "select count(*) from demo";
ResultSet result = db.executeQuery(strSQL); //執行SQL語句并取得結果集
result.next(); //記錄集剛打開的時候,指針位于第一條記錄之前
intRowCount = result.getInt(1);
result.close(); //關閉結果集
//記算總頁數
intPageCount = (intRowCount+intPageSize-1) / intPageSize;
//調整待顯示的頁碼
if(intPage>intPageCount) intPage = intPageCount;
strSQL="select * from demo ";
//執行SQL語句并取得結果集
result = db.executeQuery(strSQL);
//將記錄指針定位到待顯示頁的第一條記錄上
i = (intPage-1) * intPageSize;
for(j=0;j<i;j++) result.next();
%>
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>用戶列表</title>
</head>
<body bgcolor="#FFEBBD">
<div align="center"><center>
<table border="1"
borderColorDark="#FFFFFF" borderColorLight="#000000" cellspacing="0" height="22"
width="100%">
<tr bgcolor="#FFEBAD">
<td height="1" width="691" class="main">
第<%=intPage%>頁 共<%=intPageCount%>頁
<a href="listuser.jsp?page=0">首頁</a>
<%if(intPage>1){%><a href="listuser.jsp?page=<%=intPage-1%>">上一頁</a><%}%>
<%if(intPage<=1){%>上一頁<%}%>
<%if(intPage<intPageCount){%><a href="listuser.jsp?page=<%=intPage+1%>">下一頁</a><%}%>
<%if(intPage>=intPageCount){%>下一頁<%}%>
<a href="listuser.jsp?page=<%=intPageCount%>">尾頁</a>
第<input type="text" class="main" name="page" size="3" value="<%=intPage%>" tabindex="1">頁<input type="submit" class="main" value="go" name="B1" tabindex="2"><class="main">
</td></tr></table></form>
<table border="1" width="100%" cellspacing="0" bordercolorlight="#000000"
bordercolordark="#FFFFFF" class="main">
<tr bgcolor="#FFEBAD">
<td >
<div align="left">用戶名</div>
</td>
<td >
<p align="center">Email
</td>
<td >
<p align="center">主頁
</td>
<td>
<p align="center">登記時間
</td>
<td>
<p align="center">說明
</td>
</tr>
<%
//顯示數據
i = 0;
while(i<intPageSize && result.next()){
%>
<tr bgcolor="#FFEBAD">
<td>
<div align="left"><%=result.getString("username") %></div></td>
<td><div align="center"><%=result.getString("email") %></a></div></td>
<td><div align="center"><font color="#0000CC"><%=result.getString("homepage") %></font></div></td>
<td><div align="center"><font color="#FF6666"><%=result.getDate("regtime") %></font></div></td>
<td><div align="center"><font color="#0000FF"><%=result.getString("signs") %></font></div></td></tr>
<%
i++;
}
%>
</table>
<% result.close(); //關閉結果集%>
</body>
</html>
donewuser.jsp
<%@ page contentType="text/html;charset=gb2312"%>
<% response.setHeader("Expires","0"); %>
<!--生成一個JavaBean:lyf.adduser的實例,id為adduser,生存范圍為page-->
<jsp:useBean id="adduser" class="rkind.adduser" scope="page"/>
<!--設置JavaBean中各個屬性的值,這會調用JavaBean中各個屬性的set方法,以便JavaBean得到正確的屬性值,”*”代表進行所有屬性的匹配-->
<jsp:setProperty name="adduser" property="*"/>
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>用戶添加</title>
</head>
<body bgcolor="#FFEBBD">
<div align="center"><center>
<%
//調用lyf.adduser的checkUser()方法檢查是否有重復的用戶名
//如果有重復就顯示對應的信息
if(!adduser.checkUser())
{
//頁面文字輸出信息,使用jsp內置對象out的println方法,相當于asp中的response.write方法
out.println("對不起,這個用戶名"+adduser.getUsername()+"已經被申請了,請重新選擇!");
//return代表返回,運行時候碰到return就不會進行下面的處理了,功能相當于asp中的response.end
return;
}
%>
<%
//如果沒有用戶名重復的問題,調用lyf.adduser的addNewUser()方法來將用戶數據添加到數據庫中,并根據數據添加成功否來顯示對應的信息
if(adduser.addNewUser()){
%>
<H2>添加用戶成功!</P>
<%}else{%>
<H2>添加用戶失敗,請和管理員聯系!</P>
<%}%>
</BODY>
</HTML>