您的位置:首页 > 职场人生

黑马程序员—java技术blog—第十六篇java基础应用模拟注册登录最终版本

2015-09-27 16:40 696 查看
------- <a href="http://www.itheima.com"
target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

 最终版本:应用到了面向对象(继承、接口、抽象类)、集合、数组、IO流、线程与GUI等重要知识点。可以很好地让我们把基础的知识从头到尾的梳理一遍,有助于我们对基础基础的知识做一个比较全面的复习与总结。
启动程序的类: MainApp.java
 用户信息类:    User.java
 用户操作类:    UserOperator.java
 
 -------------------
 cn.itcast.ui
  启动程序的类: MainApp.java
 cn.itcast.pojo
  用户信息类:    User.java
 cn.itcast.dao
  用户操作接口:    UserOperator.java
 cn.itcast.dao.impl
  用户操作实现类: UserOperatorImpl.java
 
 ------------------------
 -------------------
 cn.itcast.ui
  启动程序的类: MainApp.java
 
   IndexFrame.java 主页面
   LoginRegisterFrame.java 登录注册页面
    |- LoginRegisterFrame_Login.java 登录页面 功能实现
    |- LoginRegisterFrame_Register.java 注册页面功能实现
 
 
 cn.itcast.pojo
  用户信息类:    User.java
 cn.itcast.dao
  用户操作接口:    UserOperator.java
 cn.itcast.dao.impl
  用户操作实现类: UserOperatorImpl.java
 
------------------------------------------------
最后版本程序的结构

 --------------------------------------
 客户端
 
 cn.itcast.ui 界面
  (主界面)IndexFrame.java
  (登录注册页面_登录)LoginRegisterFrame_Login.java
  (登录注册页面_注册)LoginRegisterFrame_Register.java
  (登录注册页面_基本类)LoginRegisterFrame.java
  (启动器)MainApp.java
 
 cn.itcast.dao 接口
  (用户操作接口)UserOperator.java

 cn.itcast.dao.impl 接口实现类
  (用户操作接口实现类)UserOperatorImpl.java
 
 cn.itcast.bean 实体
  (用户信息类)User.java
 
 ---------------------------------
 服务器端
 
 cn.itcast.server 服务器端
  (服务器端注册处理类)RegisterServer.java
  (服务器端登录处理类)LoginServer.java
  (服务器端启动器)ServerMainApp.java
 
 存储已存在的用户信息
 UserInfo.txt (该文件存在服务器端) 

案例:最终版模拟注册登录系统

* 用户信息类: User.java 用户名 密码

 */

public class User implements Serializable {
private String username;
private String password;

public User() {
super();
}

public User(String username, String password) {
super();
this.username = username;
this.password = password;
}

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;
}

}

* 用户操作实现类: UserOperatorImpl.java

 *

 */

public class UserOperatorImpl implements UserOperator {

/**
* 登录功能
* @param username 用户名
* @param password 密码
* @return 登录是否成功
*/
@Override
public boolean isLogin(String username, String password) {
boolean flag = false;
try {
//连接服务器,发送数据给服务器端
Socket s = new Socket("192.168.35.165", 10086);
User user = new User(username, password);
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(user);
//告知服务器端,客户端写入数据完毕
s.shutdownOutput();

//获取服务器反馈信息
DataInputStream dis = new DataInputStream(s.getInputStream());
flag = dis.readBoolean();
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}

/**
* 注册功能
* @param user 要注册的用户
* @return 注册是否成功
*/
@Override
public boolean isRegister(User user) {
boolean flag = false;
try {
//连接服务器
Socket s = new Socket("192.168.35.165", 10000);
//把User用户信息 发送给服务器端
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(user);
//告知服务器端,输出流数据写入完毕
s.shutdownOutput();

//-----------------------
//获取服务器的反馈信息
DataInputStream dis = new DataInputStream(s.getInputStream());
flag = dis.readBoolean();

} catch (Exception e) {
e.printStackTrace();
}

return flag;
}

}

 用户操作接口:    UserOperator.java

 * 登录

 * 注册

 */

public interface UserOperator {
/**
* 登录功能
* @param username 用户名
* @param password 密码
* @return 登录是否成功
*/
public abstract boolean isLogin(String username, String password);

/**
* 注册功能
* @param user 要注册的用户
* @return 注册是否成功
*/
public abstract boolean isRegister(User user);

}

* (服务器端登录处理类)LoginServer.java

 */

public class LoginServer {

//构造方法
public LoginServer() throws IOException{
//创建服务器端登录 ServerSocket
ServerSocket ss = new ServerSocket(10086);
while (true) {
//等待客户端Socket对象连接
final Socket s = ss.accept();
//创建线程对象, 为了与客户端Socket数据交互
new Thread(){
public void run() {
try {
//获取客户端Socket的用户登录信息
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
User user = (User) ois.readObject();
//读取UserInfo.txt文件中的用户信息
BufferedReader brFile = new BufferedReader(new FileReader("UserInfo.txt"));
String line = null;
boolean flag = false;
while ((line = brFile.readLine()) != null) {
//获取每一个用户的账号与密码
String[] userArray = line.split("=");//0,代表账号,1,代表密码
if (user.getUsername().equals(userArray[0]) && user.getPassword().equals(userArray[1]) ) {
//说明 要登录的用户信息(账号密码) 与 文件中已存在的用户信息(账号密码) 相同, 给客户端返回 登录成功 
flag = true;
break;

}

//根据flag值,给客户端编写反馈信息
DataOutputStream dos = new DataOutputStream(s.getOutputStream());

if (flag) {
//说明 要登录的用户信息(账号密码) 与 文件中已存在的用户信息(账号密码) 相同, 给客户端返回 登录成功 
dos.writeBoolean(true);
} else {
//说明 要登录的用户信息(账号密码) 与 文件中已存在的用户信息(账号密码) 不相同, 给客户端返回 登录失败
dos.writeBoolean(false);
}

//关闭Socket流
s.close();
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
}

}

/*

 * (服务器端注册处理类)RegisterServer.java

 */

public class RegisterServer {

//构造方法
public RegisterServer() throws IOException{//创建服务器端注册ServerSocket 10000
ServerSocket ss = new ServerSocket(10000);
while (true) {
//等待客户端Socket对象的连接
final Socket s = ss.accept();
//创建线程对象,完成与客户端数据通信
new Thread(){
public void run() {
try {
//获取客户端SOcket发来的User信息
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
User user = (User) ois.readObject();

//读取UserInfo.txt文件中的用户信息
BufferedReader brFile = new BufferedReader(new FileReader("UserInfo.txt"));
String line = null;
boolean flag = false; //记录要注册的用户名是否存在
while ((line = brFile.readLine()) != null) {
//获取文件中每个用户的用户名
String[] userArray = line.split("=");
//0角标 代表 用户名, 1角标代表 密码

//判断要注册的用户名  与 已存在的用户是否相同
if (user.getUsername().equals(userArray[0])) {
//如果用户名同名,说明要注册的用户名称已存在
flag = true;
break;
}
}

//根据 要注册的用户名是否存在, 来确定是否向文件中 添加用户信息
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
if (flag) {
//说明,要注册的用户名在文件中 已经存在,不注册了,给客户端返回注册失败
dos.writeBoolean(false);

} else {
//说明,这是一个新用户名, 注册用户信息写入到文件中, 给客户端返回注册成功
PrintWriter pwFile = new PrintWriter(new FileWriter("UserInfo.txt", true), true);//开启自动刷新,自动追加
pwFile.println(user.getUsername()+"="+user.getPassword());
pwFile.close();
// 给客户端返回注册成功
dos.writeBoolean(true);
}
//关闭Socket流
s.close();

} catch (Exception e) {
e.printStackTrace();
}

};
}.start();
}

}

}

* (服务器端启动器)ServerMainApp.java

 */

public class ServerMainApp {
public static void main(String[] args) {
new Thread(){
public void run() {
try {
LoginServer login = new LoginServer();
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();

new Thread(){
public void run() {
try {
RegisterServer register = new RegisterServer();
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();

}

}

* IndexFrame.java 主页面

 */

public class IndexFrame extends JFrame {
private MenuItem exitMI = new MenuItem("Exit"); //菜单项

//空参数构造方法
public IndexFrame () {
//窗体初始化方法
init();
//菜单的制作
addMenu();
//菜单项 点击事件处理
addMenuItemListener();

}

//菜单项 点击事件处理
private void addMenuItemListener() {
exitMI.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}

///菜单的制作
private void addMenu() {
MenuBar menuBar = new MenuBar();//菜单栏
Menu fileMenu = new Menu("File");//菜单
//组装菜单
fileMenu.add(exitMI);
menuBar.add(fileMenu);
this.setMenuBar(menuBar);

}

//窗体初始化方法
private void init() {
//标题
this.setTitle("XXX 网站主页面");
//窗体大小与位置
this.setBounds(350, 150, 600, 400);
//窗体大小固定
this.setResizable(false);
//关闭窗口默认操作
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

 LoginRegisterFrame.java 登录注册页面

 * 

 * 登录注册页面的基本页面, 该页面中没有功能的实现,只有页面的布局显示

 * 具体的功能由子类完成

 */

public abstract class LoginRegisterFrame extends JFrame {
protected JTextField usernameTF = null;//用户名文本框
protected JTextField passwordTF = null;//密码文本框
protected JButton leftBtn = null;//左边按钮
protected JButton rightBtn = null;//右边按钮

//构造方法
public LoginRegisterFrame(){
//窗体的初始化操作
init();
//添加组件到窗口
addComponent();
//为组件添加事件监听
addListener();
}

private void addListener() {
//左边按钮
leftBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
System.out.println("左边按钮被点击");
leftBtnMethod();
}
});
//右边按钮
rightBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
System.out.println("---右边按钮被点击");
rightBtnMethod();
}
});
}

public abstract void leftBtnMethod(); //由子类编写
public abstract void rightBtnMethod();//由子类编写

private void addComponent() {
//创建组件
JLabel usernameLabel = new JLabel("用户名:");
JLabel passwordLabel =new JLabel("密 码:");
usernameTF = new JTextField(10);
passwordTF = new JTextField(10);
leftBtn =  new JButton("左边");
rightBtn = new JButton("右边");
//设置组件的大小与位置
usernameLabel.setBounds(30, 50, 60, 20);
passwordLabel.setBounds(30, 120, 60, 20);
usernameTF.setBounds(100, 50, 150, 30);
passwordTF.setBounds(100, 120, 150, 30);
leftBtn.setBounds(30, 200, 100, 30);
rightBtn.setBounds(150, 200, 100, 30);

//把组件添加到窗体中
this.add(usernameLabel);
this.add(passwordLabel);
this.add(usernameTF);
this.add(passwordTF);
this.add(leftBtn);
this.add(rightBtn);
}

//窗体的初始化操作
private void init() {
//设置标题
this.setTitle("登录注册基本页面");
//设置窗体的大小与位置
this.setBounds(500, 200, 300, 300);
//设置窗体大小固定
this.setResizable(false);
//窗口默认关闭操作
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗体的布局为 帧式布局
this.setLayout(null);
}

}

 LoginRegisterFrame_Login.java 登录页面 功能实现

 */

public class LoginRegisterFrame_Login extends LoginRegisterFrame{

//构造方法
public LoginRegisterFrame_Login(){
super();
this.setTitle("登录界面");//设置标题
leftBtn.setText("登录");//设置左边按钮名称
rightBtn.setText("注册");//设置右边按钮名称
}

//登录方法
@Override
public void leftBtnMethod() {
//获取用户名与密码
String username = usernameTF.getText();
String password = passwordTF.getText();
//调用接口中的登录功能
UserOperator uo = new UserOperatorImpl();
boolean isLogin = uo.isLogin(username, password);
System.out.println("isLogin = " + isLogin);

//显示登录提示的方法
showDialog(isLogin);
}

//显示登录提示的方法
private void showDialog(boolean isLogin) {
if (isLogin) {
//登录成功,转到 主页面
JOptionPane.showMessageDialog(this, "登录成功,跳转到主页面");

//隐藏登录页面
this.setVisible(false);
//显示主页面
IndexFrame index = new IndexFrame();
index.setVisible(true);

} else {
//登录失败,重新登录
JOptionPane.showMessageDialog(this, "登录失败,请重新登录");
}
}

//注册方法
@Override
public void rightBtnMethod() {
//打开注册页面
LoginRegisterFrame_Register register = new LoginRegisterFrame_Register();
//隐藏登录页面
this.setVisible(false);
//显示注册页面
register.setVisible(true);
}

}

* LoginRegisterFrame_Register.java 注册页面功能实现

 */

public class LoginRegisterFrame_Register extends LoginRegisterFrame {

//构造方法
public LoginRegisterFrame_Register(){
super();
this.setTitle("注册页面");
leftBtn.setText("注册");
rightBtn.setText("重置");
}

//注册功能
@Override
public void leftBtnMethod() {
//获取输入的用户名与密码
String username = usernameTF.getText();
String password = passwordTF.getText();
//提供要注册的用户 User
User user = new User(username, password);

//通过UserOperator接口,完成注册功能
UserOperator uo = new UserOperatorImpl();
boolean isRegister = uo.isRegister(user);
System.out.println("isRegister = " + isRegister);

//注册功能的消息提示功能
showDialog(isRegister);
}

//注册功能的消息提示功能
private void showDialog(boolean isRegister) {
if (isRegister) {
//注册成功, 返回到登录页面
JOptionPane.showMessageDialog(this, "恭喜你,注册成功,请登录");

//隐藏注册页面
this.setVisible(false);
//显示登录页面
LoginRegisterFrame_Login login = new LoginRegisterFrame_Login();
login.setVisible(true);
} else {
//注册失败, 重新注册
JOptionPane.showMessageDialog(this, "对不起,注册失败,请重新注册");
}

}

//重置按钮
@Override
public void rightBtnMethod() {
//用户名文本框内容清空
usernameTF.setText(null);
//密码文本框内容清空
passwordTF.setText(null);
}

}

 启动程序的类: MainApp.java

 */

public class MainApp {
public static void main(String[] args) {
LoginRegisterFrame_Login frame = new LoginRegisterFrame_Login();
frame.setVisible(true);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: