一、基本思想是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可以看出,页面其实已经经过了请求和跳转,又回到了原始状态。