一、基本思想是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>密 碼:</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>
三、建立用戶數據封裝類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 }
四、創建數據庫連接類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 }
五、用模版建立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 }
六、查看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>
注意其中的<url-pattern>節點,系統默認配置的文件在這里容易出錯。
七、工程為普通的Web Project。工程結構如下:
八、創建數據庫userinfo,建立表user,並添加示例數據。
九、重啟服務,加載頁面login.jsp。
輸入一個數據庫中存在的用戶名,點擊"登錄"。經過請求和跳轉后,頁面顯示歡迎和昵稱信息。
點擊"退出登錄"超鏈接。頁面又經過請求和跳轉,顯示登錄表單。
如果輸入了數據庫中沒有的用戶名,頁面看似沒有反應,但是根據頁面表單value可以看出,頁面其實已經經過了請求和跳轉,又回到了原始狀態。