Servlet頁面登錄的數據庫驗證程序(一)


一、基本思想是MVC模式,一個登錄頁面login.jsp,一個服務器處理程序Servlet.java,一個MySql數據庫userinfo.

另外還有相關的數據封裝類User和數據庫連接類GetData,如果要加入密碼驗證,可能還要一個錯誤處理頁面error.jsp。在這個小實例中,為了思路簡單一點,暫時沒有密碼驗證。

使用的工具是MyEclipse2015。

由於設計jdbc數據庫的應用,需要准備mysql-connector-java-5.1.26-bin.jar開發包,拷貝到 WEB_INF下的lib文件夾。

二、建立login.jsp頁面。

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%
 3 request.setCharacterEncoding("utf-8");
 4 //從會話中獲取登錄信息
 5 String lUserName = (String)session.getAttribute("lUserName");
 6 %>
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <meta charset="utf-8">
11     <title>My JSP 'login.jsp' starting page</title>
12   </head>
13   
14   <body>
15  <% if (lUserName != ""&&lUserName!=null) {%>
16     歡迎光臨,<%=lUserName%><br><br>
17     <a href="loginserv?action=logout">退出登錄</a>
18  <% } else { %>
19  <!-- 上下代碼段說明:在頁面加載時讀取會話信息,如果讀到有用戶名數據,則顯示歡迎語句,不顯示表單。
20  如果沒有讀到用戶名信息,則顯示登陸請求表單。
21  如果在已登錄狀態,同時會顯示一個退出登錄的鏈接,點擊之后發送“退出登錄” 的請求,在servlet中將繪畫信息中用戶名清空在重定向。 -->
22     <form name="loginfrm" action="loginserv" method="post">
23     <table>
24     <tr><td>用戶名:</td><td><input type="text" name="username" value="zhangsan"></td></tr>
25     <tr><td>&nbsp;&nbsp;&nbsp;&nbsp;碼:</td><td><input type="text" name="password" value="mm123456"></td></tr>
26     <tr><td colspan="2" ><input type="submit" value="登錄"></td></tr>
27     </table>
28     </form>
29  <% } %>
30   </body>
31 </html>
View Code

三、建立用戶數據封裝類User,目的是封裝通過驗證得到的合法用戶記錄數據。

 1 package com.kaly.data;
 2 
 3 public class User {
 4     private int id;//自增長id
 5     private String usename;//用戶名
 6     private String nickname;//昵稱
 7     private String info;//信息
 8     //無參構造方法
 9     public User(){
10         
11     }
12     //有參構造方法
13     public User(int id, String usename, String nickname, String info) {
14         super();
15         this.id = id;
16         this.usename = usename;
17         this.nickname = nickname;
18         this.info = info;
19     }
20     /**
21      * 快捷生成對象數據體
22      * @param usename 用戶名
23      * @param nickname 昵稱
24      * @param info 信息
25      */
26     public void setUserData(String usename, String nickname, String info) {
27         //這個方法是設計為用一行代碼填充實例,一面多行調用set方法顯得代碼冗長,作用相當於有參構造方法,但是作用會有點區別
28         this.usename = usename;
29         this.nickname = nickname;
30         this.info = info;
31     }
32     //下面是setter和getter方法群
33     public int getId() {
34         return id;
35     }
36     public void setId(int id) {
37         this.id = id;
38     }
39     public String getUsename() {
40         return usename;
41     }
42     public void setUsename(String usename) {
43         this.usename = usename;
44     }
45     public String getNickname() {
46         return nickname;
47     }
48     public void setNickname(String username2) {
49         this.nickname = username2;
50     }
51     public String getInfo() {
52         return info;
53     }
54     public void setInfo(String info) {
55         this.info = info;
56     }
57     //覆寫toString是為了調試的時候便捷輸出
58     @Override
59     public String toString() {
60         return "User [id=" + id + ", usename=" + usename + ", username2="
61                 + nickname + ", info=" + info + "]";
62     }
63 }
View Code

四、創建數據庫連接類GetData目的是在Servlet中使用時代碼不致混亂,而且還可以重復使用。

 1 package com.kaly.data;
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.SQLException;
 6 
 7 public class GetData {
 8     //jdbc驅動類名
 9     String driverStr="com.mysql.jdbc.Driver";
10     //數據庫url
11     String dataStr="jdbc:mysql://192.168.2.100:3306/userinfo";
12     //訪問數據庫的用戶名
13     String username="root";
14     //訪問數據庫的密碼
15     String password="admin";
16     //數據庫連接對象
17     private Connection conn;
18     //構造方法
19     public GetData(){
20         try {
21             //加載驅動類
22             Class.forName(driverStr);
23         } catch (ClassNotFoundException e) {
24             e.printStackTrace();
25         }
26     }
27     //獲得數據庫連接對象的方法
28     public Connection getConnection(){
29         
30         try {
31             conn = (Connection) DriverManager.getConnection(dataStr,username,password);
32         } catch (SQLException e) {
33             e.printStackTrace();
34         }
35         return conn;
36     }
37     //關閉數據庫連接
38     public void close(){
39         if (conn!=null) {
40             try {
41                 conn.close();
42             } catch (SQLException e) {
43                 e.printStackTrace();
44             }
45         }
46     }
47 }
View Code

五、用模版建立Servlet程序loginserv.java。

 1 package com.kaly.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 import java.sql.Connection;
 6 import java.sql.PreparedStatement;
 7 import java.sql.ResultSet;
 8 import java.sql.SQLException;
 9 import java.sql.Statement;
10 
11 import javax.mail.Session;
12 import javax.servlet.ServletException;
13 import javax.servlet.http.HttpServlet;
14 import javax.servlet.http.HttpServletRequest;
15 import javax.servlet.http.HttpServletResponse;
16 import javax.servlet.http.HttpSession;
17 
18 import com.kaly.data.GetData;
19 import com.kaly.data.User;
20 
21 public class loginserv extends HttpServlet {
22     public void doGet(HttpServletRequest request, HttpServletResponse response)
23             throws ServletException, IOException {
24         doPost(request, response);
25     }
26 
27     public void doPost(HttpServletRequest request, HttpServletResponse response)
28             throws ServletException, IOException {
29         String realusername=null;//經過驗證的有效用戶名
30         //以下兩行主要解決中文亂碼問題
31         request.setCharacterEncoding("utf-8");
32         response.setCharacterEncoding("utf-8");
33         //獲得表單請求信息
34         String getUser=request.getParameter("username");//用戶名
35         String getpassword=request.getParameter("password");//密碼,這個小程序暫時未驗證密碼
36         String otherAction=request.getParameter("action");//獲取退出登錄等信息
37         //驗證登錄信息
38         GetData data=new GetData();//實例化自定義的GetData對象
39         Connection connection=data.getConnection();//從data中獲得數據連接對象
40         ResultSet rs;//游標對象
41         User user=new User();
42         try {
43             PreparedStatement pStatement=connection.prepareStatement("select * from user where username=?");
44             pStatement.setString(1, getUser);
45             //把經過查詢得到的符合條件的記錄交給游標對象rs
46             rs=pStatement.executeQuery();
47             //在游標對象rs中找到每一條記錄,實際上如果用戶名username不允許重復,則記錄只有一條
48             while(rs.next()){
49                 //把查詢的數據封裝到User對象,以后使用時只需要使用這個對象就可以了
50                 user.setUserData(rs.getString(2), rs.getString(4), rs.getString(5));
51             }
52             data.close();//關閉數據連接
53         } catch (SQLException e) {
54             e.printStackTrace();
55         }
56         HttpSession session=request.getSession();//獲得會話對象
57         session.setAttribute("lUserName", user.getNickname());//向會話對象寫入數據
58         if(otherAction=="logout"){
59             //如果得到了"退出登錄"的請求,則將登錄的用戶名信息置為null
60         session.setAttribute("lUserName", null);    
61         }
62         //重定向到login.jsp頁面
63         response.sendRedirect("login.jsp");
64     }
65 
66 }
View Code

六、查看WEB-INF下的web.xml。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="3.0"
 3     xmlns="http://java.sun.com/xml/ns/javaee"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 6   <servlet>
 7     <description>This is the description of my J2EE component</description>
 8     <display-name>This is the display name of my J2EE component</display-name>
 9     <servlet-name>loginserv</servlet-name>
10     <servlet-class>com.kaly.servlet.loginserv</servlet-class>
11   </servlet>
12 
13   <servlet-mapping>
14     <servlet-name>loginserv</servlet-name>
15     <url-pattern>/loginserv</url-pattern>
16   </servlet-mapping>
17 
18 </web-app>
View Code

注意其中的<url-pattern>節點,系統默認配置的文件在這里容易出錯。
七、工程為普通的Web Project。工程結構如下:

八、創建數據庫userinfo,建立表user,並添加示例數據。

九、重啟服務,加載頁面login.jsp。

輸入一個數據庫中存在的用戶名,點擊"登錄"。經過請求和跳轉后,頁面顯示歡迎和昵稱信息。

點擊"退出登錄"超鏈接。頁面又經過請求和跳轉,顯示登錄表單。

如果輸入了數據庫中沒有的用戶名,頁面看似沒有反應,但是根據頁面表單value可以看出,頁面其實已經經過了請求和跳轉,又回到了原始狀態。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM