登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象。本例中如果有注释不详细的地方,详见其它博客。
功能介绍:简单的登录注册系统,使用了数据库sqlserver、单例模式、正则表达式以及图形化开发等知识。
1、在登录界面,可以登录或者注册用户。 注册用户界面,按照正则表达式规定的格式要求来输入信息,若有误,则重新输入。
2、点击注册,首先连接SQLserver数据库,连接成功则会判断该用户名是否已经存在,若存在,则给出提示。反之则进行注册。
3、登录界面,点击登录按钮时,首先与数据库建立连接。按照用户名和密码来向数据库中查找,若有,则登录成功。反之给出提示。
4、利用单例模式,实现了只创建类SQLserver的一个对象,大大节省了内存开销 。
程序完整代码见:https://github.com/chaohuangtianjie994/A-login-register-System
5、基于此,可以进行大量的拓展功能。
代码如下:
UserRegister.java 登录界面。
package package1; /* * 功能:登录界面带着注册功能,弹出注册界面。 * 将注册的信息保存在数据库中,并且可以进行登录操作。 * author:ywq */ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.sql.*; public class UserRegister extends JFrame implements ActionListener{ //定义登录界面的组件 JButton jb1,jb2,jb3=null; JRadioButton jrb1,jrb2=null; JPanel jp1,jp2,jp3=null; JTextField jtf=null; JLabel jlb1,jlb2=null; JPasswordField jpf=null; public static void main(String[] args) { UserRegister ur=new UserRegister(); } public UserRegister() { //创建组件 //创建组件 jb1=new JButton("登录"); jb2=new JButton("注册"); jb3=new JButton("退出"); //设置监听 jb1.addActionListener(this); jb2.addActionListener(this); jb3.addActionListener(this); jlb1=new JLabel("用户名:"); jlb2=new JLabel("密 码:"); jtf=new JTextField(10); jpf=new JPasswordField(10); jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); jp1.add(jlb1); jp1.add(jtf); jp2.add(jlb2); jp2.add(jpf); jp3.add(jb1); jp3.add(jb2); jp3.add(jb3); this.add(jp1); this.add(jp2); this.add(jp3); this.setVisible(true); this.setResizable(false); this.setTitle("注册登录界面"); this.setLayout(new GridLayout(3,1)); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setBounds(300, 200, 300, 180); } @Override public void actionPerformed(ActionEvent e) { //监听各个按钮 if(e.getActionCommand()=="退出") { System.exit(0); }else if(e.getActionCommand()=="登录") { //调用登录方法 this.login(); }else if(e.getActionCommand()=="注册") { //调用注册方法 this.Regis(); } } //注册方法 public void Regis() { this.dispose(); //关闭当前界面 new UI(); //打开新界面 } //登录方法 public void login() { SQLserver s=new SQLserver(); s.ConnectSQL(); s.SQLverify(jtf.getText(), jpf.getText()); this.jtf.setText(""); this.jpf.setText(""); } }
UI.java 用于注册的页面显示。使用了正则表达式来规定输入的内容。注册时候,需要首先判断用户名是否存在,若存在,则给出提示,反之进行注册。
package package1; import java.awt.event.*; import java.awt.*; import javax.swing.*; /* * 注册界面。 */ class UI extends JFrame implements ActionListener{ //定义组件 JFrame jf; JPanel jp; JLabel jl1,jl2,jl3,jl4; JTextField jtf1,jtf2,jtf3,jtf4; JButton jb1,jb2; public UI() { //初始化组件 jf=new JFrame(); jp=new JPanel(); jl1=new JLabel("请输入用户名:"); jtf1=new JTextField(10); jtf1.setToolTipText("用户名必须为3-6位字母_或者数字"); jl2=new JLabel("请输入密码:"); jtf2=new JTextField(10); jtf2.setToolTipText("密码必须为6位字母_或者数字"); jl3=new JLabel("请输入姓名:"); jtf3=new JTextField(10); jtf3.setToolTipText("姓名必须汉字2-4位"); jl4=new JLabel("请输入学号:"); jtf4=new JTextField(10); jtf4.setToolTipText("学号必须为3-6位数字"); jb1=new JButton("返回"); jb1.setToolTipText("点我返回登录界面哦"); jb2=new JButton("注册"); jb1.addActionListener(this); jb2.addActionListener(this); jp.setLayout(new GridLayout(5,2)); jp.add(jl1); jp.add(jtf1); jp.add(jl2); jp.add(jtf2); jp.add(jl3); jp.add(jtf3); jp.add(jl4); jp.add(jtf4); jp.add(jb1); jp.add(jb2); this.add(jp); this.setTitle("注册界面"); this.setBounds(200, 100, 250, 150); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // this.setResizable(false); } public void actionPerformed(ActionEvent e) { if(e.getActionCommand()=="返回") { this.dispose(); new UserRegister(); // System.out.println("-------"); }else if(e.getActionCommand()=="注册") { //调用注册方法 this.zhuce(); } } public void zhuce() { String regex1="\\w{3,6}"; //用户名必须是3-6位 boolean flag1=jtf1.getText().matches(regex1); String regex2="\\w{6}"; //密码必须是6位 boolean flag2=jtf2.getText().matches(regex2); String regex3="[\\u4e00-\\u9fa5]{2,4}"; //姓名必须是汉字2-4个字 boolean flag3=jtf3.getText().matches(regex3); String regex4="\\d{3,6}"; //学号必须是3-6位 boolean flag4=jtf4.getText().matches(regex4); // if(jtf1.getText()==null||jtf2.getText()==null||jtf3.getText()==null||jtf4.getText()==null) if(flag1==false) { JOptionPane.showMessageDialog(null, "用户名填写错误,必须为3-6位字母_或者数字", "提示信息", JOptionPane.WARNING_MESSAGE); jtf1.setText(""); }else if(flag2==false) { JOptionPane.showMessageDialog(null, "密码填写错误,必须为6位字母_或者数字", "提示信息", JOptionPane.WARNING_MESSAGE); jtf2.setText(""); }else if(flag3==false) { JOptionPane.showMessageDialog(null, "姓名填写错误,必须汉字2-4位", "提示信息", JOptionPane.WARNING_MESSAGE); jtf3.setText(""); }else if(flag4==false) { JOptionPane.showMessageDialog(null, "学号填写错误,必须为3-6位数字", "提示信息", JOptionPane.WARNING_MESSAGE); jtf4.setText(""); }else { //调用注册方法/先检查要注册的用户名是否存在 SQLserver ss=new SQLserver(); ss.ConnectSQL(); ss.ZhuceVerify(jtf1.getText()); // ss.UserRegis(jtf1.getText(),jtf2.getText(),jtf3.getText(), jtf4.getText()); this.jtf1.setText(""); this.jtf2.setText(""); this.jtf3.setText(""); this.jtf4.setText(""); } } }
SQLserver.java实现了与数据库的连接以及查询验证等各个功能。
package package1; import java.sql.*; import javax.swing.JOptionPane; /* * 与数据库相关的操作,单独封装成类 */ class SQLserver { Connection ct; PreparedStatement ps; ResultSet rs; String user,pwd; //将连接数据库的方法封装为一个方法 public void ConnectSQL() { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载驱动 ct=DriverManager.getConnection("jdbc:odbc:ywq"); //得到连接 System.out.println("已成功连接数据库..."); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //注册用户的方法 public void UserRegis(String a,String b,String c,String d) { //创建火箭车 try { ps=ct.prepareStatement("insert into users values(?,?,?,?)"); ps.setString(1,a); ps.setString(2,b); ps.setString(3,c); ps.setString(4,d); //执行 int i=ps.executeUpdate(); if(i==1) { JOptionPane.showMessageDialog(null, "注册成功","提示消息",JOptionPane.WARNING_MESSAGE); }else { JOptionPane.showMessageDialog(null, "注册失败","提示消息",JOptionPane.ERROR_MESSAGE); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 登录验证方法 public void SQLverify(String a,String b) { try { ps=ct.prepareStatement("select * from users where 用户名=? and 密码=? "); ps.setString(1, a); ps.setString(2, b); // ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集 rs = ps.executeQuery(); if(rs.next()) { user = rs.getString(1); pwd = rs.getString(2); JOptionPane.showMessageDialog(null, "登录成功!!!", "提示消息", JOptionPane.WARNING_MESSAGE); System.out.println("成功获取到密码和用户名from数据库"); System.out.println(user + "\t" + pwd + "\t"); }else { JOptionPane.showMessageDialog(null, "用户名或者密码错误,请重新输入!", "提示消息", JOptionPane.ERROR_MESSAGE); } } catch (SQLException e) { e.printStackTrace(); } } //注册验证方法,判断用户名是否已经存在 public void ZhuceVerify(String a) { try { ps=ct.prepareStatement("select * from users where 用户名=?"); // System.out.println(ps); ps.setString(1, a); rs=ps.executeQuery(); if(rs.next()) { JOptionPane.showMessageDialog(null, "该用户名已经存在", "提示信息", JOptionPane.WARNING_MESSAGE); }else { // 进行注册 UI ui=new UI(); this.UserRegis(ui.jtf1.getText(),ui.jtf2.getText(),ui.jtf3.getText(),ui.jtf4.getText()); } } catch (SQLException e) { e.printStackTrace(); } } }