一個簡單的超市訂單管理系統(3)-登入功能的實現
阿新 • • 發佈:2021-10-17
1.登入功能實現的大致流程
(1)編寫前端頁面,也可以用這個連結:https://pan.baidu.com/s/120ErVJdad9w7bemd78WzWQ提取碼:9999,這個頁面和上文準備階段的靜態資源是匹配的。將登陸頁面放在webapp目錄下,與建立專案的時候生成的index.jsp同級
(2)在web.xml中配置登陸頁面,讓程式啟動後不去訪問index.jsp,而是去訪問我們的登入頁面
1 <welcome-file-list> 2 <welcome-file>/login.jsp</welcome-file> 3 </welcome-file-list>
(3)編寫持久化層,也就是Dao介面和實現類,去操作我們的資料庫,通過實現類去實現UserDao介面,去資料庫中查詢使用者資訊
1 package com.xiaoma.dao.user; 2 3 import com.xiaoma.pojo.User; 4 import java.sql.Connection; 5 6 public interface UserDao { 7 //得到要登入的使用者 8 public User getLoginUser(Connection connection,String userCode);9 }
1 package com.xiaoma.dao.user; 2 3 import com.xiaoma.dao.BaseDao; 4 import com.xiaoma.pojo.User; 5 6 import java.sql.Connection; 7 import java.sql.PreparedStatement; 8 import java.sql.ResultSet; 9 10 public class UserDaoImpl implements UserDao{ 11 @Override 12 public User getLoginUser(Connection connection, String userCode){13 //1.首先想一下,我們肯定要用BaseDao裡的寫好的公共查詢方法去查詢,去執行我們的sql,從BaseDao中的公共查詢方法中可以看到 14 //我們需要建立connection,resultSet,preparedStatement,sql和params五個引數物件,其中connection已經有了 15 PreparedStatement pstm=null; 16 ResultSet rs=null; 17 User user=null; 18 19 //當我們資料庫連結了才會去執行下面的程式碼,資料庫連結了丟一個sql進去並執行 20 if (connection != null) { 21 String sql="select * from smbms_user where userCode=?";//為了安全,使用預編譯的sql 22 Object[] params={userCode}; 23 24 //2.去呼叫BaseDao裡的寫好的公共查詢方法去執行sql 25 try { 26 rs = BaseDao.execute(connection, pstm, rs, sql, params); 27 28 //3.我們這一步是要去遍歷我們查詢的結果集 29 if (rs.next()) { 30 //因為查出來資料之後是一個使用者,所以將它封裝到使用者裡邊 31 user=new User(); 32 user.setID(rs.getInt("id")); 33 user.setUserCode(rs.getString("userCode")); 34 user.setUsername(rs.getString("userName")); 35 user.setUserPassword(rs.getString("userPassword")); 36 user.setGender(rs.getInt("gender")); 37 user.setBirthday(rs.getDate("gender")); 38 user.setPhone(rs.getString("gender")); 39 user.setAddress(rs.getString("gender")); 40 user.setUserRole(rs.getInt("userRole")); 41 user.setCreatedBy(rs.getInt("createdBy")); 42 user.setCreationDate(rs.getTimestamp("creationDate")); 43 user.setModifyBy(rs.getInt("modifyBy")); 44 user.setModifyDate(rs.getTimestamp("modifyDate")); 45 } 46 47 //4.查詢完之後要關閉,其中connection連線不用關 48 BaseDao.closeResourses(null,pstm,rs); 49 }catch (Exception e){ 50 e.printStackTrace(); 51 } 52 } 53 54 //5.程式碼走完了將我們查詢到的user返回給要呼叫它的物件 55 return user; 56 } 57 }
(4)編寫業務層(service層)介面和實現類,去操作dao
1 package com.xiaoma.service.user; 2 3 import com.xiaoma.pojo.User; 4 5 public interface UserService { 6 //使用者登入業務 7 public User Login(String userCode,String password); 8 }
1 package com.xiaoma.service.user; 2 3 import com.xiaoma.dao.BaseDao; 4 import com.xiaoma.dao.user.UserDao; 5 import com.xiaoma.dao.user.UserDaoImpl; 6 import com.xiaoma.pojo.User; 7 import org.junit.jupiter.api.Test; 8 9 import java.sql.Connection; 10 11 public class UserServiceImpl implements UserService{ 12 //1.因為業務層要呼叫dao層,所以要先把dao層引入進來,並且例項化 13 private UserDao userDao; 14 public UserServiceImpl(){ 15 userDao=new UserDaoImpl(); 16 } 17 18 @Override 19 public User Login(String userCode, String password) { 20 Connection connection=null; 21 User user=null; 22 23 try{ 24 //2.連線資料庫 25 connection=BaseDao.getConnection(); 26 //3.呼叫Dao層,進行具體的資料庫操作 27 user=userDao.getLoginUser(connection,userCode); 28 }catch (Exception e){ 29 e.printStackTrace(); 30 }finally { 31 BaseDao.closeResourses(connection,null,null); 32 } 33 34 //4.將使用者返回出去,這樣只要呼叫UserServiceImpl類中的Login方法就可以拿到使用者 35 return user; 36 } 37 }
(5)編寫一個用來存放常量的類
1 package com.xiaoma.util; 2 3 public class Constants { 4 public final static String USER_SESSION="userSession"; 5 }
(6)匯入內部首頁的jsp檔案和公共的頭部和尾部的jsp,我特喵的百度網盤打不開了,先不搞了,想玩這個專案的朋友聯絡Q810806242,或者評論區發自己的郵箱或者其他聯絡方式
(7)編寫servlet
1 package com.xiaoma.servlet.user; 2 3 import com.xiaoma.pojo.User; 4 import com.xiaoma.service.user.UserService; 5 import com.xiaoma.service.user.UserServiceImpl; 6 import com.xiaoma.util.Constants; 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 import java.io.IOException; 12 13 public class UserServlet extends HttpServlet { 14 @Override 15 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 16 //這個也就是Controller層,該層呼叫業務層(service層) 17 //1.通過getParameter()方法獲取前端的使用者名稱和密碼,方法內傳遞的是前端的name屬性 18 String userCode=req.getParameter("userCode"); 19 String password=req.getParameter("userPassword"); 20 21 //呼叫業務層,與資料庫中的使用者名稱和密碼進行比對 22 UserService userService=new UserServiceImpl(); 23 User user=userService.Login(userCode,password); 24 //如果查到的使用者存在,就讓其登入並轉發到內部的首頁,否則登入失敗,重定向到登入頁,並提示使用者名稱或密碼錯誤 25 if (user != null) { 26 req.getSession().setAttribute(Constants.USER_SESSION,user); 27 resp.sendRedirect("jsp/frame.jsp"); 28 }else{ 29 req.setAttribute("error","使用者名稱或者密碼錯誤"); 30 req.getRequestDispatcher("login.jsp").forward(req,resp); 31 } 32 } 33 34 @Override 35 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 36 doGet(req, resp); 37 } 38 }
(8)在web.xml中註冊這個servlet,啟動tomcat,執行程式
1 <!--註冊servlet--> 2 <servlet> 3 <servlet-name>UserServlet</servlet-name> 4 <servlet-class>com.xiaoma.servlet.user.UserServlet</servlet-class> 5 </servlet> 6 <servlet-mapping> 7 <servlet-name>UserServlet</servlet-name> 8 <url-pattern>/login.do</url-pattern> 9 </servlet-mapping>