JavaWeb實(shí)現(xiàn)用戶登錄與注冊(cè)功能(服務(wù)器)
本文實(shí)例為大家分享了JavaWeb實(shí)現(xiàn)用戶登錄與注冊(cè)功能的具體代碼,供大家參考,具體內(nèi)容如下
用到的知識(shí)
客戶端:HTML CSS JS (JQuery)
服務(wù)器:JAVA基礎(chǔ) JSP Servlet JDBC Tomcat
數(shù)據(jù)庫(kù):MySQL
用到的Jar包 druid數(shù)據(jù)庫(kù)連接池 dbutils JDBC數(shù)據(jù)庫(kù)操作工具 MySQL jar包
總體結(jié)構(gòu):
思路:
服務(wù)器部分采用JavaEE三層架構(gòu)
(1)、表現(xiàn)層:通俗講就是展現(xiàn)給用戶的界面,即用戶在使用一個(gè)系統(tǒng)的時(shí)候他的所見(jiàn)所得。
(2)、業(yè)務(wù)邏輯層:針對(duì)具體問(wèn)題的操作,也可以說(shuō)是對(duì)數(shù)據(jù)層的操作,對(duì)數(shù)據(jù)業(yè)務(wù)邏輯處理。
(3)、數(shù)據(jù)訪問(wèn)層:該層所做事務(wù)直接操作數(shù)據(jù)庫(kù),針對(duì)數(shù)據(jù)的增添、刪除、修改、查找等。
先創(chuàng)建基本的文件夾架構(gòu),三層的文件夾依次為web ,servlet ,DAO。 此外還有其他相關(guān)文件夾工具類(lèi)utils,JAVABean類(lèi)pojo,測(cè)試類(lèi)test 。依次實(shí)現(xiàn)從DAO層到Servce層再到Web層。
文件夾架構(gòu)
資源文件 jdbc.properties
username=root password=123456 url=jdbc:mysql://localhost:3306/book driverClassName=com.mysql.jdbc.Driver initialSize=5 maxActive=10
一、DAO層
0.寫(xiě)好JAVABean User類(lèi)
package com.book.pojo; public class User { private Integer id; private String username; private String password; private String email; public User() { } public User(Integer id, String username, String password, String email) { this.id = id; this.username = username; this.password = password; this.email = email; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } 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 String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + '}'; } }
1.先實(shí)現(xiàn)數(shù)據(jù)連接
JDBCUtils
package com.book.utils; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; public class JDBCUtils { private static DruidDataSource druidDataSource; //數(shù)據(jù)庫(kù)連接池初始化 static { try { InputStream resourceAsStream = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");//類(lèi)加載器默認(rèn)是從classPath路徑加載資源 Properties properties = new Properties(); properties.load(resourceAsStream); //創(chuàng)建數(shù)據(jù)庫(kù)連接池 druidDataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { System.out.println("數(shù)據(jù)庫(kù)連接池初始化異常"); } } //獲取數(shù)據(jù)庫(kù)連接池中的連接 public static Connection getConnection() { Connection connection= null; try { connection = druidDataSource.getConnection(); } catch (SQLException throwables) { throwables.printStackTrace(); } return connection; } public static void close(Connection connection) { try { connection.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } public static void main(String[] args) { JDBCUtils jdbcUtils=new JDBCUtils(); System.out.println(jdbcUtils.getConnection()); } }
2.測(cè)試連接是否成功
3.編寫(xiě)B(tài)aseDAO 實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的基本通用操作
package com.book.DAO; import com.book.utils.JDBCUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public abstract class BaseDAO { private QueryRunner queryRunner=new QueryRunner(); //數(shù)據(jù)庫(kù)通用操作,使用dbutils來(lái)操作 //用來(lái)執(zhí)行updata,delete,insert public int updata(String sql,Object...objects){ Connection connection= JDBCUtils.getConnection(); try { return queryRunner.update(connection,sql,objects);//返回影響的行數(shù) } catch (SQLException throwables) { throwables.printStackTrace(); } return -1; } //用來(lái)執(zhí)行查詢操作 public <T>T queryForOne(Class<T>clazz,String sql,Object...objects){ Connection connection=JDBCUtils.getConnection(); try { return queryRunner.query(connection,sql,new BeanHandler<T>(clazz),objects); } catch (Exception throwables) { throwables.printStackTrace(); } return null; } //查詢多個(gè)結(jié)果 public <T>List<T> queryForList(Class<T>clazz,String sql,Object...objects){ Connection connection=JDBCUtils.getConnection(); List<T>list=new ArrayList<>(); try { list=queryRunner.query(connection,sql,new BeanListHandler<T>(clazz),objects); } catch (SQLException throwables) { throwables.printStackTrace(); } return list; } //查詢單個(gè)數(shù) public Object queryForSingleValue(String sql,Object...objects){ Connection connection= JDBCUtils.getConnection(); try { return queryRunner.query(connection,sql,new ScalarHandler(),objects); } catch (SQLException throwables) { throwables.printStackTrace(); } return null; } }
4.編寫(xiě)UserDAO接口確定需要的操作
package com.book.DAO; import com.book.pojo.User; public interface UserDAO { // 注冊(cè)時(shí)判斷是否該用戶名已經(jīng)被注冊(cè) 根據(jù)用戶名查詢用戶信息 如果返回null說(shuō)明沒(méi)有該用戶 public User queryUserByUsername(String username); //注冊(cè)成功 保存用戶信息 public int saveUser(User user); //登錄操作 根據(jù)用戶名和密碼查詢用戶 查不到返回null public User queryUserByUsernameAndPassword(String username,String password); }
5.UserDAOImpl實(shí)現(xiàn)UserDAO接口
package com.book.DAO; import com.book.pojo.User; //所犯錯(cuò)誤:繼承的子類(lèi)會(huì)有父類(lèi)的全部方法,不要在子類(lèi)中聲明父類(lèi)對(duì)象,調(diào)用父類(lèi)方法 public class UserDAOimpl extends BaseDAO implements UserDAO{ @Override public User queryUserByUsername(String username) { String sql="select * from users where username=?"; User user =queryForOne(User.class,sql,username); return user; } //所犯錯(cuò)誤:輸入的郵箱不能重復(fù) @Override public int saveUser(User user) { String sql="INSERT INTO `users`(`username`,`password`,`email`) VALUES(?,?,?)"; int n; n = updata(sql,user.getUsername(),user.getPassword(),user.getEmail()); return n; } @Override public User queryUserByUsernameAndPassword(String username, String password) { String sql="select * from users where username=? and password=?"; User user=queryForOne(User.class,sql,username,password); return user; } }
二、Servlet層
1.UserServce接口確定業(yè)務(wù)需要的方法,用來(lái)與Web層進(jìn)行交互
package com.book.servlet; import com.book.pojo.User; //業(yè)務(wù)層一個(gè)業(yè)務(wù)一個(gè)方法 public interface UserServce { //注冊(cè)業(yè)務(wù) 注冊(cè)成功將用戶保存到數(shù)據(jù)庫(kù)中 public void registUser(User user); //登錄業(yè)務(wù) public User login(User user); //檢查用戶名是否可用 返回true表示用戶名已存在 public boolean existUsername(String username); }
2.UserServceImpl類(lèi)實(shí)現(xiàn)UserServce接口
package com.book.servlet; import com.book.DAO.UserDAO; import com.book.DAO.UserDAOimpl; import com.book.pojo.User; public class UserServceImpl implements UserServce { private UserDAO userDAO=new UserDAOimpl(); @Override public void registUser(User user) { userDAO.saveUser(user); } @Override public User login(User user) { return userDAO.queryUserByUsernameAndPassword(user.getUsername(),user.getPassword()); } @Override public boolean existUsername(String username) { //用戶名不存在 if(userDAO.queryUserByUsername(username)==null){ return false; }else { return true; } } }
三、Web層
1.注冊(cè)操作
package com.book.web; import com.book.pojo.User; import com.book.servlet.UserServce; import com.book.servlet.UserServceImpl; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class RegistServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { UserServce userServce=new UserServceImpl(); //獲取請(qǐng)求參數(shù) String username=req.getParameter("username"); String password=req.getParameter("password"); String email=req.getParameter("email"); String code=req.getParameter("code"); //判斷驗(yàn)證碼是否正確 忽略大小寫(xiě) if("6n6np".equalsIgnoreCase(code)){ //判斷是否存在用戶名 if(!userServce.existUsername(username)){ //不存在則將注冊(cè)信息寫(xiě)入數(shù)據(jù)庫(kù) User user=new User(null,username,password,email); userServce.registUser(user); //請(qǐng)求轉(zhuǎn)發(fā)到注冊(cè)成功頁(yè)面 req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req,resp); }else{ System.out.println("用戶名已存在"); //跳轉(zhuǎn)到注冊(cè)頁(yè)面 req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp); } }else { System.out.println("驗(yàn)證碼錯(cuò)誤"); //跳轉(zhuǎn)到注冊(cè)頁(yè)面 req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp); } } }
2.登錄操作
package com.book.web; import com.book.pojo.User; import com.book.servlet.UserServce; import com.book.servlet.UserServceImpl; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class LoginServlet extends HttpServlet { private UserServce userServce=new UserServceImpl(); @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //獲取請(qǐng)求參數(shù) String username=req.getParameter("username"); String password=req.getParameter("password"); User user=new User(null,username,password,null); //判斷用戶的賬號(hào)密碼是否正確 if(userServce.login(user)!=null){ //登錄成功跳轉(zhuǎn)到登錄成功頁(yè)面 System.out.println("登錄成功"); req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req,resp); }else{ //賬號(hào)或密碼不正確 System.out.println("賬號(hào)或密碼不正確"); req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp); } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring框架基于AOP實(shí)現(xiàn)簡(jiǎn)單日志管理步驟解析
這篇文章主要介紹了Spring框架基于AOP實(shí)現(xiàn)簡(jiǎn)單日志管理步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Spring Cloud Config對(duì)特殊字符加密處理的方法詳解
這篇文章主要給大家介紹了關(guān)于Spring Cloud Config對(duì)特殊字符加密處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2018-05-05Java并發(fā)LinkedBlockingQueue源碼分析
這篇文章主要為大家介紹了Java并發(fā)LinkedBlockingQueue源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Mybatis批量操作sql寫(xiě)法示例(批量新增、更新)
Mybatis技術(shù),現(xiàn)在是工作中使用頻率越來(lái)越高,我們?cè)趯?duì)數(shù)據(jù)庫(kù)進(jìn)行操作的時(shí)候,經(jīng)常會(huì)遇到批量操作的需求,這篇文章主要給大家介紹了關(guān)于Mybatis批量操作sql寫(xiě)法的相關(guān)資料,需要的朋友可以參考下2021-05-05java編程之單元測(cè)試(Junit)實(shí)例分析(附實(shí)例源碼)
這篇文章主要介紹了java編程之單元測(cè)試(Junit),結(jié)合實(shí)例形式較為詳細(xì)的分析總結(jié)了Java單元測(cè)試的原理、步驟及相關(guān)注意事項(xiàng),并附帶了完整代碼供讀者下載參考,需要的朋友可以參考下2015-11-11java HashMap和HashTable的區(qū)別詳解
這篇文章主要介紹了java HashMap和HashTable的區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12Spring Boot實(shí)戰(zhàn)教程之自動(dòng)配置詳解
Spring Boot的自動(dòng)配置給開(kāi)發(fā)者帶來(lái)了很大的便利,當(dāng)開(kāi)發(fā)人員在pom文件中添加starter依賴(lài)后,maven或者gradle會(huì)自動(dòng)下載很多jar包到classpath中。下面這篇文章主要給大家介紹了關(guān)于Spring Boot自動(dòng)配置的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-07-07SpringBoot異步實(shí)現(xiàn)的8種方式
異步執(zhí)行對(duì)于開(kāi)發(fā)者來(lái)說(shuō)并不陌生,在實(shí)際的開(kāi)發(fā)過(guò)程中,很多場(chǎng)景多會(huì)使用到異步,本文主要介紹了SpringBoot異步實(shí)現(xiàn)的8種方式,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09httpclient 請(qǐng)求http數(shù)據(jù),json轉(zhuǎn)map的實(shí)例
下面小編就為大家?guī)?lái)一篇httpclient 請(qǐng)求http數(shù)據(jù),json轉(zhuǎn)map的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12