部分蘋果 macOS Monterey 12.3 正式版使用者遭遇藍芽連線 Xbox 遊戲控制器等問題
頁面實現邏輯/流程
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、測試功能,確保上面的程式碼正確
測試完成!
頁面實現邏輯/流程
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、測試功能,確保上面的程式碼正確
測試完成!