js-jquery+ajax+servlet 實現jsp頁面登入檢查
初學jsp首先要練習登入功能,今天學習了使用servlet完成登入檢查。
效果:
在登入頁面反覆輸入錯誤密碼,頁面不會重新整理。而是將表單內容通過js中的ajax提交到servlet中進行檢查,根據其返回值確定使用者是否登入成功。
準備:
我使用的IDE是 Intellij IDEA,下面的方法在myeclipse中應該是可以的吧。
原生js寫ajax挺繁瑣的,糾結若干秒以後,選擇用jquery框架寫。(ps:jquery框架其實就是js程式碼封裝一下,用起來方便而已)
將下載後的檔案(字尾應該是.min.js)拷貝到自己的專案的web目錄下(我是放在了"web/template/js"目錄下)
在專案下,新建檔案 loginPage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登入</title> <style type="text/css"> input{ width:300px; height:30px; } .bigContainer tr{ height:35px; } #btnLogin{ width:300px; height: 30px; } </style> </head> <body> <div class="bigContainer"> <div id="login-page"> <center> <h1>歡迎登陸<%=homeName%></h1> <form id="login" method="post"> <table> <tr> <td>使用者名稱:</td> <td><input id="userName" type="text" name="userName" size="16"/></td> </tr> <tr> <td>密碼:</td> <td><input id="password" type="password" name="password" size="16"/></td> </tr> <tr> <td></td> <td> <button id="btnLogin" type="button">登入</button> <a href="#" style="color: #3d444c">忘記密碼?</a> </td> </tr> </table> </form> </center> </div> </div> <script src="/template/js/jquery-3.3.1.min.js"></script> <script language="JavaScript"> //監聽登入按鈕,執行登入 $('#btnLogin').click(function () { check(); }); //監聽回車,執行登入按鈕 $("body").keydown(function() { if (event.keyCode == "13") {// keyCode=13是回車鍵 $('#btnLogin').click(); } }); //執行登入檢查 function check() { var userName=$("input[name='userName']").val(); //獲取input裡的值 var password=$("input[name='password']").val(); $.ajax({ type:"POST", url:"/ServletLogin", data:$('#login').serialize(), //直接傳表單裡的資料 // data:{ // userName:userName, // password:password // }, success:function (result) { if("Yes"==result){ alert("登入成功!"); }else{ alert("使用者名稱或密碼錯誤"); $("#password").val(""); //將密碼input清空 $("#password").focus(); //將游標定位到密碼input } }, error:function (err) { alert("系統錯誤-loginPage.jsp-ajax"); } }); }; </script> </body> </html>
注意:
第37行,button標籤的type不可以是submit,應該為button!否則你每次點選登入,form表單都會提交一次,導致頁面重新整理一次
第47行,記得引入jquery檔案
第50行,監聽按鈕,執行check函式,去驗證登入資訊
關注check函式中的$.ajax,其標點符號一定看清楚。check函式的功能就是通過ajax將表單資訊送到/ServletLogin去驗證,如果執行成功,ajax會跳到success執行,後面的函式根據Servlet的返回值確定登入狀態。
在工程的src資料夾下新建ServletLogin.java(在IDEA中,右擊src資料夾,選擇new,再選擇Servlet即可)
package Servlet;
import Beans.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "ServletLogin",urlPatterns = {"/ServletLogin"})
public class ServletLogin extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
work(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=response.getWriter();
out.write("No get");
out.flush();
out.close();
}
private void work(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
request.setCharacterEncoding("UTF-8");
String userName = request.getParameter("userName");
String password = request.getParameter("password");
String enPassword = password; //User.encode(password); //md5加密!
String ret="No "+userName;
if(User.isLegal(userName,enPassword)){
request.getSession().setAttribute("user", new User(userName));
request.getSession().setMaxInactiveInterval(60*30);
ret="Yes"; //登入成功
}
PrintWriter out=response.getWriter();
out.write(ret);
out.flush();
out.close();
}
}
注意:
第11行,urlPatterns屬性一定要寫上,想寫什麼就寫什麼,但開頭必須是“/”,例如我的是"/ServletLogin",那麼我用ajax訪問他的時候就直接訪問這個屬性值(可以看看我在loginPage.jsp的第65行 url屬性),這樣寫了之後就不用配置web.xml啦(網上大部分文章使用Servlet還是配置web.xml)
第71行,User.isLegal函式是我在User.java中寫的驗證使用者名稱和密碼的靜態方法,當用戶合法時返回true
DoGet和DoPost方法是自動生成的,get和post的區別這裡不細講了,執行ajax時,type屬性是哪個,呼叫ServletLogin時就自動進入哪個,我這裡直接把DoGet給忽略掉了,只有DoPost才通過驗證。
測試:
寫好兩個檔案後,執行loginPage.jsp,就可以測試登陸了!