前言:學習Servlet也有一段時間了,但是總感覺走馬觀花,學一學還是對實際操作不是很懂,最近在看學習視頻中有介紹可以自己做一個連接數據庫的登錄小實戰,就當是複習複習之前的JDBC編程那塊,也順便鞏固了下Servlet中request和respons這邊的常用操作。
問題分析:基本上就是先寫一個頁面,其中包含輸入賬號密碼,通過表單數據來進行跟MySQL數據庫進行對接,判斷輸入的賬號密碼是否在數據庫中有記錄,如果有就跳到新的頁面顯示登錄成功,如果查詢不到就也跳到新的頁面顯示登錄失敗。
問題思考與解決:首先冒出來的想法是得先寫一個SQLConnector類來進行數據庫方面的操作,比如進行判斷是否存在,存在就返回個true,不存在就返回false;還得需要個登錄的前端頁面。這兩個其實都不難,根據之前學的知識,比較容易的就能寫出來,當然JDBC到現在有點忘了,在寫這部分遇到了許多問題。
/**
* JDBC工具類 連接SQL並且判斷是否存在。
*/
import java.sql.*;
import java.util.Map;
public class SQLConnecter {
boolean isSuccess = false;
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
//以下這個方法做了連接+判斷的事情,返回值是一個boolean類型的值。
public boolean ifSuccess(Map<String, String> user) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/login?serverTimezone=GMT","root","password");
statement = connection.createStatement();
String sql = "select * from users where username = '" + user.get("username") + "' and userpassword = '"+user.get("userpassword") + "' ";
resultSet = statement.executeQuery(sql);
if(resultSet.next()){
isSuccess = true;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return isSuccess;
}
}
在寫這個類的時候問題還挺多的,不說其他的,光說這個連接加判斷步驟,我都已經想不太起來了,只記得要創建Connection和Statement對象,連ResultSet結果集都沒想到。中間部分記得還是比較清楚,反射和通過url連接,創建Statement對象,執行查詢結果集,最後返回一個boolean類型,查到就true,數據庫中沒有就false。
前端頁面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form action="/LoginServlet" method="post">
用戶名:<input type="text" name="username"><br>
密碼:<input type="text" name="userpassword"><br>
<input type="submit" value="登錄">
</form>
</body>
</html>
其中這裏的action元素中的LoginServlet就是接下來要寫的執行Servlet類了。
這個Servlet類一開始我是沒想到的,看視頻發現需要一個LoginServlet類來收集前端發送來的數據,並且與數據庫方法進行對接,判斷正確與否跳轉到不同的頁面:
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.設置中文編碼
request.setCharacterEncoding("utf-8");
//2.獲取請求參數
String username = request.getParameter("username");
String userpassword = request.getParameter("userpassword");
//3.判斷是否存在
Map<String, String> userMap = new HashMap<>();
userMap.put("username", username);
userMap.put("userpassword", userpassword);
SQLConnecter userConnector = new SQLConnecter();
if(userConnector.ifSuccess(userMap)){
//登錄成功
request.getRequestDispatcher("/SuccessServlet").forward(request, response);
} else {
//登錄失敗
request.getRequestDispatcher("/FailServlet").forward(request, response);
}
}
}
在這裏判斷後,跳轉到了兩個頁面,所以說我在這裏再寫兩個頁面,分別爲SuccessServlet和FailServlet:
@WebServlet("/SuccessServlet")
public class SuccessServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.設置編碼
response.setContentType("text/html;charset=utf-8");
//2.輸出
response.getWriter().write("登錄成功");
}
}
@WebServlet("/FailServlet")
public class FailServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("登錄失敗");
}
}
這算是基本上大功告成咯,看看運行結果:
雖說是跳到,不過看到URI方面還是我們寫的LoginServlet。
總結一下,在這次的小開發還是比較磕絆的,在視頻中學習了很多,發現自己上手能力還是不太行。代碼中有許多的常用方法還是掌握的不夠。
代碼過程中用到的一些方法和開發思路:
JDBC連接數據庫與判斷常規操作:
- 初始化Connection、Statement、ResultSet對象;
- 方法主題中反射加載驅動:Class.forName("");
- 通過DriverManager.getConnection(“url”, “name”, “password”);來進行連接本地數據庫
- 通過Connection對象來創建Statement對象,connection.createStatement()
- 通過Statement對象來執行SQL語句,statement.excuteQuery(sql);
- 處理結果集,釋放資源
LoginServlet一般簡單的操作如下:
- 設置中文編碼方便中文:request.setCharacterEncoding(“utf-8”);
- 獲取請求參數:request.getParameter(“name”);
- 對請求參數進行操作
寫到這基本上就告一段落了,我覺得自己的學習還是不太行,繼續加油吧~