頁面實現邏輯/流程
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、測試功能,確保上面的代碼正確
測試完成!