JavaWeb實現(xiàn)用戶登錄與注冊功能(服務器)
本文實例為大家分享了JavaWeb實現(xiàn)用戶登錄與注冊功能的具體代碼,供大家參考,具體內(nèi)容如下
用到的知識
客戶端:HTML CSS JS (JQuery)
服務器:JAVA基礎(chǔ) JSP Servlet JDBC Tomcat
數(shù)據(jù)庫:MySQL
用到的Jar包 druid數(shù)據(jù)庫連接池 dbutils JDBC數(shù)據(jù)庫操作工具 MySQL jar包
總體結(jié)構(gòu):
思路:
服務器部分采用JavaEE三層架構(gòu)
(1)、表現(xiàn)層:通俗講就是展現(xiàn)給用戶的界面,即用戶在使用一個系統(tǒng)的時候他的所見所得。
(2)、業(yè)務邏輯層:針對具體問題的操作,也可以說是對數(shù)據(jù)層的操作,對數(shù)據(jù)業(yè)務邏輯處理。
(3)、數(shù)據(jù)訪問層:該層所做事務直接操作數(shù)據(jù)庫,針對數(shù)據(jù)的增添、刪除、修改、查找等。
先創(chuàng)建基本的文件夾架構(gòu),三層的文件夾依次為web ,servlet ,DAO。 此外還有其他相關(guān)文件夾工具類utils,JAVABean類pojo,測試類test 。依次實現(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.寫好JAVABean User類
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.先實現(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ù)庫連接池初始化 static { try { InputStream resourceAsStream = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");//類加載器默認是從classPath路徑加載資源 Properties properties = new Properties(); properties.load(resourceAsStream); //創(chuàng)建數(shù)據(jù)庫連接池 druidDataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { System.out.println("數(shù)據(jù)庫連接池初始化異常"); } } //獲取數(shù)據(jù)庫連接池中的連接 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.測試連接是否成功
3.編寫B(tài)aseDAO 實現(xiàn)對數(shù)據(jù)庫的基本通用操作
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ù)庫通用操作,使用dbutils來操作 //用來執(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; } //用來執(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; } //查詢多個結(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; } //查詢單個數(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.編寫UserDAO接口確定需要的操作
package com.book.DAO; import com.book.pojo.User; public interface UserDAO { // 注冊時判斷是否該用戶名已經(jīng)被注冊 根據(jù)用戶名查詢用戶信息 如果返回null說明沒有該用戶 public User queryUserByUsername(String username); //注冊成功 保存用戶信息 public int saveUser(User user); //登錄操作 根據(jù)用戶名和密碼查詢用戶 查不到返回null public User queryUserByUsernameAndPassword(String username,String password); }
5.UserDAOImpl實現(xiàn)UserDAO接口
package com.book.DAO; import com.book.pojo.User; //所犯錯誤:繼承的子類會有父類的全部方法,不要在子類中聲明父類對象,調(diào)用父類方法 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; } //所犯錯誤:輸入的郵箱不能重復 @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è)務需要的方法,用來與Web層進行交互
package com.book.servlet; import com.book.pojo.User; //業(yè)務層一個業(yè)務一個方法 public interface UserServce { //注冊業(yè)務 注冊成功將用戶保存到數(shù)據(jù)庫中 public void registUser(User user); //登錄業(yè)務 public User login(User user); //檢查用戶名是否可用 返回true表示用戶名已存在 public boolean existUsername(String username); }
2.UserServceImpl類實現(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.注冊操作
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(); //獲取請求參數(shù) String username=req.getParameter("username"); String password=req.getParameter("password"); String email=req.getParameter("email"); String code=req.getParameter("code"); //判斷驗證碼是否正確 忽略大小寫 if("6n6np".equalsIgnoreCase(code)){ //判斷是否存在用戶名 if(!userServce.existUsername(username)){ //不存在則將注冊信息寫入數(shù)據(jù)庫 User user=new User(null,username,password,email); userServce.registUser(user); //請求轉(zhuǎn)發(fā)到注冊成功頁面 req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req,resp); }else{ System.out.println("用戶名已存在"); //跳轉(zhuǎn)到注冊頁面 req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp); } }else { System.out.println("驗證碼錯誤"); //跳轉(zhuǎn)到注冊頁面 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 { //獲取請求參數(shù) String username=req.getParameter("username"); String password=req.getParameter("password"); User user=new User(null,username,password,null); //判斷用戶的賬號密碼是否正確 if(userServce.login(user)!=null){ //登錄成功跳轉(zhuǎn)到登錄成功頁面 System.out.println("登錄成功"); req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req,resp); }else{ //賬號或密碼不正確 System.out.println("賬號或密碼不正確"); req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp); } } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring框架基于AOP實現(xiàn)簡單日志管理步驟解析
這篇文章主要介紹了Spring框架基于AOP實現(xiàn)簡單日志管理步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06Spring Cloud Config對特殊字符加密處理的方法詳解
這篇文章主要給大家介紹了關(guān)于Spring Cloud Config對特殊字符加密處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2018-05-05Java并發(fā)LinkedBlockingQueue源碼分析
這篇文章主要為大家介紹了Java并發(fā)LinkedBlockingQueue源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02java HashMap和HashTable的區(qū)別詳解
這篇文章主要介紹了java HashMap和HashTable的區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12httpclient 請求http數(shù)據(jù),json轉(zhuǎn)map的實例
下面小編就為大家?guī)硪黄猦ttpclient 請求http數(shù)據(jù),json轉(zhuǎn)map的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12