Java組件javabean用戶登錄實(shí)例詳解
本文簡(jiǎn)單講述使用javabean實(shí)現(xiàn)用戶登錄,包括用戶登錄,注冊(cè)和退出等。
1.關(guān)于javabean
JavaBean 是一種JAVA語(yǔ)言寫(xiě)成的可重用組件。為寫(xiě)成JavaBean,類必須是具體的和公共的,并且具有無(wú)參數(shù)的構(gòu)造器。JavaBean 通過(guò)提供符合一致性設(shè)計(jì)模式的公共方法將內(nèi)部域暴露成員屬性,set和get方法獲取。眾所周知,屬性名稱符合這種模式,其他Java 類可以通過(guò)自省機(jī)制發(fā)現(xiàn)和操作這些JavaBean 的屬性。
2.系統(tǒng)架構(gòu)
2.1登錄用例圖

2.2頁(yè)面流程圖

2.3系統(tǒng)架構(gòu)圖

2.4數(shù)據(jù)庫(kù)設(shè)計(jì)
本例使用oracle數(shù)據(jù)庫(kù)
用戶表包括id,用戶名,密碼,email,共4個(gè)字段
-- Create table create table P_USER ( id VARCHAR2(50) not null, username VARCHAR2(20), password VARCHAR2(20), email VARCHAR2(50) ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64 minextents 1 maxextents unlimited ); -- Add comments to the table comment on table P_USER is '用戶表'; -- Add comments to the columns comment on column P_USER.id is 'id'; comment on column P_USER.username is '用戶名'; comment on column P_USER.password is '密碼'; comment on column P_USER.email is 'email';
3.javabean編寫(xiě)
3.1開(kāi)發(fā)數(shù)據(jù)庫(kù)底層處理javabean
DBAcess.java
package com.baosight.bean;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**數(shù)據(jù)庫(kù)操作類
* <p>Title:DBAcess </p>
* <p>Description:TODO </p>
* <p>Company: </p>
* @author yuan
* @date 2016-5-22 下午12:40:24*/
public class DBAcess {
private String driver = "oracle.jdbc.driver.OracleDriver";
private String url = "jdbc:oracle:" + "thin:@127.0.0.1:1521:orcl";
private String username = "scott";
private String password = "tiger";
private Connection conn;
private Statement stm;
private ResultSet rs;
//創(chuàng)建連接
public boolean createConn() {
boolean b = false;
try {
Class.forName(driver);// 加載Oracle驅(qū)動(dòng)程序
conn = DriverManager.getConnection(url, username, password);
b = true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 獲取連接
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return b;
}
//修改
public boolean update(String sql){
boolean b = false;
try {
stm = conn.createStatement();
stm.execute(sql);
b = true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return b;
}
//查詢
public void query(String sql){
try {
stm = conn.createStatement();
rs = stm.executeQuery(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//判斷有無(wú)數(shù)據(jù)
public boolean next(){
boolean b = false;
try {
if(rs.next()){
b = true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return b;
}
//獲取表字段值
public String getValue(String field) {
String value = null;
try {
if (rs != null) {
value = rs.getString(field);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return value;
}
//關(guān)閉連接
public void closeConn() {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//關(guān)閉statement
public void closeStm() {
try {
if (stm != null) {
stm.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//關(guān)閉ResultSet
public void closeRs() {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Statement getStm() {
return stm;
}
public void setStm(Statement stm) {
this.stm = stm;
}
public ResultSet getRs() {
return rs;
}
public void setRs(ResultSet rs) {
this.rs = rs;
}
public void setConn(Connection conn) {
this.conn = conn;
}
public Connection getConn() {
return conn;
}
}
上述數(shù)據(jù)庫(kù)操作類使用JDBC連接數(shù)據(jù)庫(kù),并封裝了連接數(shù)據(jù)庫(kù)、查詢、修改、關(guān)閉資源等方法。
3.2開(kāi)發(fā)JavaBean業(yè)務(wù)邏輯組件
UserBean.java
package com.baosight.bean;
import com.baosight.util.GenerateUUID;
/**
* <p>Title:UserBean </p>
* <p>Description:TODO </p>
* <p>Company: </p>
* @author yuan
* @date 2016-5-22 下午1:05:00*/
public class UserBean {
//登錄驗(yàn)證
public boolean valid(String username,String password){
boolean isValid = false;
DBAcess db = new DBAcess();
if(db.createConn()){
String sql = "select * from p_user where username='"+username+"' and password='"+password+"'";
db.query(sql);
if(db.next()){
isValid = true;
}
db.closeRs();
db.closeStm();
db.closeConn();
}
return isValid;
}
//注冊(cè)驗(yàn)證
public boolean isExist(String username){
boolean isValid = false;
DBAcess db = new DBAcess();
if(db.createConn()){
String sql = "select * from p_user where username='"+username+"'";
db.query(sql);
if(db.next()){
isValid = true;
}
db.closeRs();
db.closeStm();
db.closeConn();
}
return isValid;
}
//注冊(cè)用戶
public boolean add(String username,String password,String email){
boolean isValid = false;
DBAcess db = new DBAcess();
if(db.createConn()){
String sql = "insert into p_user(id,username,password,email) values('"+GenerateUUID.next()+"','"+username+"','"+password+"','"+email+"')";
isValid = db.update(sql);
db.closeStm();
db.closeConn();
}
return isValid;
}
}
上述業(yè)務(wù)邏輯javabean,定義了登錄驗(yàn)證、注冊(cè)驗(yàn)證和新增用戶等方法
3.3關(guān)于生成唯一ID
上面在新增用戶時(shí)需要插入ID,本例使用UUID來(lái)生成唯一ID
GenerateUUID.java
package com.baosight.util;
import java.util.Date;
/**
* <p>Title:GenerateUUID </p>
* <p>Description:TODO </p>
* <p>Company: </p>
* @author yuan
* @date 2016-5-22 下午1:31:46*/
public class GenerateUUID {
private static Date date = new Date();
// private static StringBuilder buf = new StringBuilder();
private static int seq = 0;
private static final int ROTATION = 99999;
public static synchronized long next(){
if (seq > ROTATION) seq = 0;
// buf.delete(0, buf.length());
date.setTime(System.currentTimeMillis());
String str = String.format("%1$tY%1$tm%1$td%1$tk%1$tM%1$tS%2$05d", date, seq++);
return Long.parseLong(str);
}
public static void main(String[] args) {
for(int i=0;i<100;i++){
System.out.println(next());
}
}
}
4.頁(yè)面編寫(xiě)
4.1登錄頁(yè)面
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>登錄頁(yè)面</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="login_action.jsp" method="post">
<table>
<tr>
<td colspan="2">登錄窗口</td>
</tr>
<tr>
<td>用戶名:</td>
<td><input type="text" name="username" />
</td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="text" name="password" />
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登錄" /> <a href="register.jsp">注冊(cè)</a>
</td>
</tr>
</table>
</form>
</body>
</html>
頁(yè)面效果

4.2登錄業(yè)務(wù)邏輯處理頁(yè)面
login_action.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="com.baosight.bean.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
if(username==null||"".equals(username.trim())||password==null||"".equals(password.trim())){
//out.write("用戶名或密碼不能為空!");
System.out.println("用戶名或密碼不能為空!");
response.sendRedirect("login.jsp");
return;
//request.getRequestDispatcher("login.jsp").forward(request, response);
}
UserBean userBean = new UserBean();
boolean isValid = userBean.valid(username,password);
if(isValid){
System.out.println("登錄成功!");
session.setAttribute("username", username);
response.sendRedirect("welcome.jsp");
return;
}else{
System.out.println("用戶名或密碼錯(cuò)誤,登錄失敗!");
response.sendRedirect("login.jsp");
return;
}
%>
上面的JSP調(diào)用了Javabean進(jìn)行業(yè)務(wù)處理
當(dāng)用戶名或密碼為空時(shí)返回登錄頁(yè)面login.jsp
當(dāng)?shù)卿洺晒髮⒂脩粜畔⒈4娴絪ession,跳轉(zhuǎn)到歡迎頁(yè)面welcome.jsp
當(dāng)?shù)卿浭r(shí)返回登錄頁(yè)面login.jsp
4.3登錄成功歡迎頁(yè)面
welcome.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'welcom.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<table>
<tr>
<td><img src="images/logo4.png" />
</td>
<td><img src="images/logo2.png" height="90" />
</td>
</tr>
<tr>
<td colspan="2"><hr />
</td>
</tr>
<tr>
<td>
<table>
<tr>
<td><a>Main</a>
</td>
</tr>
<tr>
<td><a>Menu1</a>
</td>
</tr>
<tr>
<td><a>Menu2</a>
</td>
</tr>
<tr>
<td><a>Menu3</a>
</td>
</tr>
<tr>
<td><a>Menu4</a>
</td>
</tr>
<tr>
<td><a>Menu5</a>
</td>
</tr>
<tr>
<td><a>Menu6</a>
</td>
</tr>
<tr>
<td><a>Menu7</a>
</td>
</tr>
<tr>
<td><a>Menu8</a>
</td>
</tr>
</table></td>
<td>
<form action="loginout.jsp" method="post">
<table>
<tr>
<td colspan="2">登錄成功!</td>
</tr>
<tr>
<td>歡迎你,</td>
<td>${username }</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="退出" /></td>
</tr>
</table>
</form></td>
</tr>
</table>
</body>
</html>
頁(yè)面效果

4.4退出登錄業(yè)務(wù)處理頁(yè)面
loginout.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'loginout.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
session.removeAttribute("username");
response.sendRedirect("login.jsp");
%>
</body>
</html>
從session中移除用戶信息,跳轉(zhuǎn)到登錄頁(yè)面login.jsp
4.5用戶注冊(cè)頁(yè)面
register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>注冊(cè)頁(yè)面</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="register_action.jsp" method="post">
<table>
<tr>
<td colspan="2">注冊(cè)窗口</td>
</tr>
<tr>
<td>用戶名:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="text" name="password1" /></td>
</tr>
<tr>
<td>確認(rèn)密碼:</td>
<td><input type="text" name="password2" /></td>
</tr>
<tr>
<td>email:</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="注冊(cè)" /> <a href="login.jsp">返回</a></td>
</tr>
</table>
</form>
</body>
</html>
運(yùn)行效果

4.6注冊(cè)業(yè)務(wù)處理頁(yè)面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="com.baosight.bean.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%
String username = request.getParameter("username");
String password1 = request.getParameter("password1");
String password2 = request.getParameter("password2");
String email = request.getParameter("email");
if(username==null||"".equals(username.trim())||password1==null||"".equals(password1.trim())||password2==null||"".equals(password2.trim())||!password1.equals(password2)){
//out.write("用戶名或密碼不能為空!");
System.out.println("用戶名或密碼不能為空!");
response.sendRedirect("register.jsp");
return;
//request.getRequestDispatcher("login.jsp").forward(request, response);
}
UserBean userBean = new UserBean();
boolean isExit = userBean.isExist(username);
if(!isExit){
userBean.add(username, password1, email);
System.out.println("注冊(cè)成功,請(qǐng)登錄!");
response.sendRedirect("login.jsp");
return;
}else{
System.out.println("用戶名已存在!");
response.sendRedirect("register.jsp");
return;
}
%>
上面的JSP調(diào)用了Javabean進(jìn)行業(yè)務(wù)處理
當(dāng)用戶名或密碼為空時(shí)返回注冊(cè)頁(yè)面register.jsp
當(dāng)注冊(cè)用戶名在數(shù)據(jù)庫(kù)不存在時(shí),新增用戶
新增成功后跳轉(zhuǎn)到登錄頁(yè)面login.jsp
當(dāng)注冊(cè)用戶名在數(shù)據(jù)庫(kù)存在時(shí),返回注冊(cè)頁(yè)面register.jsp
5.總結(jié)
本例使用javabean對(duì)數(shù)據(jù)庫(kù)操作和業(yè)務(wù)邏輯處理進(jìn)行了封裝。
以上即為使用javabean實(shí)現(xiàn)用戶登錄的簡(jiǎn)單介紹,還需要不斷完善,希望大家一起學(xué)習(xí)進(jìn)步!
相關(guān)文章
MyBatis-Ext快速入門(mén)實(shí)戰(zhàn)
MyBatis-Ext是MyBatis的增強(qiáng)擴(kuò)展,和我們平常用的Mybatis-plus非常類似,本文主要介紹了MyBatis-Ext快速入門(mén)實(shí)戰(zhàn),感興趣的可以了解一下2021-10-10
Java基礎(chǔ)之ArrayList的擴(kuò)容機(jī)制
這篇文章主要介紹了Java基礎(chǔ)之ArrayList的擴(kuò)容機(jī)制,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05
SpringBoot如何使用RequestBodyAdvice進(jìn)行統(tǒng)一參數(shù)處理
這篇文章主要介紹了SpringBoot使用RequestBodyAdvice進(jìn)行統(tǒng)一參數(shù)處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
java實(shí)現(xiàn)省市區(qū)轉(zhuǎn)換成樹(shù)形結(jié)構(gòu)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)省市區(qū)轉(zhuǎn)換成樹(shù)形結(jié)構(gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08

