1. 程式人生 > 資訊 >部分蘋果 macOS Monterey 12.3 正式版使用者遭遇藍芽連線 Xbox 遊戲控制器等問題

部分蘋果 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、測試功能,確保上面的程式碼正確






測試完成!