jsp+dao+bean+servlet(MVC模式)實現簡單使用者登入和註冊頁面
功能介紹
本專案通過使用jsp和servlet實現簡單的使用者登入。主要邏輯為:
- 如果使用者不存在,則首先進行註冊(註冊資訊同步到資料庫中)。
- 進行註冊後,可進入登入頁面對賬號進行登入。
- 如果賬號存在,則正確跳轉到歡迎介面,否則提示使用者賬號資訊輸入錯誤。
- 使用者進行登入頁面時需要填寫驗證碼同時可勾選是否兩週內免登陸。
- 使用者進入歡迎介面,則會顯示這是使用者第幾次登入,如果不是第一次登入則會顯示上次登入時間。
- 如果使用者直接進入welcome,(沒有進行登入,直接開啟welcome.jsp)則會跳轉到登入頁面,防止非法登入。
前期工作準備
1.安裝了Tomcat並可以成功使用。
mysql-connector-java-5.1.9.jar包(可在官方下載或者通過maven引入mysql依賴),需要注意mysql-connector-java-5.1.9.jar需要放在C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext路徑下,否則會出現連線資料庫異常。
引入maven依賴:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency>
建立資料庫
如果在DOS視窗下建立表的話則應該加上ENGINE=InnoDB DEFAULT CHARSET=utf-8:表示可以新增中文字元,否則直接新增中文字元會出現亂碼 。
CREATE TABLE `usert` ( `username` varchar(20) DEFAULT NULL,`password` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf-8
此時資料庫為空,無資料需要先進行註冊才能登陸成功。
Bean封裝的資料資訊
User:
public class User { private String name; private String pd; public User(){} public String getPd() { return pd; } public void setPd(String pd) { this.pd = pd; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Count:
public class Counter { private int count=1; public Counter(){} public int getCount() { return count++; } public void setCount(int count) { this.count = count; } }
Dao對資料庫進行操作
package Dao; import java.sql.*; import java.util.ArrayList; public class UserDao { public boolean SearchUser(String u,String p) throws SQLException { PreparedStatement preparedStatement = null; ResultSet rs =null; Connection con = null; //啟動mysql驅動器 try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8","root","123456"); String sql = "select * from usert where username=? and password=?"; preparedStatement = con.prepareStatement(sql); preparedStatement.setString(1,u); preparedStatement.setString(2,p); rs = preparedStatement.executeQuery(); if(rs.next()){ return true; } else { return false; } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { if(rs!=null) { rs.close(); } if(preparedStatement!=null) { preparedStatement.close(); } if(con!=null){ con.close(); } } return false; } public void insertUser(String u,String p) throws SQLException { ArrayList users=new ArrayList(); PreparedStatement preparedStatement = null; Connection con = null; //啟動mysql驅動器 try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8","123456"); preparedStatement = con.prepareStatement("insert into usert values(?,?)"); preparedStatement.setString(1,p); preparedStatement.executeUpdate(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { if(con!=null) { con.close(); } if(preparedStatement!=null) { preparedStatement.close(); } } } }
實現登入頁面
三個頁面處理
歡迎介面(LoginServlet.jsp)
1.程式碼
<%@ page import="java.net.URLEncoder" %> <%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8" language="java" %> <html> <head> <title>LoginServlet</title> </head> <body> <script type="text/javascript"> function validate() { if(login.username1.value===""){ alert("賬號不能為空"); return; } if(login.passwd.value===""){ alert("密碼不能為空"); return; } if(login.code.value===""){ alert("請輸入正確的驗證碼"); return; } login.submit(); } function refresh() { login.imgValidate.src="index.jsp?id="+Math.random(); } </script> <% response.setCharacterEncoding("utf-8"); %> <form name="login" action="/LoginCl" method="post"> 使用者名稱:<input type="text" name="username1"><br> 密碼:<input type="password" name="passwd"><br> <input type="checkbox" name="keep" >兩週內免登陸<br> 驗證碼:<input type="text" name="code" size=10> <%--點選圖片可進行驗證碼重新整理--%> <img name="imgValidate" src = "index.jsp" onclick="refresh()" ><br> <%--注意此處的button和submit的區別--%> <input type="button" value="登入" onclick="validate()"> <% String username = null; String password = null; Cookie[] cookies = request.getCookies(); for (int i = 0; i < cookies.length; i++) { if ("username".equals(cookies[i].getName())) { username = cookies[i].getValue(); } else if ("password".equals(cookies[i].getName())) { password = cookies[i].getValue(); } } if (username != null && password != null) { response.sendRedirect("welcome.jsp?uname=" +URLEncoder.encode(username,"utf-8")+ "&password=" + password); } %> </form> <form action="register.jsp" method="post"> <input type="submit" value="註冊"> </form> </body> </html>
2.頁面如下:
驗證碼(index.jsp)
(點選驗證碼可以實現更新驗證碼)
<script type="text/javascript"> function refresh() { src="index.jsp?id="+Math.random(); } </script> <%@ page contentType="charset=UTF-8" language="java" import ="java.awt.*" import ="java.awt.image.BufferedImage" import="java.util.*" import="javax.imageio.ImageIO" pageEncoding="gb2312"%> <% response.setHeader("Cache-Control","no-cache"); //在記憶體中建立影象 int width=60,height=20; BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //獲取畫筆 Graphics g=image.getGraphics(); //設定背景色 g.setColor(new Color(200,200,200)); g.fillRect(0,width,height); //取隨機產生的驗證碼(4位數字) Random rnd=new Random(); int randNum=rnd.nextInt(8999)+1000; String randStr=String.valueOf(randNum); //將驗證碼存入session session.setAttribute("randStr",randStr); //將驗證碼顯示到影象中 g.setColor(Color.black); g.setFont(new Font("",Font.PLAIN,20)); g.drawString(randStr,10,17); //隨機產生100個干擾點,使影象中的驗證碼不易被其他程式探測到 for (int i = 0; i < 100; i++) { int x=rnd.nextInt(width); int y=rnd.nextInt(height); g.drawOval(x,y,1,1); } //輸出影象到頁面 ImageIO.write(image,"JPEG",response.getOutputStream()); out.clear(); out=pageContext.pushBody(); %>
登入處理頁面(LoginCl.java(servlet))
業務邏輯處理頁面
package Register; import Dao.UserDao; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException; import java.io.PrintWriter; import java.net.URLEncoder; import java.sql.*; @WebServlet("/LoginCl") public class LoginCl extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { //中文亂碼解決方法 response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("utf-8"); //防止非法登入 得到session HttpSession httpSession = request.getSession(true); //修改session的存在時間為20s httpSession.setMaxInactiveInterval(20); httpSession.setAttribute("pass","ok"); //獲取使用者名稱的賬號和密碼 String u = null; //針對jsp 其username為username1 u = request.getParameter("username1"); String p = null; p = request.getParameter("passwd"); //得到提交的驗證碼 String code = request.getParameter("code"); //獲取session驗證碼 HttpSession session = request.getSession(); String randStr = (String) session.getAttribute("randStr"); //獲取到 if (code.equals(randStr)) { //訪問資料庫 UserDao userDao=new UserDao(); try { if (!userDao.SearchUser(u,p)) { response.getWriter().println("<a href=LoginServlet.jsp>抱歉:賬號或密碼錯誤,請注意核實資訊重新輸入</a>"); return; } else { String keep = request.getParameter("keep"); if (keep != null) { //建立cookie Cookie cookie1 = new Cookie("username",u); Cookie cookie2 = new Cookie("password",p); //設定關聯路徑 cookie1.setPath(request.getContextPath()); cookie2.setPath(request.getContextPath()); //設定cookie的消亡時間 兩週 cookie1.setMaxAge(2 * 7 * 24 * 60 * 60); cookie1.setMaxAge(2 * 7 * 24 * 60 * 60); //把cookie資訊寫給瀏覽器 response.addCookie(cookie1); response.addCookie(cookie2); } response.sendRedirect("welcome.jsp?uname=" + URLEncoder.encode(u,"utf-8") + "&password=" + p); } } catch (SQLException e) { e.printStackTrace(); } } } public void doPost(HttpServletRequest request,IOException{ this.doGet(request,response); } }
如果當前不存在該使用者,則會輸出賬號密碼錯誤等資訊,存在該使用者則會跳轉到歡迎介面。
歡迎介面(welcome.jsp)
<%@ page import="java.util.Date" %> <%@ page contentType="text/html;charset=gb2312" pageEncoding="gb2312" language="java" import="bean.*" %> <%@ page import="java.net.URLDecoder" %> <html> <head> <title>welcome</title> </head> <body> <% request.setCharacterEncoding("gb2312"); HttpSession httpSession=request.getSession(true); String val=(String)httpSession.getAttribute("pass"); if(val==null){ response.sendRedirect("LoginServlet.jsp"); } application.setAttribute("COUNTER",new Integer(counter)); %> <jsp:useBean id="mycount" class="bean.Counter" scope="session"/> <jsp:useBean id="user" class="bean.User" scope="session"> <jsp:setProperty name="user" property="name" param="uname"/> <jsp:setProperty name="user" property="pd" param="password"/> </jsp:useBean> <h1>主介面</h1> <%--welcome name =<%=u%> password =<%=p%><br>--%> <%--welcome name :<jsp:getProperty name="user" property="name" />--%> welcome name : <% out.println(URLDecoder.decode(user.getName(),"utf-8")); %> password:<jsp:getProperty name="user" property="pd" /><br> <%--welcome name :<%out.println(session.getAttribute("username"));%> password:<%out.println(session.getAttribute("password"));%><br>--%> <%--這是你第:<%=counter%>次訪問本網站!<br>--%> 這是你第:<jsp:getProperty name="mycount" property="count"/> 次訪問本網站!<br> <a href='LoginServlet.jsp'>返回重新登入</a><br> <% Cookie[] cookies = request.getCookies(); if(cookies!=null) { for (int i = 0; i < cookies.length; i++) { if (cookies[i].getName().equals("lastAccessTime")) { out.println("您上次訪問的時間是:"); Long lastAccessTime = Long.parseLong(cookies[i].getValue()); Date date = new Date(lastAccessTime); out.println(date.toLocaleString()); } } } //使用者訪問過後重新設定使用者的訪問時間,儲存在cookie中,然後傳送到客戶端瀏覽器 Cookie cookie=new Cookie("lastAccessTime",System.currentTimeMillis()+""); //設定cookie的有效期為5min cookie.setMaxAge(300); //將cookie物件新增到response物件中,這樣伺服器在輸出response物件中的內容時 // 就會把cookie也輸入到客戶端瀏覽器 response.addCookie(cookie); %> </body> </html>
實現註冊頁面
資訊註冊(register.jsp)
註冊資訊時需要對使用者輸入的密碼進行判斷:必須有數字和大小寫英文且長度在6-20之間,為了簡化程式碼這裡使用的是正則表示式進行判斷。
<%@ page language="java" pageEncoding="gb2312" %> <html> <head> <title>register</title> </head> <body> <h1>歡迎您進行註冊</h1> <script language="JavaScript" type="text/javascript"> function checkPassword() { var ps=/^[A-Za-z0-9]{6,20}$/; if (!ps.exec(register.password1.value)) { alert("密碼必須同時包含大小寫字母和數字且長度應該在6-20之間"); return; } register.submit(); } </script> <form name="register" action="registerMessage.jsp" method="post"> 請輸入賬號:<input type="text" name="name"><br> 請輸入密碼(要求:必須包含大小寫英文和數字無非法字元,長度大於6位小於20位):<input type="password" name="password1"><br> 請選擇性別:<input name="sex" type="radio" value="男" checked>男 <input name="sex" type="radio" value="女" >女<br> 請選擇家鄉:<select name="home" > <option value="北京">北京</option> <option value="上海">上海</option> <option value="陝西">陝西</option> </select> <br> 請選擇您的愛好:<input name="fav" type="checkbox" value="唱歌">唱歌 <input name="fav" type="checkbox" value="跳舞">跳舞 <input name="fav" type="checkbox" value="打球">打球 <input name="fav" type="checkbox" value="玩遊戲">玩遊戲<br> <input type="button" value="註冊" onclick="checkPassword()"> </form> </body> </html>
點選註冊後則會跳轉到註冊成功頁面,將其賬號和密碼進行儲存到資料庫中,後可以直接進行登入。
註冊成功頁面(registerMessage.jsp)
<%@ page import="java.sql.*" %> <%@ page import="Dao.UserDao" %> <%@ page language="java" pageEncoding="gb2312" %> <html> <head> <title>message</title> </head> <body> <h2>資訊註冊成功!該使用者註冊資訊如下:</h2> <% request.setCharacterEncoding("gb2312"); String name=request.getParameter("name"); String password=request.getParameter("password1"); String sex = request.getParameter("sex"); String home = request.getParameter("home"); out.println("賬號:"+name); out.println("密碼:"+password); out.println("性別:"+sex); out.println("家鄉:"+home); out.println("興趣愛好:"); String[] fav = request.getParameterValues("fav"); for (int i = 0; i < fav.length; i++) { out.print(fav[i]+" "); } try { UserDao userDao=new UserDao(); userDao.insertUser(name,password); out.println("<a href=LoginServlet.jsp>資訊註冊成功,點選此處進行登入</a>"); } catch (SQLException e) { e.printStackTrace(); } %> </body> </html>
(如下所示,資料新增成功)
功能演示
至此此專案結束,我演示一下登入時的場景。
1.資料庫資料
2.輸入資料庫中沒有的資訊
3.賬號密碼正確
ps:需要注意一定要填寫賬戶或者密碼或者驗證碼,否則則會彈出錯誤視窗。
eg:
總結
此專案需要用到的知識點比較多,其中包括 jsp,servlet,mysql,cookie, Javabean等。需要將學到的web知識聯絡起來。
到此這篇關於jsp+dao+bean+servlet(MVC模式)實現簡單使用者登入和註冊頁面的文章就介紹到這了,更多相關jsp servlet登入註冊內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!