JAVA实现简单系统登陆注册模块的设计(附详细代码分析)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

前期准备

首先要先明确有个大体的思路,要实现什么样的功能,了解完成整个模块要运用到哪些方面的知识,以及从做的过程中去发现自己的不足。技术方面的进步大都都需要从实践中出来的。

功能:用户注册功能+系统登录功能+生成验证码

知识:窗体设计、数据库设计、JavaBean封装属性、JDBC实现对数据库的连接、验证码(包括彩色验证码)生成技术,还有就些比如像使用正则表达式校验用户注册信息、随机获得字符串、对文本可用字符数的控制等

设计的模块预览图

234902142.jpg160802478.jpg

174829987.jpg

彩色验证码预览图

235413120.jpg

所用数据库:MySQL



数据库设计


创建一个数据库db_database01,其中包含一个表格tb_user,用来保存用户的注册的数据。

其中包含4个字段

id int(11)

username varchar(15)

password varchar(20)

email varchar(45)

MySQL语句可以这样设计:

1
2
3
4
5
6
7
8
9
create schema db_database01;
use  db_database01;
create table tb_user(
id  int ( 11 ) not  null  auto_increment primary key,
username  var char( 15 ) not  null ,
password  var char( 20 ) not  null ,
email  var char( 45 ) not  null
);
insert into tb_user values( 1 , "lixiyu" , "lixiyu" , "lixiyu419@gmail.com" );

这样把lixiyu作为用户名。

select语句检查一下所建立的表格:

185807578.jpg



编写JavaBean封装用户属性


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package  com.lixiyu.model;
public  class  User {
     private  int  id; // 编号
     private  String  username; // 用户名
     private  String  password; // 密码
     private  String  email; // 电子邮箱
     public  int  getId() {
         return  id;
     }
     public  void  setId( int  id) {
         this .id = id;
     }
     public  String  getUsername() {
         return  username;
     }
     public  void  setUsername( String  username) {
         this .username = username;
     }
     public  String  getPassword() {
         return  password;
     }
     public  void  setPassword( String  password) {
         this .password = password;
     }
     public  String  getEmail() {
         return  email;
     }
     public  void  setEmail( String  email) {
         this .email = email;
     }
}


编写JDBC工具类


将与数据库操作相关的代码放置在DBConfig接口和DBHelper类中

DBConfig接口用于保存数据库、用户名和密码信息

代码:

1
2
3
4
5
6
package  com.lixiyu.util;
public  interface  DBConfig {
     String  databaseName =  "db_database01" ; // 数据库名称
     String  username =  "root" ; // 数据库用户名
     String  password =  "lixiyu" ; // 数据库密码
}

为简化JDBC开发,DBHelper使用了了Commons DbUtil组合。

DBHelper类继承了DBConfig接口,该类中包含4种方法:

(1)getConnection()方法:获得数据库连接,使用MySQL数据源来简化编程,避免因加载数据库驱动而发生异常。

(2)exists()方法:判断输入的用户名是否存在。

(3)check()方法:当用户输入用户名和密码,查询使用check()方法是否正确。

(4)save()方法:用户输入合法注册信息后,,将信息进行保存。

详细代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package  com.lixiyu.util;
import  java.sql.Connection;
import  java.sql.SQLException;
import  java.util.Arrays;
import  java.util.List;
import  org.apache.commons.dbutils.DbUtils;
import  org.apache.commons.dbutils.QueryRunner;
import  org.apache.commons.dbutils.ResultSetHandler;
import  org.apache.commons.dbutils.handlers.ColumnListHandler;
import  org.apache.commons.dbutils.handlers.ScalarHandler;
import  org.apache.commons.lang.StringEscapeUtils;
import  com.lixiyu.model.User;
import  com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
public  class  DBHelper  implements  DBConfig {
     /*
      * 使用MySQL数据源获得数据库连接对象
      *
      * @return:MySQL连接对象,如果获得失败返回null
      */
     public  static  Connection getConnection() {
         MysqlDataSource mds =  new  MysqlDataSource(); // 创建MySQL数据源
         mds.setDatabaseName(databaseName); // 设置数据库名称
         mds.setUser(username); // 设置数据库用户名
         mds.setPassword(password); // 设置数据库密码
         try  {
             return  mds.getConnection(); // 获得连接
         catch  (SQLException e) {
             e.printStackTrace();
         }
         return  null ; // 如果获取失败就返回null
     }
     /*
      * 判断指定用户名的用户是否存在
      *
      * @return:如果存在返回true,不存在或者查询失败返回false
      */
     public  static  boolean exists( String  username) {
         QueryRunner runner =  new  QueryRunner(); // 创建QueryRunner对象
         String  sql =  "select id from tb_user where username = '"  + username +  "';" ; // 定义查询语句
         Connection conn = getConnection(); // 获得连接
         ResultSetHandler<List< Object >> rsh =  new  ColumnListHandler(); // 创建结果集处理类
         try  {
             List< Object > result = runner.query(conn, sql, rsh); // 获得查询结果
             if  (result.size() >  0 ) { // 如果列表中存在数据
                 return  true ; // 返回true
             else  { // 如果列表中没有数据
                 return  false ; // 返回false
             }
         catch  (SQLException e) {
             e.printStackTrace();
         finally  {
             DbUtils.closeQuietly(conn); // 关闭连接
         }
         return  false ; // 如果发生异常返回false
     }
     /*
      * 验证用户名和密码是否正确 使用Commons Lang组件转义字符串避免SQL注入
      *
      * @return:如果正确返回true,错误返回false
      */
     public  static  boolean check( String  username, char[] password) {
         username = StringEscapeUtils.escapeSql(username); // 将用户输入的用户名转义
         QueryRunner runner =  new  QueryRunner(); // 创建QueryRunner对象
         String  sql =  "select password from tb_user where username = '"  + username +  "';" ; // 定义查询语句
         Connection conn = getConnection(); // 获得连接
         ResultSetHandler< Object > rsh =  new  ScalarHandler(); // 创建结果集处理类
         try  {
             String  result = ( String ) runner.query(conn, sql, rsh); // 获得查询结果
             char[] queryPassword = result.toCharArray(); // 将查询到得密码转换成字符数组
             if  (Arrays.equals(password, queryPassword)) { // 如果密码相同则返回true
                 Arrays.fill(password,  '0' ); // 清空传入的密码
                 Arrays.fill(queryPassword,  '0' ); // 清空查询的密码
                 return  true ;
             else  { // 如果密码不同则返回false
                 Arrays.fill(password,  '0' ); // 清空传入的密码
                 Arrays.fill(queryPassword,  '0' ); // 清空查询的密码
                 return  false ;
             }
         catch  (SQLException e) {
             e.printStackTrace();
         finally  {
             DbUtils.closeQuietly(conn); // 关闭连接
         }
         return  false ; // 如果发生异常返回false
     }
     /*
      * 保存用户输入的注册信息
      *
      * @return:如果保存成功返回true,保存失败返回false
      */
     public  static  boolean save(User user) {
         QueryRunner runner =  new  QueryRunner(); // 创建QueryRunner对象
         String  sql =  "insert into tb_user (username, password, email) values (?, ?, ?);" ; // 定义查询语句
         Connection conn = getConnection(); // 获得连接
         Object [] params = { user.getUsername(), user.getPassword(), user.getEmail() }; // 获得传递的参数
         try  {
             int  result = runner.update(conn, sql, params); // 保存用户
             if  (result >  0 ) { // 如果保存成功返回true
                 return  true ;
             else  { // 如果保存失败返回false
                 return  false ;
             }
         catch  (SQLException e) {
             e.printStackTrace();
         finally  {
             DbUtils.closeQuietly(conn); // 关闭连接
         }
         return  false ; // 如果发生异常返回false
     }
}

系统登录

1.1窗体设计

161306713.jpg

使用BoxLayout布局,将控件排列方式设置从上至下:

1
contentPane.setLayout( new  BoxLayout(contentPane,BoxLayout.PAGE_AXIS));

窗体使用了标签、文本域、密码域和按钮等控件

实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
public  class  login  extends  JFrame{
private  static  final  long serialVersionUID = -4655235896173916415L;
private  JPanel contentPane;
private  JTextField usernameTextField;
private  JPasswordField passwordField;
private  JTextField validateTextField;
private  String  randomText;
public  static  void  main( String  args[]){
     try  {
         UIManager.setLookAndFeel( "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" );
     catch  (Throwable e) {
         e.printStackTrace();
     }
     EventQueue.invokeLater( new  Runnable(){
         public  void  run(){
             try {
                 login frame= new  login();
                 frame.setVisible( true );
             } catch (Exception e){
                 e.printStackTrace();
             }
         }
     });
                                                                                                                                                                                                                                                                        
}
public  login(){
     setTitle( "系统登录" );
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     contentPane= new  JPanel();
     setContentPane(contentPane);
     contentPane.setLayout( new  BoxLayout(contentPane,BoxLayout.PAGE_AXIS));
                                                                                                                                                                                                                                                                        
     JPanel usernamePanel= new  JPanel();
     contentPane.add(usernamePanel);
                                                                                                                                                                                                                                                                        
     JLabel usernameLable= new  JLabel( "\u7528\u6237\u540D\uFF1A" );
     usernameLable.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
     usernamePanel.add(usernameLable);
                                                                                                                                                                                                                                                                        
     usernameTextField= new  JTextField();
     usernameTextField.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
     usernamePanel.add(usernameTextField);
     usernameTextField.setColumns( 10 );
                                                                                                                                                                                                                                                                        
      JPanel passwordPanel =  new  JPanel();
      contentPane.add(passwordPanel);
      JLabel passwordLabel =  new  JLabel( "\u5BC6    \u7801\uFF1A" );
      passwordLabel.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
      passwordPanel.add(passwordLabel);
      passwordField =  new  JPasswordField();
      passwordField.setColumns( 10 );
      passwordField.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
      passwordPanel.add(passwordField);
      JPanel validatePanel =  new  JPanel();
      contentPane.add(validatePanel);
      JLabel validateLabel =  new  JLabel( "\u9A8C\u8BC1\u7801\uFF1A" );
      validateLabel.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
      validatePanel.add(validateLabel);
      validateTextField =  new  JTextField();
      validateTextField.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
      validatePanel.add(validateTextField);
      validateTextField.setColumns( 5 );
      randomText = RandomStringUtils.randomAlphanumeric( 4 );
      CAPTCHALabel  label  new  CAPTCHALabel(randomText); //随机验证码
      label .setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
      validatePanel.add( label );
                                                                                                                                                                                                                                                                        
     JPanel buttonPanel= new  JPanel();
     contentPane.add(buttonPanel);
                                                                                                                                                                                                                                                                        
     JButton submitButton= new  JButton( "登录" );
      submitButton.addActionListener( new  ActionListener() {
          @Override
          public  void  actionPerformed(ActionEvent e) {
              do_submitButton_actionPerformed(e);
          }
      });
      submitButton.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
      buttonPanel.add(submitButton);
                                                                                                                                                                                                                                                                         
      JButton cancelButton= new  JButton( "退出" );
      cancelButton.addActionListener( new  ActionListener(){
          public  void  actionPerformed(ActionEvent e){
              do_cancelButton_actionPerformed(e);
          }
      });
      cancelButton.setFont( new  Font( "微软雅黑" ,Font.PLAIN, 15 ));
      buttonPanel.add(cancelButton);
                                                                                                                                                                                                                                                                         
      pack(); // 自动调整窗体大小
      setLocation(com.lixiyu.util.SwingUtil.centreContainer(getSize())); // 让窗体居中显示
                                                                                                                                                                                                                                                                         
}

窗体居中显示:

1
2
3
4
5
6
7
8
9
10
11
12
13
public  class  SwingUtil {
     /*
      * 根据容器的大小,计算居中显示时左上角坐标
      *
      * @return 容器左上角坐标
      */
     public  static  Point centreContainer(Dimension size) {
         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // 获得屏幕大小
         int  x = (screenSize.width - size.width) /  2 ; // 计算左上角的x坐标
         int  y = (screenSize.height - size.height) /  2 ; // 计算左上角的y坐标
         return  new  Point(x, y); // 返回左上角坐标
     }
}

1.2获取及绘制验证码


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  class  CAPTCHALabel  extends  JLabel {
     private  static  final  long serialVersionUID = -963570191302793615L;
     private  String  text; // 用于保存生成验证图片的字符串
     public  CAPTCHALabel( String  text) {
         this .text = text;
         setPreferredSize( new  Dimension( 60 36 )); // 设置标签的大小
     }
     @Override
     public  void  paint(Graphics g) {
         super .paint(g); // 调用父类的构造方法
         g.setFont( new  Font( "微软雅黑" , Font.PLAIN,  16 )); // 设置字体
         g.drawString(text,  5 25 ); // 绘制字符串
     }
}

*彩色验证码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public  class  ColorfulCAPTCHALabel  extends  JLabel {
     private  static  final  long serialVersionUID = -963570191302793615L;
     private  String  text; // 用于保存生成验证图片的字符串
     private  Color[] colors = { Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,
             Color.PINK, Color.RED, Color.WHITE, Color.YELLOW }; // 定义画笔颜色数组
     public  ColorfulCAPTCHALabel( String  text) {
         this .text = text;
         setPreferredSize( new  Dimension( 60 36 )); // 设置标签的大小
     }
     @Override
     public  void  paint(Graphics g) {
         super .paint(g); // 调用父类的构造方法
         g.setFont( new  Font( "微软雅黑" , Font.PLAIN,  16 )); // 设置字体
         for  ( int  i =  0 ; i < text.length(); i++) {
             g.setColor(colors[RandomUtils.nextInt(colors.length)]);
             g.drawString( ""  + text.charAt(i),  5  + i *  13 25 ); // 绘制字符串
         }
     }
}


1.3非空校验

1
2
3
4
5
6
7
8
9
10
11
12
if  (username.isEmpty()) { // 判断用户名是否为空
              JOptionPane.showMessageDialog( this "用户名不能为空!" "警告信息" , JOptionPane.WARNING_MESSAGE);
              return ;
          }
          if  ( new  String (password).isEmpty()) { // 判断密码是否为空
              JOptionPane.showMessageDialog( this "密码不能为空!" "警告信息" , JOptionPane.WARNING_MESSAGE);
              return ;
          }
          if  (validate.isEmpty()) { // 判断验证码是否为空
              JOptionPane.showMessageDialog( this "验证码不能为空!" "警告信息" , JOptionPane.WARNING_MESSAGE);
              return ;
          }


1.4合法性校验

1
2
3
4
5
6
7
8
9
10
11
12
if  (!DBHelper.exists(username)) { // 如果用户名不存在则进行提示
             JOptionPane.showMessageDialog( this "用户名不存在!" "警告信息" , JOptionPane.WARNING_MESSAGE);
             return ;
         }
         if  (!DBHelper.check(username, password)) { // 如果密码错误则进行提示
             JOptionPane.showMessageDialog( this "密码错误!" "警告信息" , JOptionPane.WARNING_MESSAGE);
             return ;
         }
         if  (!validate.equals(randomText)) { // 如果校验码不匹配则进行提示
             JOptionPane.showMessageDialog( this "验证码错误!" "警告信息" , JOptionPane.WARNING_MESSAGE);
             return ;
         }


1.5显示主窗体

1
2
3
4
5
6
7
8
9
10
11
12
13
EventQueue.invokeLater( new  Runnable() {
              @Override
              public  void  run() {
                  try  {
                      MainFrame frame =  new  MainFrame(); // 创建主窗体
                      frame.setVisible( true ); // 设置主窗体可见
                  catch  (Exception e) {
                      e.printStackTrace();
                  }
              }
          });
          dispose(); // 将登录窗体销毁
      }

设计主窗体(比较简单这个):

1
2
3
4
5
6
7
8
9
10
11
public  MainFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置单击关闭窗体按钮时执行的操作
        setSize( 450 300 ); // 设置窗体大小
        contentPane =  new  JPanel(); // 创建面板
        contentPane.setLayout( new  BorderLayout( 0 0 )); // 设置面板布局使用边界布局
        setContentPane(contentPane); // 应用面板
        JLabel tipLabel =  new  JLabel( "恭喜您成功登录系统!" ); // 创建标签
        tipLabel.setFont( new  Font( "微软雅黑" , Font.PLAIN,  40 )); // 设置标签字体
        contentPane.add(tipLabel, BorderLayout.CENTER); // 应用标签
        setLocation(SwingUtil.centreContainer(getSize())); // 让窗体居中显示
    }


用户注册


1.1窗体设计

164256125.jpg


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
public  class  Register  extends  JFrame {
     /**
      *
      */
     private  static  final  long serialVersionUID = 2491294229716316338L;
     private  JPanel contentPane;
     private  JTextField usernameTextField;
     private  JPasswordField passwordField1;
     private  JPasswordField passwordField2;
     private  JTextField emailTextField;
     private  JLabel tipLabel =  new  JLabel(); // 显示提示信息
     /**
      * Launch the application.
      */
     public  static  void  main( String [] args) {
         try  {
             UIManager.setLookAndFeel( "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" );
         catch  (Throwable e) {
             e.printStackTrace();
         }
         EventQueue.invokeLater( new  Runnable() {
             @Override
             public  void  run() {
                 try  {
                     Register frame =  new  Register();
                     frame.setVisible( true );
                 catch  (Exception e) {
                     e.printStackTrace();
                 }
             }
         });
     }
     /**
      * Create the frame.
      */
     public  Register() {
         setTitle( "\u7528\u6237\u6CE8\u518C" );
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         contentPane =  new  JPanel();
         setContentPane(contentPane);
         contentPane.setLayout( new  BoxLayout(contentPane, BoxLayout.PAGE_AXIS));
         JPanel usernamePanel =  new  JPanel();
         contentPane.add(usernamePanel);
         JLabel usernameLabel =  new  JLabel( "\u7528  \u6237  \u540D\uFF1A" );
         usernameLabel.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
         usernamePanel.add(usernameLabel);
         usernameTextField =  new  JTextField();
         usernameTextField.setToolTipText( "\u8BF7\u8F93\u51655~15\u4E2A\u7531\u5B57\u6BCD\u6570\u5B57\u4E0B\u5212\u7EBF\u7EC4\u6210\u7684\u5B57\u7B26\u4E32" );
         AbstractDocument doc = (AbstractDocument) usernameTextField.getDocument();
         doc.setDocumentFilter( new  DocumentSizeFilter( 15 )); // 限制文本域内可以输入字符长度为15
         doc.addDocumentListener( new  DocumentSizeListener(tipLabel,  15 ));
         usernameTextField.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
         usernamePanel.add(usernameTextField);
         usernameTextField.setColumns( 10 );
         JPanel passwordPanel1 =  new  JPanel();
         contentPane.add(passwordPanel1);
         JLabel passwordLabel1 =  new  JLabel( "\u8F93\u5165\u5BC6\u7801\uFF1A" );
         passwordLabel1.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
         passwordPanel1.add(passwordLabel1);
         passwordField1 =  new  JPasswordField();
         doc = (AbstractDocument) passwordField1.getDocument();
         doc.setDocumentFilter( new  DocumentSizeFilter( 20 )); // 限制密码域内可以输入字符长度为20
         doc.addDocumentListener( new  DocumentSizeListener(tipLabel,  20 ));
         passwordField1.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
         passwordField1.setColumns( 10 );
         passwordPanel1.add(passwordField1);
         JPanel passwordPanel2 =  new  JPanel();
         contentPane.add(passwordPanel2);
         JLabel passwordLabel2 =  new  JLabel( "\u786E\u8BA4\u5BC6\u7801\uFF1A" );
         passwordLabel2.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
         passwordPanel2.add(passwordLabel2);
         passwordField2 =  new  JPasswordField();
         doc = (AbstractDocument) passwordField2.getDocument();
         doc.setDocumentFilter( new  DocumentSizeFilter( 20 )); // 限制密码域内可以输入字符长度为20
         doc.addDocumentListener( new  DocumentSizeListener(tipLabel,  20 ));
         passwordField2.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
         passwordField2.setColumns( 10 );
         passwordPanel2.add(passwordField2);
         JPanel emailPanel =  new  JPanel();
         contentPane.add(emailPanel);
         JLabel emailLabel =  new  JLabel( "\u7535\u5B50\u90AE\u7BB1\uFF1A" );
         emailLabel.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
         emailPanel.add(emailLabel);
         emailTextField =  new  JTextField();
         doc = (AbstractDocument) emailTextField.getDocument();
         doc.setDocumentFilter( new  DocumentSizeFilter( 45 )); // 限制文本域内可以输入字符长度为45
         doc.addDocumentListener( new  DocumentSizeListener(tipLabel,  45 ));
         emailTextField.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
         emailPanel.add(emailTextField);
         emailTextField.setColumns( 10 );
         JPanel buttonPanel =  new  JPanel();
         contentPane.add(buttonPanel);
         JButton submitButton =  new  JButton( "\u63D0\u4EA4" );
         submitButton.addActionListener( new  ActionListener() {
             @Override
             public  void  actionPerformed(ActionEvent e) {
                 do_submitButton_actionPerformed(e);
             }
         });
         buttonPanel.setLayout( new  BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
         tipLabel.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
         buttonPanel.add(tipLabel);
         Component glue = Box.createGlue();
         buttonPanel.add(glue);
         submitButton.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
         buttonPanel.add(submitButton);
         JButton cancelButton =  new  JButton( "\u53D6\u6D88" );
         cancelButton.addActionListener( new  ActionListener() {
             @Override
             public  void  actionPerformed(ActionEvent e) {
                 do_cancelButton_actionPerformed(e);
             }
         });
         cancelButton.setFont( new  Font( "微软雅黑" , Font.PLAIN,  15 ));
         buttonPanel.add(cancelButton);
         pack(); // 自动调整窗体大小
         setLocation(SwingUtil.centreContainer(getSize())); // 让窗体居中显示
     }


1.2用DocumentFilter限制文本可用字符数


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public  class  DocumentSizeFilter  extends  DocumentFilter {
     private  int  maxSize; // 获得文本的最大长度
     public  DocumentSizeFilter( int  maxSize) {
         this .maxSize = maxSize; // 获得用户输入的最大长度
     }
     @Override
     public  void  insertString(FilterBypass fb,  int  offset,  String  string, AttributeSet attr) throws BadLocationException {
         if  ((fb.getDocument().getLength() + string.length()) <= maxSize) { // 如果插入操作完成后小于最大长度
             super .insertString(fb, offset, string, attr); // 调用父类中的方法
         else  {
             Toolkit.getDefaultToolkit().beep(); // 发出提示声音
         }
     }
     @Override
     public  void  replace(FilterBypass fb,  int  offset,  int  length,  String  text, AttributeSet attrs) throws BadLocationException {
         if  ((fb.getDocument().getLength() + text.length() - length) <= maxSize) { // 如果替换操作完成后小于最大长度
             super .replace(fb, offset, length, text, attrs); // 调用父类中的方法
         else  {
             Toolkit.getDefaultToolkit().beep(); // 发出提示声音
         }
     }
}


1.3用DocumentListener接口实现显示文本控件已用字符


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public  class  DocumentSizeListener  implements  DocumentListener {
     private  JLabel tipLabel;
     private  int  maxSize;
     public  DocumentSizeListener(JLabel tipLabel,  int  maxSize) {
         this .tipLabel = tipLabel;
         this .maxSize = maxSize;
     }
     @Override
     public  void  insertUpdate(DocumentEvent e) {
         setTipText(e);
     }
     @Override
     public  void  removeUpdate(DocumentEvent e) {
         setTipText(e);
     }
     @Override
     public  void  changedUpdate(DocumentEvent e) {
         setTipText(e);
     }
     private  void  setTipText(DocumentEvent e) {
         Document doc = e.getDocument(); // 获得文档对象
         tipLabel.setForeground(Color.BLACK); // 设置字体颜色
         if  (doc.getLength() > (maxSize *  4  5 )) { // 如果已输入字符长度大于最大长度的80%
             tipLabel.setForeground(Color.RED); // 使用红色显示提示信息
         else  {
             tipLabel.setForeground(Color.BLACK); // 使用黑色显示提示信息
         }
         tipLabel.setText( "提示信息:"  + doc.getLength() +  "/"  + maxSize);
     }
}


1.4非空校验


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if  (username.isEmpty()) { // 判断用户名是否为空
             JOptionPane.showMessageDialog( this "用户名不能为空!" "警告信息" , JOptionPane.WARNING_MESSAGE);
             return ;
         }
         if  ( new  String (password1).isEmpty()) { // 判断密码是否为空
             JOptionPane.showMessageDialog( this "密码不能为空!" "警告信息" , JOptionPane.WARNING_MESSAGE);
             return ;
         }
         if  ( new  String (password2).isEmpty()) { // 判断确认密码是否为空
             JOptionPane.showMessageDialog( this "确认密码不能为空!" "警告信息" , JOptionPane.WARNING_MESSAGE);
             return ;
         }
         if  (email.isEmpty()) { // 判断电子邮箱是否为空
             JOptionPane.showMessageDialog( this "电子邮箱不能为空!" "警告信息" , JOptionPane.WARNING_MESSAGE);
             return ;
         }

1.5使用正则表达式校验字符串(合法性校验)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 校验用户名是否合法
        if  (!Pattern.matches( "\\w{5,15}" , username)) {
            JOptionPane.showMessageDialog( this "请输入合法的用户名!" "警告信息" , JOptionPane.WARNING_MESSAGE);
            return ;
        }
        // 校验两次输入的密码是否相同
        if  (!Arrays.equals(password1, password2)) {
            JOptionPane.showMessageDialog( this "两次输入的密码不同!" "警告信息" , JOptionPane.WARNING_MESSAGE);
            return ;
        }
        // 校验电子邮箱是否合法
        if  (!Pattern.matches( "\\w+@\\w+\\.\\w+" , email)) {
            JOptionPane.showMessageDialog( this "请输入合法的电子邮箱!" "警告信息" , JOptionPane.WARNING_MESSAGE);
            return ;
        }
        // 校验用户名是否存在
        if  (DBHelper.exists(username)) {
            JOptionPane.showMessageDialog( this "用户名已经存在" "警告信息" , JOptionPane.WARNING_MESSAGE);
            return ;
        }

1.6保存注册信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
User user =  new  User();
        user.setUsername(username);
        user.setPassword( new  String (password1));
        user.setEmail(email);
        Arrays.fill(password1,  '0' ); // 清空保存密码的字符数组
        Arrays.fill(password2,  '0' ); // 清空保存密码的字符数组
        if  (DBHelper.save(user)) {
            JOptionPane.showMessageDialog( this "用户注册成功!" "提示信息" , JOptionPane.INFORMATION_MESSAGE);
            return ;
        else  {
            JOptionPane.showMessageDialog( this "用户注册失败!" "警告信息" , JOptionPane.WARNING_MESSAGE);
            return ;
        }
    }


至此,一个简单而有完整的登陆注册模块就完成了。


本文转自lixiyu 51CTO博客,原文链接:http://blog.51cto.com/lixiyu/1325046,如需转载请自行联系原作者


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
JavaScript Java BI
Java毕设之新生报到系统的设计与实现
Java毕设之新生报到系统的设计与实现
13 3
|
3天前
|
Java
排课系统【JSP+Servlet+JavaBean】(Java课设)
排课系统【JSP+Servlet+JavaBean】(Java课设)
13 5
|
2天前
|
数据采集 前端开发 Java
Java医院绩效考核系统源码maven+Visual Studio Code一体化人力资源saas平台系统源码
医院绩效解决方案包括医院绩效管理(BSC)、综合奖金核算(RBRVS),涵盖从绩效方案的咨询与定制、数据采集、绩效考核及反馈、绩效奖金核算到科到组、分配到员工个人全流程绩效管理;将医院、科室、医护人员利益绑定;全面激活人才活力;兼顾质量和效益、长期与短期利益;助力医院降本增效,持续改善、优化收入、成本结构。
9 0
|
3天前
|
存储 Java API
java对接IPFS系统-以nft.storage为列
java对接IPFS系统-以nft.storage为列
12 2
|
3天前
|
监控 前端开发 Java
Java基于B/S医院绩效考核管理平台系统源码 医院智慧绩效管理系统源码
医院绩效考核系统是一个关键的管理工具,旨在评估和优化医院内部各部门、科室和员工的绩效。一个有效的绩效考核系统不仅能帮助医院实现其战略目标,还能提升医疗服务质量,增强患者满意度,并促进员工的专业成长
14 0
|
4天前
|
Java 云计算
Java智能区域医院云HIS系统SaaS源码
云HIS提供标准化、信息化、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。优化就医、管理流程,提升患者满意度、基层首诊率,通过信息共享、辅助诊疗等手段,提高基层医生的服务能力构建和谐的基层医患关系。
18 2
|
4天前
|
前端开发 Java 关系型数据库
Java医院绩效考核系统源码B/S架构+springboot三级公立医院绩效考核系统源码 医院综合绩效核算系统源码
作为医院用综合绩效核算系统,系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
25 2
|
5天前
|
JavaScript 小程序 Java
基于java的少儿编程网上报名系统
基于java的少儿编程网上报名系统
11 2
|
5天前
|
JavaScript 小程序 Java
Java毕设之在线医疗服务系统的设计与实现
Java毕设之在线医疗服务系统的设计与实现
9 3
|
5天前
|
JavaScript 小程序 Java
Java毕设之KTV点歌系统
Java毕设之KTV点歌系统
13 2