live and learn

big big world
posts - 5, comments - 27, trackbacks - 0, articles - 1
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JSP+JAVABEAN+SERVLE开发的登录系统

Posted on 2008-11-16 00:25 小人物 阅读(2926) 评论(5)  编辑  收藏
开发用的工具Myeclipse6.0,JDK1.5,TOMCAT5.5,SQLSERVLET2000;用的是最基础的j2ee:jsp+javabean+servlet
1,现在在系统完成后的包类:


2,com.he.db里的DB.java,作用是连接数据库和创建stament和resultset和关闭他们。以及增删查该的执行
 1 package com.he.db;
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.PreparedStatement;
 6 import java.sql.ResultSet;
 7 import java.sql.SQLException;
 8 import java.sql.Statement;
 9 
10 public class DB {
11     
12     private static DB db = null;
13     private static Connection conn = null;
14     private static Statement stmt = null;
15     
16     //单例模式,new DB类的时候,创建唯一对象,只初始化一次,
17     //注意:不要显式交闭此static中的Connection和Statement对象,否则抛空指针异常
18     static{
19         try {
20             String driverClass = "net.sourceforge.jtds.jdbc.Driver";
21             String url = "jdbc:jtds:sqlserver://localhost:1433;DatabaseName=login";
22             String username = "sa";        //edit
23             String password = "";    //edit
24             Class.forName(driverClass);
25             conn = DriverManager.getConnection(url,username,password);
26             stmt = conn.createStatement();
27             System.out.println("--------初始化---------");
28         } catch (ClassNotFoundException e) {
29             System.out.println("---------- 加载数据库驱动类时发生异常: ----------");
30             e.printStackTrace();
31         } catch (SQLException e) {
32             System.out.println("------------ getConnection()方法发生异常--------------");
33         }
34     }
35     
36     //创建PrepareStatement对象
37     public PreparedStatement prepareStmt(String sql){
38         PreparedStatement pstmt = null;
39         try {
40             pstmt = conn.prepareStatement(sql);
41         } catch (SQLException e) {
42             System.out.println("-------------prepareStmt()方法发生异常-------------------");
43             e.printStackTrace();
44         }
45         return pstmt;
46     }
47     
48     //执行查询所有记录操作
49     public ResultSet exeQuery(String sql){
50         ResultSet rs = null;
51         try {
52             rs = stmt.executeQuery(sql);
53         } catch (SQLException e) {
54             System.out.println("------------exeQuery()方法发生异常: --------------------");
55             e.printStackTrace();
56         }
57         return rs;
58     }
59     
60     //执行保存、更新、删除操作
61     public void exeUpdate(String sql){
62         try{
63             stmt.executeUpdate(sql);
64         } catch(SQLException e){
65             System.out.println("------------- exeUpdate()方法发生异常------------------");
66             e.printStackTrace();
67         }
68     }
69     
70     
71     //关闭PreparedStatement对象
72     public void closePstmt(PreparedStatement pstmt){
73         try{
74             pstmt.close();
75             pstmt = null;
76         }catch(SQLException e){
77             System.out.println("-------------------- DB.closePstmt()方法发生异常 -------------------------");
78             e.printStackTrace();
79         }
80     }
81     
82     //关闭ResultSet对象
83     public void closeRs(ResultSet rs){
84         try{
85             rs.close();
86             rs = null;
87         }catch(SQLException e){
88             System.out.println("-------------------- DB.closePstmt()方法发生异常 -------------------------");
89             e.printStackTrace();
90         }
91     }
92     
93 
94 }
95 

3,com.he.manager里的Manager.java,作用是实现登录系统所需要用到的各项功能。例如添加帐号,查看是否数据库里有同名帐号等。。
 1 package com.he.manager;
 2 
 3 import java.sql.PreparedStatement;
 4 import java.sql.ResultSet;
 5 import java.sql.SQLException;
 6 import java.util.ArrayList;
 7 import java.util.Iterator;
 8 import java.util.List;
 9 import java.util.regex.Pattern;
10 
11 import com.he.db.DB;
12 import com.he.pojo.Account;
13 import com.sun.org.apache.xerces.internal.impl.xs.identity.Selector.Matcher;
14 
15 public class Manager {
16 
17     DB db = new DB();
18 
19     // 添加帐号
20     public void addAccount(Account account) {
21         PreparedStatement pstmt = null;
22         String sql = "insert into account(name,pwd,addtime) values(?,?,?)";
23         pstmt = db.prepareStmt(sql);
24         try {
25             pstmt.setString(1, account.getName());
26             pstmt.setString(2, account.getPwd());
27             pstmt.setString(3, account.getAddtime());
28             pstmt.executeUpdate();
29 
30         } catch (SQLException e) {
31             System.out
32                     .println("-----------------Manager.addAccount()方法异常-------------------------");
33             e.printStackTrace();
34         } finally {
35             db.closePstmt(pstmt);
36         }
37     }
38 
39     // 查看数据库里是否有指定name的相同记录;
40     public static boolean HasAccount(String name) {
41         DB db = new DB();
42         ResultSet rs = null;
43         int count = 0;
44         String sql = "select count(*) from account where name = '" + name + "'";
45         rs = db.exeQuery(sql);
46         try {
47             while (rs.next()) {
48                 count = rs.getInt(1);
49             }
50         } catch (SQLException e) {
51             System.out
52                     .println("------------Manager.HasAccount()方法异常------------------------");
53             e.printStackTrace();
54         } finally {
55             db.closeRs(rs);
56         }
57         if (count > 0) {
58             return true;
59         } else
60             return false;
61     }
62 
63     // 判断提交的帐号密码是否有相应的记录在数据库中;
64     public static boolean CheckAccount(String name, String pwd) {
65         DB db = new DB();
66         ResultSet rs = null;
67         int count = 0;
68         String sql = "select count(*) from account where name = '" + name
69                 + "' and pwd = '" + pwd + "";
70         rs = db.exeQuery(sql);
71         try {
72             while (rs.next()) {
73                 count = rs.getInt(1);
74             }
75         } catch (SQLException e) {
76             System.out
77                     .println("-----------Manager.CheckAccount()方法异常--------------");
78         } finally {
79             db.closeRs(rs);
80         }
81         if (count > 0) { // 如果结果大于0;
82             return true// 表示此用户存在;
83         } else
84             return false// 表示此用户不存在;
85     }
86 
87     // 判断提交的帐号密码是否符合要求;
88     public static boolean CheckForm(String name, String pwd) {
89         String regEx="[a-zA-Z0-9]{4,8}+";//正则表达示:四到八位的数字或字母
90         if(name.matches(regEx)&&pwd.matches(regEx)) return true;
91         else return false;
92     }
93 
94 }
95 

4,com.he.pojo里的Account.java,作用是临时存放并传递帐号的各项属性。
 1 package com.he.pojo;
 2 
 3 public class Account {
 4     private int id;
 5     private String name;
 6     private String pwd;
 7     private String addtime;
 8     
 9     public int getId() {
10         return id;
11     }
12     public void setId(int id) {
13         this.id = id;
14     }
15     
16     public String getName() {
17         return name;
18     }
19     public void setName(String name) {
20         this.name = name;
21     }
22     
23     public String getPwd() {
24         return pwd;
25     }
26     public void setPwd(String pwd) {
27         this.pwd = pwd;
28     }
29     
30     public String getAddtime() {
31         return addtime;
32     }
33     public void setAddtime(String addtime) {
34         this.addtime = addtime;
35     }
36     
37 }
38 

5.com.he.bean里的makeCertpic.java,作用是生成验证码的图片。
 1 package com.he.bean;
 2 
 3 import java.awt.Color;
 4 import java.awt.Font;
 5 import java.awt.Graphics;
 6 import java.awt.image.BufferedImage;
 7 import java.io.IOException;
 8 import java.io.OutputStream;
 9 import java.util.Random;
10 import javax.imageio.ImageIO;
11 
12 /**
13  * @author dzy 生成验证码图片
14  */
15 public class makeCertPic {
16     // 验证码图片中可以出现的字符集,可根据需要修改
17     private char mapTable[] = { 'a''b''c''d''e''f''g''h''i',
18             'j''k''l''m''n''o''p''q''r''s''t''u''v',
19             'w''x''y''z''0''1''2''3''4''5''6''7''8',
20             '9' };
21 
22     /**
23      * 功能:生成彩色验证码图片 参数width为生成的图片的宽度,参数height为生成的图片的高度,参数os为页面的输出流
24      */
25     public String getCertPic(int width, int height, OutputStream os) {
26         if (width <= 0)
27             width = 60;
28         if (height <= 0)
29             height = 20;
30         BufferedImage image = new BufferedImage(width, height,
31                 BufferedImage.TYPE_INT_RGB);
32         // 获取图形上下文
33         Graphics g = image.getGraphics();
34         // 设定背景色
35         g.setColor(new Color(0xDCDCDC));
36         g.fillRect(00, width, height);
37         // 画边框
38         g.setColor(Color.black);
39         g.drawRect(00, width - 1, height - 1);
40         // 取随机产生的认证码
41         String strEnsure = "";
42         // 4代表4位验证码,如果要生成更多位的认证码,则加大数值
43         for (int i = 0; i < 4++i) {
44             strEnsure += mapTable[(int) (mapTable.length * Math.random())];
45         }
46         // 将认证码显示到图象中,如果要生成更多位的认证码,增加drawString语句
47         g.setColor(Color.black);
48         g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
49         String str = strEnsure.substring(01);
50         g.drawString(str, 817);
51         str = strEnsure.substring(12);
52         g.drawString(str, 2015);
53         str = strEnsure.substring(23);
54         g.drawString(str, 3518);
55         str = strEnsure.substring(34);
56         g.drawString(str, 4515);
57         // 随机产生10个干扰点
58         Random rand = new Random();
59         for (int i = 0; i < 10; i++) {
60             int x = rand.nextInt(width);
61             int y = rand.nextInt(height);
62             g.drawOval(x, y, 11);
63         }
64         // 释放图形上下文
65         g.dispose();
66         try {
67             // 输出图象到页面
68             ImageIO.write(image, "JPEG", os);
69         } catch (IOException e) {
70             return "";
71         }
72         return strEnsure;
73     }
74 }
75 

6。com.he.servlet里的LoginServlet.java,作用是验证登录。
 1 package com.he.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 import java.security.MessageDigest;
 6 
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import javax.servlet.http.HttpSession;
12 
13 import com.he.manager.Manager;
14 
15 public class LoginServlet extends HttpServlet {
16     public void doGet(HttpServletRequest request, HttpServletResponse response)
17             throws ServletException, IOException {
18         PrintWriter out = response.getWriter();
19         String name = (String) request.getParameter("name");
20         name = name.trim();            //去掉字符串首尾空格
21         String pwd = (String) request.getParameter("pwd");        
22         pwd = pwd.trim();
23         boolean Check = Manager.CheckForm(name, pwd);        //验证输入的帐号密码是否符合规则
24         System.out.println(Check);
25         if (Check) {
26             // 将密码转为MD5加密
27             try {
28                 // -------生成MessageDigest对象MD-------
29                 MessageDigest MD = MessageDigest.getInstance("MD5");
30                 // --------传入要计算的字符---------------
31                 MD.update(pwd.getBytes("UTF8"));
32                 // --------计算信息摘要----------------
33                 byte[] pwdMD5Byte = MD.digest();
34                 pwd = new String(pwdMD5Byte);
35             } catch (Exception e) {
36                 e.printStackTrace();
37             }
38             String certCode = request.getParameter("certCode");
39             //查看输入的帐号密码是否在数据库里有记录
40             boolean tag = Manager.CheckAccount(name, pwd);
41             // 执行输出操作(弹出成功的对话框)
42             response.setCharacterEncoding("gbk"); // 解决中文显示问题
43             HttpSession session = request.getSession();
44             if (certCode.equals((String) session.getAttribute("certCode"))) {
45                 if (tag) {
46                     session.setAttribute("name", name);            //验证成功的话设置session
47                     out
48                             .print("<script language=javascript>alert('Login Succeed!!');window.location.href='SucceedLogin.jsp';</script>");
49                 } else {
50                     out
51                             .print("<script language=javascript>alert('account or password error!!');window.location.href='index.jsp';</script>");
52                 }
53             } else {
54                 out
55                         .print("<script language=javascript>alert('certCode error!!');window.location.href='index.jsp';</script>");
56             }
57         } else {
58             out
59                     .print("<script language=javascript>alert('rule error!!');window.location.href='index.jsp';</script>");
60         }
61     }
62 
63     public void doPost(HttpServletRequest request, HttpServletResponse response)
64             throws ServletException, IOException {
65         doGet(request, response);
66     }
67 
68 }

7。com.he.servlet里的Registe.java作用是进行注册操作。
 1 package com.he.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 import java.util.Date;
 6 import java.security.MessageDigest;
 7 import java.text.SimpleDateFormat;
 8 
 9 import javax.servlet.ServletException;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 import javax.servlet.http.HttpSession;
14 
15 import com.he.manager.Manager;
16 import com.he.pojo.Account;
17 
18 public class RegisteServlet extends HttpServlet {
19     public void doGet(HttpServletRequest request, HttpServletResponse response)
20             throws ServletException, IOException {
21         Date currTime = new Date(); // 添加帐号的时间
22         SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
23         String time = new String(formatter.format(currTime).getBytes(
24                 "iso-8859-1")); // 时间格式化
25         String name = (String) request.getParameter("name");
26         name = name.trim(); // 去除字符串首尾空格
27         String pwd = (String) request.getParameter("pwd");
28         pwd = pwd.trim();
29         boolean Check = Manager.CheckForm(name, pwd); // 验证输入的帐号密码是否符合规则
30         System.out.println(Check);
31         if (Check) {
32             // 在写入数据库之前将密码转为MD5加密
33             try {
34                 // -------生成MessageDigest对象MD-------
35                 MessageDigest MD = MessageDigest.getInstance("MD5");
36                 // --------传入要计算的字符---------------
37                 MD.update(pwd.getBytes("UTF8"));
38                 // --------计算信息摘要----------------
39                 byte[] pwdMD5Byte = MD.digest();
40                 pwd = new String(pwdMD5Byte);
41             } catch (Exception e) {
42                 e.printStackTrace();
43             }
44             boolean tag = Manager.HasAccount(name); // 查看数据库里有没相同的用户名记录
45             if (tag) {
46                 response.setCharacterEncoding("gbk"); // 解决中文显示问题
47                 PrintWriter out = response.getWriter();
48                 out
49                         .print("<script language=javascript>alert('用户名已被占用');window.location.href='registe.jsp';</script>");
50             } else {
51                 // new 一个Account对象,并将表单传过来的值填充它
52                 Account account = new Account();
53                 account.setName(request.getParameter("name"));
54                 account.setPwd(pwd);
55                 account.setAddtime(time);
56                 // 执行持久化操作,保存到数据库
57                 Manager manager = new Manager();
58                 manager.addAccount(account);
59                 // 执行输出操作(弹出成功的对话框)
60                 response.setCharacterEncoding("gbk"); // 解决中文显示问题
61                 HttpSession session = request.getSession();
62                 session.setAttribute("name", request.getParameter("name"));
63                 PrintWriter out = response.getWriter();
64                 out
65                         .print("<script language=javascript>alert('注册成功!');window.location.href='SucceedLogin.jsp';</script>");
66             }
67         } else {
68             response.setCharacterEncoding("gbk"); // 解决中文显示问题
69             PrintWriter out = response.getWriter();
70             out
71                     .print("<script language=javascript>alert('帐号或密码必须是四到八位的数字或字母!!');window.location.href='registe.jsp';</script>");
72         }
73     }
74 
75     public void doPost(HttpServletRequest request, HttpServletResponse response)
76             throws ServletException, IOException {
77         doGet(request, response);
78     }
79 
80 }
81 

8。index.jsp,登录界面。
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
String path 
= request.getContextPath();
String basePath 
= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>
    
<base href="<%=basePath%>">
    
    
<title>My JSP 'index.jsp' starting page</title>
    
<meta http-equiv="pragma" content="no-cache">
    
<meta http-equiv="cache-control" content="no-cache">
    
<meta http-equiv="expires" content="0">    
    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    
<meta http-equiv="description" content="This is my page">
    
<!--
    
<link rel="stylesheet" type="text/css" href="styles.css">
    
-->
  
</head>
      
<script language="JavaScript">

    function check()
    {
       
if( form.name.value=="" )
        {
           alert(
"\请输入您的用户名!!")
               form.name.focus();
           
return false;
        }
    

    
       
       
if( form.pwd.value==""  )
           {
               alert(
"\请输入您的登陆密码!!")
                   form.pwd.focus();
               
return false;
       }
    
return true;
    }

    
</script>
  
  
  
<body>
    
<h1>用户登录</h1>
    
<form name="form" id="form" onSubmit="return check()" method="post" action="LoginServlet">
        
<p>&nbsp;&nbsp;号:<input type="text" name="name" /></p>
        
<p>&nbsp;&nbsp;码:<input type="password" name="pwd" /></p>
        
<P>验证码:<input type="text" name="certCode" /><img src="makeCertPic.jsp" /></P>
        
<p><input type="submit" name="submit" value="登录">
            
<input type="button" onClick="location='registe.jsp'" value="注册" class="btn"/>
        
</p>
    
</form>
  
</body>
</html>

9。registe.jsp,注册界面
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
String path 
= request.getContextPath();
String basePath 
= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>
    
<base href="<%=basePath%>">
    
    
<title>注册</title>
    
<!--
    
<link rel="stylesheet" type="text/css" href="styles.css">
    
-->

  
</head>
  
    
<script language="JavaScript">

    
function check()
    {
       
if( form.name.value=="" )
        {
           alert(
"\请输入您的用户名!!")
               form.name.focus();
           
return false;
        }
    

    
       
       
if( form.pwd.value==""  )
           {
               alert(
"\请输入您的登陆密码!!")
                   form.pwd.focus();
               
return false;
       }
       
if(form.repwd.value=="")
           {
                   alert(
"\请输入您的第二次密码!!")
                       form.repwd.focus();
                   
return false;
           }
       
if(form.pwd.value!=form.repwd.value)
           {
                   alert(
"\两次输入的密码不一致!!")
                       form.repwd.focus();
                   
return false;
       }
    
return true;
    }

    
</script>
  
  
<body>
    
<h1>注册</h1>
   
<form name="form" id="form" onSubmit="return check()" method="post" action="RegisteServlet">
    
<p>帐号:<input name="name" type="text" /></p>
    
<P>密码:<input name="pwd" type="password" /></P>
    
<p>再次输入密码:<input name="repwd" type="password"></p>
    
<p><input type="submit" value="注册" /> <input type="reset" value="重置" /></p>
   
</form>
  
</body>
</html>

10。makeCertpic.jsp 验证码图片的
<%@page contentType="image/jpeg" pageEncoding="gbk" %>
<jsp:useBean id="image" scope="page" class="com.he.bean.makeCertPic" />
<%
    String str 
= image.getCertPic(0,0,response.getOutputStream());
    
// 避免getWriter()和responsegetOutputStream()冲突而产生异常
    out.clear();
    out 
= pageContext.pushBody();
    
// CREATE SESSION
    session.setAttribute("certCode", str); 
%>

11.SucceedLogin.jsp 登录成功的页面
 1 <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
 2 <%@ include file="CheckLogin.jsp" %>
 3 <%
 4 String path = request.getContextPath();
 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 6 %>
 7 
 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 9 <html>
10   <head>
11     <base href="<%=basePath%>">
12     
13     <title>SucceedLogin</title>
14     
15     <meta http-equiv="pragma" content="no-cache">
16     <meta http-equiv="cache-control" content="no-cache">
17     <meta http-equiv="expires" content="0">    
18     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
19     <meta http-equiv="description" content="This is my page">
20     <!--
21     <link rel="stylesheet" type="text/css" href="styles.css">
22     -->
23 
24   </head>
25   
26   <body>
27      <h1>欢迎您</h1>
28     ${sessionScope.name}
29   </body>
30 </html>
31 

12。CheckLogin.jsp 进行未登录就进入登录成功的界面的验证
1 
2 <%
3     if (session.getAttribute("name"== null
4             || session.getAttribute("name").toString().length() == 0) {
5         response.sendRedirect(request.getContextPath() + "/error.jsp");
6     }
7 %>

13.web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns
="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
  
<servlet>
    
<servlet-name>RegisteServlet</servlet-name>
    
<servlet-class>com.he.servlet.RegisteServlet</servlet-class>
  
</servlet>
  
<servlet>
    
<servlet-name>LoginServlet</servlet-name>
    
<servlet-class>com.he.servlet.LoginServlet</servlet-class>
  
</servlet>
  


  
<servlet-mapping>
    
<servlet-name>RegisteServlet</servlet-name>
    
<url-pattern>/RegisteServlet</url-pattern>
  
</servlet-mapping>
  
<servlet-mapping>
    
<servlet-name>LoginServlet</servlet-name>
    
<url-pattern>/LoginServlet</url-pattern>
  
</servlet-mapping>
  
<welcome-file-list>
    
<welcome-file>index.jsp</welcome-file>
  
</welcome-file-list>
</web-app>

14.到此,我的注册登录系统基本完成了。新人作品,希望大家批评指正。


此文为原创,如有转载请注明出处http://www.blogjava.net/gdhqs/。如有错误,请大家批评指正,谢谢!


评论

# re: JSP+JAVABEAN+SERVLE开发的登录系统  回复  更多评论   

2008-11-17 12:24 by 心梦帆影
好,写得非常好,非常不错!支持一下!

# re: JSP+JAVABEAN+SERVLE开发的登录系统  回复  更多评论   

2008-11-18 18:35 by foolgirl
支持支持~~~~~~~~~~~~~~~~~~~~~~~~~~~~~··

# re: JSP+JAVABEAN+SERVLE开发的登录系统  回复  更多评论   

2010-04-28 14:03 by Puge
完整源码能发我一份吗? 谢啦~
zhaowyvern@yahoo.cn

# re: JSP+JAVABEAN+SERVLE开发的登录系统  回复  更多评论   

2010-05-01 22:27 by SIU SOO MUN
NB NAFFY~~~~NB NAFFY~~~~NB NAFFY~~~~NB NAFFY~~~~

# re: JSP+JAVABEAN+SERVLE开发的登录系统[未登录]  回复  更多评论   

2013-06-10 15:33 by Emma
问一下,我用了楼主的登录系统,怎么说表名附近有语法错误呢?还说rs......有空指针异常

只有注册用户登录后才能发表评论。


网站导航: