Java簡(jiǎn)易登錄注冊(cè)小程序
登錄注冊(cè)小代碼,將學(xué)過(guò)的一些小知識(shí)融合在一起進(jìn)行了使用,加深印象。本例中如果有注釋不詳細(xì)的地方,詳見(jiàn)其它博客。
功能介紹:簡(jiǎn)單的登錄注冊(cè)系統(tǒng),使用了數(shù)據(jù)庫(kù)sqlserver、單例模式、正則表達(dá)式以及圖形化開(kāi)發(fā)等知識(shí)。
1、在登錄界面,可以登錄或者注冊(cè)用戶。 注冊(cè)用戶界面,按照正則表達(dá)式規(guī)定的格式要求來(lái)輸入信息,若有誤,則重新輸入。
2、點(diǎn)擊注冊(cè),首先連接SQLserver數(shù)據(jù)庫(kù),連接成功則會(huì)判斷該用戶名是否已經(jīng)存在,若存在,則給出提示。反之則進(jìn)行注冊(cè)。
3、登錄界面,點(diǎn)擊登錄按鈕時(shí),首先與數(shù)據(jù)庫(kù)建立連接。按照用戶名和密碼來(lái)向數(shù)據(jù)庫(kù)中查找,若有,則登錄成功。反之給出提示。
4、利用單例模式,實(shí)現(xiàn)了只創(chuàng)建類(lèi)SQLserver的一個(gè)對(duì)象,大大節(jié)省了內(nèi)存開(kāi)銷(xiāo) 。
程序完整代碼見(jiàn):https://github.com/chaohuangtianjie994/A-login-register-System
5、基于此,可以進(jìn)行大量的拓展功能。
代碼如下:
UserRegister.java 登錄界面。
package package1;
/*
* 功能:登錄界面帶著注冊(cè)功能,彈出注冊(cè)界面。
* 將注冊(cè)的信息保存在數(shù)據(jù)庫(kù)中,并且可以進(jìn)行登錄操作。
* 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()
{
//創(chuàng)建組件
//創(chuàng)建組件
jb1=new JButton("登錄");
jb2=new JButton("注冊(cè)");
jb3=new JButton("退出");
//設(shè)置監(jiān)聽(tīng)
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("注冊(cè)登錄界面");
this.setLayout(new GridLayout(3,1));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBounds(300, 200, 300, 180);
}
@Override
public void actionPerformed(ActionEvent e) {
//監(jiān)聽(tīng)各個(gè)按鈕
if(e.getActionCommand()=="退出")
{
System.exit(0);
}else if(e.getActionCommand()=="登錄")
{
//調(diào)用登錄方法
this.login();
}else if(e.getActionCommand()=="注冊(cè)")
{
//調(diào)用注冊(cè)方法
this.Regis();
}
}
//注冊(cè)方法
public void Regis() {
this.dispose(); //關(guān)閉當(dāng)前界面
new UI(); //打開(kāi)新界面
}
//登錄方法
public void login() {
SQLserver s=new SQLserver();
s.ConnectSQL();
s.SQLverify(jtf.getText(), jpf.getText());
this.jtf.setText("");
this.jpf.setText("");
}
}
UI.java 用于注冊(cè)的頁(yè)面顯示。使用了正則表達(dá)式來(lái)規(guī)定輸入的內(nèi)容。注冊(cè)時(shí)候,需要首先判斷用戶名是否存在,若存在,則給出提示,反之進(jìn)行注冊(cè)。
package package1;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
/*
* 注冊(cè)界面。
*/
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("請(qǐng)輸入用戶名:");
jtf1=new JTextField(10);
jtf1.setToolTipText("用戶名必須為3-6位字母_或者數(shù)字");
jl2=new JLabel("請(qǐng)輸入密碼:");
jtf2=new JTextField(10);
jtf2.setToolTipText("密碼必須為6位字母_或者數(shù)字");
jl3=new JLabel("請(qǐng)輸入姓名:");
jtf3=new JTextField(10);
jtf3.setToolTipText("姓名必須漢字2-4位");
jl4=new JLabel("請(qǐng)輸入學(xué)號(hào):");
jtf4=new JTextField(10);
jtf4.setToolTipText("學(xué)號(hào)必須為3-6位數(shù)字");
jb1=new JButton("返回");
jb1.setToolTipText("點(diǎn)我返回登錄界面哦");
jb2=new JButton("注冊(cè)");
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("注冊(cè)界面");
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()=="注冊(cè)")
{
//調(diào)用注冊(cè)方法
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個(gè)字
boolean flag3=jtf3.getText().matches(regex3);
String regex4="\\d{3,6}"; //學(xué)號(hào)必須是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, "用戶名填寫(xiě)錯(cuò)誤,必須為3-6位字母_或者數(shù)字", "提示信息", JOptionPane.WARNING_MESSAGE);
jtf1.setText("");
}else if(flag2==false)
{
JOptionPane.showMessageDialog(null, "密碼填寫(xiě)錯(cuò)誤,必須為6位字母_或者數(shù)字", "提示信息", JOptionPane.WARNING_MESSAGE);
jtf2.setText("");
}else if(flag3==false)
{
JOptionPane.showMessageDialog(null, "姓名填寫(xiě)錯(cuò)誤,必須漢字2-4位", "提示信息", JOptionPane.WARNING_MESSAGE);
jtf3.setText("");
}else if(flag4==false)
{
JOptionPane.showMessageDialog(null, "學(xué)號(hào)填寫(xiě)錯(cuò)誤,必須為3-6位數(shù)字", "提示信息", JOptionPane.WARNING_MESSAGE);
jtf4.setText("");
}else
{
//調(diào)用注冊(cè)方法/先檢查要注冊(cè)的用戶名是否存在
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實(shí)現(xiàn)了與數(shù)據(jù)庫(kù)的連接以及查詢驗(yàn)證等各個(gè)功能。
package package1;
import java.sql.*;
import javax.swing.JOptionPane;
/*
* 與數(shù)據(jù)庫(kù)相關(guān)的操作,單獨(dú)封裝成類(lèi)
*/
class SQLserver {
Connection ct;
PreparedStatement ps;
ResultSet rs;
String user,pwd;
//將連接數(shù)據(jù)庫(kù)的方法封裝為一個(gè)方法
public void ConnectSQL()
{
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加載驅(qū)動(dòng)
ct=DriverManager.getConnection("jdbc:odbc:ywq"); //得到連接
System.out.println("已成功連接數(shù)據(jù)庫(kù)...");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//注冊(cè)用戶的方法
public void UserRegis(String a,String b,String c,String d)
{
//創(chuàng)建火箭車(chē)
try {
ps=ct.prepareStatement("insert into users values(?,?,?,?)");
ps.setString(1,a);
ps.setString(2,b);
ps.setString(3,c);
ps.setString(4,d);
//執(zhí)行
int i=ps.executeUpdate();
if(i==1)
{
JOptionPane.showMessageDialog(null, "注冊(cè)成功","提示消息",JOptionPane.WARNING_MESSAGE);
}else
{
JOptionPane.showMessageDialog(null, "注冊(cè)失敗","提示消息",JOptionPane.ERROR_MESSAGE);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 登錄驗(yàn)證方法
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結(jié)果集,大家可以把ResultSet理解成返回一張表行的結(jié)果集
rs = ps.executeQuery();
if(rs.next())
{
user = rs.getString(1);
pwd = rs.getString(2);
JOptionPane.showMessageDialog(null, "登錄成功!?。?, "提示消息", JOptionPane.WARNING_MESSAGE);
System.out.println("成功獲取到密碼和用戶名from數(shù)據(jù)庫(kù)");
System.out.println(user + "\t" + pwd + "\t");
}else
{
JOptionPane.showMessageDialog(null, "用戶名或者密碼錯(cuò)誤,請(qǐng)重新輸入!", "提示消息", JOptionPane.ERROR_MESSAGE);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//注冊(cè)驗(yàn)證方法,判斷用戶名是否已經(jīng)存在
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, "該用戶名已經(jīng)存在", "提示信息", JOptionPane.WARNING_MESSAGE);
}else
{
// 進(jìn)行注冊(cè)
UI ui=new UI();
this.UserRegis(ui.jtf1.getText(),ui.jtf2.getText(),ui.jtf3.getText(),ui.jtf4.getText());
}
} catch (SQLException e) {
e.printStackTrace();
}
}
} 以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java中Stream?Filter多條件篩選過(guò)濾代碼舉例
這篇文章主要給大家介紹了關(guān)于Java中Stream?Filter多條件篩選過(guò)濾的相關(guān)資料,Java Stream中的filter方法可以使用多個(gè)條件來(lái)過(guò)濾數(shù)據(jù),文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-12-12
Struts2實(shí)現(xiàn)自定義攔截器的三種方式詳解
這篇文章主要介紹了Struts2實(shí)現(xiàn)自定義攔截器的三種方式詳解,一些與系統(tǒng)邏輯相關(guān)的通用功能如權(quán)限的控制和用戶登錄控制等,需要通過(guò)自定義攔截器實(shí)現(xiàn),本節(jié)將詳細(xì)講解如何自定義攔截器,需要的朋友可以參考下2023-07-07
Spring?Cloud?Stream消息驅(qū)動(dòng)組件使用方法介紹
Spring?Cloud?Stream?消息驅(qū)動(dòng)組件幫助我們更快速,更方便,更友好的去構(gòu)建消息驅(qū)動(dòng)微服務(wù)的。當(dāng)時(shí)定時(shí)任務(wù)和消息驅(qū)動(dòng)的?個(gè)對(duì)比。消息驅(qū)動(dòng):基于消息機(jī)制做一些事情2022-09-09
Java并發(fā)編程之volatile與JMM多線程內(nèi)存模型
這篇文章主要介紹了Java并發(fā)volatile與JMM多線程內(nèi)存模型,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
Windows安裝兩個(gè)或多個(gè)JDK并實(shí)現(xiàn)自由切換的方法
最近新接手一個(gè)項(xiàng)目,啟動(dòng)的時(shí)候,發(fā)現(xiàn)有些jar和現(xiàn)在正在使用的JDK版本不一致,一直啟動(dòng)有問(wèn)題,想著就多裝一個(gè)JDK,由于為了保證java的運(yùn)行環(huán)境和編譯環(huán)境保持一致,就需要我們?cè)O(shè)置jdk的環(huán)境變量,所以本文給大家介紹了Windows安裝兩個(gè)或多個(gè)JDK并實(shí)現(xiàn)自由切換的方法2025-03-03
基于HttpServletRequest 相關(guān)常用方法的應(yīng)用
本篇文章小編為大家介紹,基于HttpServletRequest 相關(guān)常用方法的應(yīng)用,需要的朋友參考下2013-04-04

