登入功能

Hanyta發表於2024-05-08
  1. 整體思路

  1. 設定歡迎頁:設定完歡迎頁之後,tomcat啟動後會自動跳轉到歡迎頁而不是index.jsp

  1. 登入的整體步驟:

    • 已經擁有前端頁面:login.jsp,登入成功,跳轉到業務主頁面,登入失敗輸出提示資訊,回到登入頁面
    • 編寫Dao層:介面和實現類,它的作用是從資料庫中獲取登入的使用者
      //透過userCode從資料庫中查詢資料,並將其賦值給Java實體類user
      public User getLoginUser(Connection connection, String userCode) throws Exception {
      		PreparedStatement pstm = null;
      		ResultSet rs = null;
      		User user = null;
      		if(null != connection){
      			String sql = "select * from smbms_user where userCode=?";
      			Object[] params = {userCode};
      			rs = BaseDao.execute(connection, pstm, rs, sql, params);
      			if(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"));
      			}
      			//connection設成null不讓其關閉,是因為後面業務層還需要資料庫連線。
      			BaseDao.closeResource(null, pstm, rs);
      		}
      		return user;
      	}
    
    • 編寫Service層:呼叫Dao層,獲取業務所需要的資料,登入的介面及其實現類
      public class UserServiceImpl implements UserService{
      	//建立UserServiceImpl就會例項化userDao
      	private UserDao userDao;
      	public UserServiceImpl(){
      		userDao = new UserDaoImpl();
      	}
        //透過前端傳過來的姓名和密碼對比資料庫中查詢到的
      	public User login(String userCode, String userPassword) {
      		Connection connection = null;
      		User user = null;
      		try {
      			connection = BaseDao.getConnection();
      			user = userDao.getLoginUser(connection, userCode);
      		} catch (Exception e) {
      			e.printStackTrace();
      		}finally{
      			BaseDao.closeResource(connection, null, null);
      		}
      		
      		//匹配密碼
      		if(null != user){
      			if(!user.getUserPassword().equals(userPassword))
      				user = null;
      		}
      		
      		return user;
      	}
      }
    
    • 編寫servlet:接受使用者的請求交給業務層去做,這裡使用者的請求是登入,業務層要做的是在資料庫中匹配輸入的使用者名稱和密碼。
      public class LoginServlet extends HttpServlet {
          //servlet:控制層,接收使用者的請求,呼叫業務層程式碼。
    
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //從前端獲取使用者名稱和密碼(接收使用者的請求)
              String userCode = req.getParameter("userCode");
              String userPassword = req.getParameter("userPassword");
    
              //接收請求後需處理業務,業務是:和資料庫中的資料進行對比,所以需呼叫業務層
              UserServiceImpl userService = new UserServiceImpl();
              User user = userService.login(userCode, userPassword);//這裡已經把登入的人給查出來了
              
              //service層返回的就是user物件
              if(user != null){//查有此人,可以登入
                  //將使用者的資訊放入Session中
                  req.getSession().setAttribute(Constant.USER_SESSION , user);
                  //跳轉主頁(跳轉到另一個頁面,地址變了,所以用重定向)
                  resp.sendRedirect("jsp/frame.jsp");
    
              }else{//查無此人,無法登入
                  //轉發會登入頁面,順帶提示它,使用者名稱或密碼錯誤。((跳轉到本頁面,只是在本頁面加了些資訊(使用者名稱或密碼錯誤),地址沒變,所以用請求轉發))
                  req.setAttribute("error" , "使用者名稱或密碼錯誤");//請求可以攜帶資料
                  req.getRequestDispatcher("login.jsp").forward(req , resp);
    
              }
          }
    
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
    
    • 註冊servlet
      <!--servlet-->
      <servlet>
          <servlet-name>LoginServlet</servlet-name>
          <servlet-class>com.tong.servlet.user.LoginServlet</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>LoginServlet</servlet-name>
          <url-pattern>/login.do</url-pattern>
      </servlet-mapping>
    

相關文章