溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JSP怎么實現(xiàn)用戶登錄連接數(shù)據(jù)庫的功能

發(fā)布時間:2021-09-07 07:30:49 來源:億速云 閱讀:149 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“JSP怎么實現(xiàn)用戶登錄連接數(shù)據(jù)庫的功能”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

目錄
  • 關(guān)于JSP用戶登錄連接數(shù)據(jù)庫詳情

    • 1、首先創(chuàng)建po類

    • 2、創(chuàng)建底層UserDao

    • 3、創(chuàng)建UserService(一般都會調(diào)用UserDao)

    • 4、寫web層UserSrevlet

      • 4.1 重寫方法 

      • 4.2創(chuàng)建vo層并在里面創(chuàng)建ResultInfo類用于封裝返回數(shù)據(jù)

    • 5、開始從Dao開始寫

      • 6、開始寫service層

        • 7、編寫最后的Servelt層

          • 7.1 用戶登陸

        • 8、示例

        關(guān)于JSP用戶登錄連接數(shù)據(jù)庫詳情

        JSP怎么實現(xiàn)用戶登錄連接數(shù)據(jù)庫的功能

        JSP怎么實現(xiàn)用戶登錄連接數(shù)據(jù)庫的功能

        1、首先創(chuàng)建po類

        與數(shù)據(jù)庫一一對應(yīng)

        JSP怎么實現(xiàn)用戶登錄連接數(shù)據(jù)庫的功能

        lombok生成get set方法

        package com.ftzlover.demo.po;
        import lombok.Getter;
        import lombok.Setter;
        @Getter
        @Setter
        public class User {
        
            private Integer userId; // 用戶ID
            private String uname; // 用戶名稱
            private String upwd; // 用戶密碼
            private String nick; // 用戶昵稱
            private String head; // 用戶頭像
            private String mood; // 用戶簽名
        }

        2、創(chuàng)建底層UserDao

        JSP怎么實現(xiàn)用戶登錄連接數(shù)據(jù)庫的功能

        這里就是所有創(chuàng)建好的層

        3、創(chuàng)建UserService(一般都會調(diào)用UserDao)

         private UserDao userDao = new UserDao();

        4、寫web層UserSrevlet

        注意:

        1. 首先需要寫@WebServlet("/user")在頂端,

        2. 接下來讓其調(diào)用service層private UserService userService = new UserService();

        3. 然后讓后讓這個類繼承 HttpServlet

        public class UserServlet extends HttpServlet {

        4.1 重寫方法 
        @Override
            protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        4.2創(chuàng)建vo層并在里面創(chuàng)建ResultInfo類用于封裝返回數(shù)據(jù)

        創(chuàng)建狀態(tài)碼code 提示信息 返回對象

        @Getter
        @Setter
        public class ResultInfo<T> {
        
            private Integer code; // 狀態(tài)碼 成功=1,失敗=0
            private String msg; // 提示信息
            private T result; // 返回的對象(字符串、JavaBean、集合、Map等)
        
        }

        5、開始從Dao開始寫

        Dao層:(數(shù)據(jù)訪問層:數(shù)據(jù)庫中的增刪改查操作)通過用戶名查詢用戶對象, 返回用戶對象

        獲取數(shù)據(jù)庫連接

        1. 定義sql語句

        2. 預編譯

        3. 設(shè)置參數(shù)

        4.  執(zhí)行查詢,返回結(jié)果集

        5. 判斷并分析結(jié)果集

        6. 關(guān)閉資源

        package com.ftzlover.demo.dao;
        
        import com.ftzlover.demo.po.User;
        import com.ftzlover.demo.util.DBUtil;
        
        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        
        /**
         *  Dao層:(數(shù)據(jù)訪問層:數(shù)據(jù)庫中的增刪改查操作)
         *         通過用戶名查詢用戶對象, 返回用戶對象
         *             1. 獲取數(shù)據(jù)庫連接
         *             2. 定義sql語句
         *             3. 預編譯
         *             4. 設(shè)置參數(shù)
         *             5. 執(zhí)行查詢,返回結(jié)果集
         *             6. 判斷并分析結(jié)果集
         *             7. 關(guān)閉資源
         */
        public class UserDao {
        
            public User queryUserByName(String userName){
                //首先創(chuàng)建對象
                User user = null;
                Connection connection = null;
                PreparedStatement preparedStatement = null;  //預編譯對象
                ResultSet resultSet = null;
        
                try {
                    // 1. 獲取數(shù)據(jù)庫連接
                    connection = DBUtil.getConnetion();
                    // 2. 定義sql語句
                    String sql = "select * from tb_user where uname = ?";
                    // 3. 預編譯
                    preparedStatement = connection.prepareStatement(sql);
                    // 4. 設(shè)置參數(shù)
                    preparedStatement.setString(1, userName);
                    // 5. 執(zhí)行查詢,返回結(jié)果集
                    resultSet = preparedStatement.executeQuery();
                    // 6. 判斷并分析結(jié)果集
                    if (resultSet.next()) {
                        user = new User();
                        user.setUserId(resultSet.getInt("userId"));
                        user.setUname(userName);
                        user.setHead(resultSet.getString("head"));
                        user.setMood(resultSet.getString("mood"));
                        user.setNick(resultSet.getString("nick"));
                        user.setUpwd(resultSet.getString("upwd"));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    // 7. 關(guān)閉資源
                    DBUtil.close(resultSet,preparedStatement,connection);
                }
        
        
                return  user;
            }
        }

        6、開始寫service層

        package com.ftzlover.demo.service;
        
        import cn.hutool.core.util.StrUtil;
        import cn.hutool.crypto.digest.DigestUtil;
        import com.ftzlover.demo.dao.UserDao;
        import com.ftzlover.demo.po.User;
        import com.ftzlover.demo.vo.ResultInfo;
        /*Service層:(業(yè)務(wù)邏輯層:參數(shù)判斷、業(yè)務(wù)邏輯處理)
                1. 判斷參數(shù)是否為空
                如果為空
                設(shè)置ResultInfo對象的狀態(tài)碼和提示信息
                返回resultInfo對象
                2. 如果不為空,通過用戶名查詢用戶對象
                3. 判斷用戶對象是否為空
                如果為空
                設(shè)置ResultInfo對象的狀態(tài)碼和提示信息
                返回resultInfo對象
                4. 如果用戶對象不為空,將數(shù)據(jù)庫中查詢到的用戶對象的密碼與前臺傳遞的密碼作比較 (將密碼加密后再比較)
                如果密碼不正確
                設(shè)置ResultInfo對象的狀態(tài)碼和提示信息
                返回resultInfo對象
                5. 如果密碼正確
                設(shè)置ResultInfo對象的狀態(tài)碼和提示信息
                6. 返回resultInfo對象
        
         */
        public class UserService {
            private UserDao userDao = new UserDao();
        
            public ResultInfo<User> userLogin(String userName,String userPwd){
                ResultInfo<User> resultInfo = new ResultInfo<>();
        
                // 數(shù)據(jù)回顯:當?shù)卿泴崿F(xiàn)時,將登錄信息返回給頁面顯示
                User u = new User();
                u.setUname(userName);
                u.setUpwd(userPwd);
                // 設(shè)置到resultInfo對象中
                resultInfo.setResult(u);
        
                //  1. 判斷參數(shù)是否為空
                if (StrUtil.isBlank(userName) || StrUtil.isBlank(userPwd)) {
                    // 如果為空 設(shè)置ResultInfo對象的狀態(tài)碼和提示信息
                    resultInfo.setCode(0);
                    resultInfo.setMsg("用戶姓名或密碼不能為空!");
                    // 返回resultInfo對象
                    return resultInfo;
        
                }
        
                // 2. 如果不為空,通過用戶名查詢用戶對象
                User user = userDao.queryUserByName(userName);
        
        
                // 3. 判斷用戶對象是否為空
                if (user == null) {
                    // 如果為空,設(shè)置ResultInfo對象的狀態(tài)碼和提示信息
                    resultInfo.setCode(0);
                    resultInfo.setMsg("該用戶不存在!");
                    // 返回resultInfo對象
                    return resultInfo;
                }
        
                //  4. 如果用戶對象不為空,將數(shù)據(jù)庫中查詢到的用戶對象的密碼與前臺傳遞的密碼作比較 (將密碼加密后再比較)
                // 將前臺傳遞的密碼按照MD5算法的方式加密
                userPwd = DigestUtil.md5Hex(userPwd);
        
                // 判斷加密后的密碼是否與數(shù)據(jù)庫中的一致
                if (!userPwd.equals(user.getUpwd())) {
                    // 如果密碼不正確
                    resultInfo.setCode(0);
                    resultInfo.setMsg("用戶密碼不正確!");
                    return resultInfo;
                }
                resultInfo.setCode(1);
                resultInfo.setResult(user);
                return resultInfo;
            }
        }

        7、編寫最后的Servelt層

        7.1 用戶登陸
        package com.ftzlover.demo.web;
        
        import com.ftzlover.demo.po.User;
        import com.ftzlover.demo.service.UserService;
        import com.ftzlover.demo.vo.ResultInfo;
        
        import javax.servlet.ServletException;
        import javax.servlet.annotation.WebServlet;
        import javax.servlet.http.Cookie;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import java.io.IOException;
        @WebServlet("/user")
        public class UserServlet extends HttpServlet {
        
            private UserService userService = new UserService();
        
            @Override
            protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        
                // 接收用戶行為
                String actionName = request.getParameter("actionName");
                if ("login".equals(actionName)) {
        
                    // 用戶登錄
                    userLogin(request, response);
        
                }
        
        
            }
            /**
             * 用戶登錄
             1. 獲取參數(shù) (姓名、密碼)
             2. 調(diào)用Service層的方法,返回ResultInfo對象
             3. 判斷是否登錄成功
             如果失敗
                將resultInfo對象設(shè)置到request作用域中
                請求轉(zhuǎn)發(fā)跳轉(zhuǎn)到登錄頁面
             如果成功
                將用戶信息設(shè)置到session作用域中
                   判斷用戶是否選擇記住密碼(rem的值是1)
                      如果是,將用戶姓名與密碼存到cookie中,設(shè)置失效時間,并響應(yīng)給客戶端
                      如果否,清空原有的cookie對象
             重定向跳轉(zhuǎn)到index頁面
             * @param request
             * @param response
             */
        
            private void userLogin(HttpServletRequest request, HttpServletResponse response) {
                // 1. 獲取參數(shù) (姓名、密碼)
                String userName = request.getParameter("userName");
                String userPwd = request.getParameter("userPwd");
        
                // 2. 調(diào)用Service層的方法,返回ResultInfo對象
                ResultInfo<User> resultInfo = userService.userLogin(userName, userPwd);
        
                // 3. 判斷是否登錄成功
                if (resultInfo.getCode() == 1) { // 如果成功
                    //  將用戶信息設(shè)置到session作用域中
                    request.getSession().setAttribute("user", resultInfo.getResult());
                    //  判斷用戶是否選擇記住密碼(rem的值是1)
                    String rem = request.getParameter("rem");
                    // 如果是,將用戶姓名與密碼存到cookie中,設(shè)置失效時間,并響應(yīng)給客戶端
                    if ("1".equals(rem)) {
                        // 得到Cookie對象
                        Cookie cookie = new Cookie("user",userName +"-"+userPwd);
                        // 設(shè)置失效時間
                        cookie.setMaxAge(3*24*60*60);
                        // 響應(yīng)給客戶端
                        response.addCookie(cookie);
                    } else {
                        // 如果否,清空原有的cookie對象
                        Cookie cookie = new Cookie("user", null);
                        // 刪除cookie,設(shè)置maxage為0
                        cookie.setMaxAge(0);
                        // 響應(yīng)給客戶端
                        response.addCookie(cookie);
                    }
                    // 重定向跳轉(zhuǎn)到index頁面
                    try {
                        response.sendRedirect("index.html");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
        
                } else { // 失敗
                    // 將resultInfo對象設(shè)置到request作用域中
                    request.setAttribute("resultInfo", resultInfo);
                    // 請求轉(zhuǎn)發(fā)跳轉(zhuǎn)到登錄頁面
                    try {
                        request.getRequestDispatcher("login.jsp").forward(request, response);
                    } catch (ServletException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
        
            }
        
        
        }

        附件:util層的DBUtil

        package com.ftzlover.demo.util;
        
        import java.io.InputStream;
        import java.sql.*;
        import java.util.Properties;
        
        
        public class DBUtil {
        
            // 得到配置文件對象
            private static Properties properties = new Properties();
        
            static {
                try {
                    // 加載配置文件(輸入流)
                    InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
                    System.out.println("是否獲取到流對象:" + in);
                    System.out.println("流對象:" + properties);
                    // 通過load()方法將輸入流的內(nèi)容加載到配置文件對象中
                    properties.load(in);
                    // 通過配置文件對象的getProperty()方法獲取驅(qū)動名,并加載驅(qū)動
                    Class.forName(properties.getProperty("jdbcName"));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        
        
            public static Connection getConnetion() {
                Connection connection = null;
                try {
                    // 得到數(shù)據(jù)庫連接的相關(guān)信息
                    String dbUrl = properties.getProperty("dbUrl");
                    System.out.println(dbUrl);
                    String dbName = properties.getProperty("dbName");
                    System.out.println(dbName);
                    String dbPwd = properties.getProperty("dbPwd");
                    System.out.println(dbName);
                    // 得到數(shù)據(jù)庫連接
                    connection = DriverManager.getConnection(dbUrl, dbName, dbPwd);
                    System.out.println(connection);
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
        
                return connection;
            }
        
        
            public static void close(ResultSet resultSet,
                                     PreparedStatement preparedStatement,
                                     Connection connection) {
        
                try {
                    // 判斷資源對象如果不為空,則關(guān)閉
                    if (resultSet != null) {
                        resultSet.close();
                    }
                    if (preparedStatement != null) {
                        preparedStatement.close();
                    }
                    if (connection != null) {
                        connection.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
        
            }
        
        }

        8、示例

        JSP怎么實現(xiàn)用戶登錄連接數(shù)據(jù)庫的功能

        JSP怎么實現(xiàn)用戶登錄連接數(shù)據(jù)庫的功能

        十分炫酷的登陸界面加完善的后臺登陸界面截圖:

        JSP怎么實現(xiàn)用戶登錄連接數(shù)據(jù)庫的功能

        JSP怎么實現(xiàn)用戶登錄連接數(shù)據(jù)庫的功能

        JSP怎么實現(xiàn)用戶登錄連接數(shù)據(jù)庫的功能

        數(shù)據(jù)庫代碼:新建數(shù)據(jù)庫名叫my 建表名叫tb_user

        CREATE TABLE `tb_user` (
          `userId` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵,自動增長',
          `uname` varchar(50) NOT NULL COMMENT '用戶名',
          `upwd` varchar(50) DEFAULT NULL COMMENT '密碼',
          `nick` varchar(50) DEFAULT NULL COMMENT '昵稱',
          `head` varchar(100) DEFAULT NULL COMMENT '頭像',
          `mood` varchar(500) DEFAULT NULL COMMENT '心情',
          PRIMARY KEY (`userId`)
        ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

        “JSP怎么實現(xiàn)用戶登錄連接數(shù)據(jù)庫的功能”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

        向AI問一下細節(jié)

        免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

        jsp
        AI