狂神說Java【SMBMS】——SMBMS超市訂單管理系統(二) ——登陸功能實現


頁面實現邏輯/流程

1、編寫前端頁面

​ 前端頁面直接使用已有的,我們主要編寫網頁背后的執行代碼

2、設置首頁

    <!--設置歡迎頁/首頁-->
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>

3、編寫Dao層用戶登陸的接口

  • 創建一個UserDao接口,然后我們按照"面向接口編程"的原則去接口UserDaoImpl中實現這個接口中的方法

    • 使用面向接口編程的好處就在與我們在接口中只需要定義方法,而不需要實現方法,整個結構和思路都很清晰

    • 其次就是將設計和實現分離,保證了設計專注於設計,實現專注於實現

package com.thhh.dao.user;

import com.thhh.pojo.User;

import java.sql.Connection;

public interface UserDao {
    /**
     * 得到要進行登陸的用戶
     * @param conn:數據庫連接對象
     * @param userCode:通過用戶的用戶名userCode查詢用戶數據
     * @return
     */
    public User getLoginUserInfo(Connection conn,String userCode);
}

4、編寫Dao接口的實現類

package com.thhh.dao.user;

import com.thhh.dao.BaseDao;
import com.thhh.pojo.User;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDaoImpl implements UserDao{
    @Override
    public User getLoginUserInfo(Connection conn, String userCode) {
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        User user = null;
        if (conn!=null){
            String sql = "SELECT * FROM smbms_user WHERE userCode = ?";
            Object[] params = {userCode};
            rs = BaseDao.executeQuery(sql,params,conn,pstmt,rs);//調用項目搭建階段准備的公共查詢方法
            try {
                    while (rs.next()){
                        user = new User();
                        user.setId(rs.getInt("id"));
                        user.setUserCode(rs.getString("userCode"));
                        user.setUserName(rs.getString("userName"));
                        user.setUserPassword(rs.getString("userPassword"));
                        user.setGender(rs.getInt("gender"));
                        user.setBirthday(rs.getDate("birthday"));
                        user.setPhone(rs.getString("phone"));
                        user.setAddress(rs.getString("address"));
                        user.setUserRole(rs.getInt("userRole"));
                        user.setCreatedBy(rs.getInt("createdBy"));
                        user.setCreationDate(rs.getTimestamp("creationDate"));
                        user.setModifyBy(rs.getInt("modifyBy"));
                        user.setModifyDate(rs.getTimestamp("modifyDate"));user.setId(rs.getInt("id"));
                        user.setUserCode(rs.getString("userCode"));
                        user.setUserName(rs.getString("userName"));
                        user.setUserPassword(rs.getString("userPassword"));
                        user.setGender(rs.getInt("gender"));
                        user.setBirthday(rs.getDate("birthday"));
                        user.setPhone(rs.getString("phone"));
                        user.setAddress(rs.getString("address"));
                        user.setUserRole(rs.getInt("userRole"));
                        user.setCreatedBy(rs.getInt("createdBy"));
                        user.setCreationDate(rs.getTimestamp("creationDate"));
                        user.setModifyBy(rs.getInt("modifyBy"));
                        user.setModifyDate(rs.getTimestamp("modifyDate"));
                    }

                //關閉資源
                BaseDao.close(null,pstmt,rs);//因為數據庫的連接可能不只是這一個操作,所以我們不應該做完一件事就把數據庫連接對象銷毀,所以conn處傳的null
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        return user;
    }
}

5、編寫業務層接口

package com.thhh.service.user;

import com.thhh.pojo.User;

public interface UserService {
    /**
     * 用戶登陸身份驗證
     * @param userCode:用戶賬號
     * @param userPassword:用戶密碼,注意,密碼判斷我們在service層進行;
     *                      在Dao層只是簡單的操作數據庫,沒有其他的邏輯代碼;在servlet層中只是接收和轉發請求以及控制視圖跳轉
     *                      而對於業務層(service)就是用來實現業務邏輯代碼的
     * @return
     */
    public User login(String userCode,String userPassword);
}

6、業務層實現類

package com.thhh.service.user;
/**
 * 業務層主要就是編寫業務代碼,在編寫業務代碼的時候經常會調用數據庫
 * 所以在業務層中需要使用到我們一開始編寫好的DAO的代碼
 */

import com.thhh.dao.BaseDao;
import com.thhh.dao.user.UserDao;
import com.thhh.pojo.User;
import org.junit.Test;

import java.sql.Connection;

public class UserServiceImpl implements UserService{
    private UserDao userDao;//業務層需要使用Dao,所以直接將Dao作為一個成員變量來使用

    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;//在業務層被實例化的時候就讓它得到Dao對象,后面就可以直接去用
    }

    @Override
    public User login(String userCode, String userPassword) {
        Connection conn = null;
        User user = null;

        conn = BaseDao.getConnection();//獲取數據庫連接對象
        //通過業務層調用Dao層
        user = userDao.getLoginUserInfo(conn,userCode);//調用userDao中的獲取用戶信息的方法
        BaseDao.close(conn,null,null);

        return user;
    }
}

測試是否能夠成功運行

@Test
public void test(){
    UserServiceImpl userService = new UserServiceImpl();
    User admin = userService.login("admin","12bfasbka");
    System.out.println(admin.getUserPassword());
}

7、編寫servlet

首先導入我們也用到的JSP頁面

​ 其中frame.jsp是登陸成功之后跳轉的頁面,而common中是頁面的頭部和底部

​ 注意:我們在編寫servlet和注冊servlet的時候一定要注意我們使用的前端頁面上面寫的地址,為了不出錯最后時與前端頁面上寫的地址保持一致;其次就是注意前端使用的JSP內置對象和EL表達式,我們在后端需要使用對應的變量名,否則是取不到值的
servlet編寫

package com.thhh.servlet.user;

import com.thhh.pojo.User;
import com.thhh.service.user.UserService;
import com.thhh.service.user.UserServiceImpl;
import com.thhh.utils.Constants;

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 UserService userService = null;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、獲取前端傳過來的用戶名+密碼
        String userCode = req.getParameter("userCode");
        String userPassword = req.getParameter("userPassword");

        //2、調用業務層,將數據庫中查出來的密碼和用戶的輸入進行對比
        this.userService = new UserServiceImpl();
        User user = userService.login(userCode,userPassword);//已經把用戶查到了

        //3、判斷返回是否為null
        if (user!=null){//賬號+密碼正確
            //將用戶的信息存入session中
            req.getSession().setAttribute(Constants.USER_SESSION,user);
            //跳轉內部主頁
            resp.sendRedirect("jsp/frame.jsp");
        }else{//賬號+密碼不正確
            req.setAttribute("error","用戶名或密碼錯誤");
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }


      /*  if ()
        user.getUserPassword()*/
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

8、注冊servlet

    <!--注冊登陸的servlet-->
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.thhh.servlet.user.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login.do</url-pattern>
    </servlet-mapping>

注意:這里的映射與我們使用的前端頁面表單提交的action要保持一致




9、測試功能,確保上面的代碼正確






測試完成!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM