您的位置:首页 > 其它

用户登录注册案例

2015-05-07 02:04 274 查看
分析功能

.


搭建环境

创建一个java Project

把包结构创建出来

a) Cn.itcast.view

b) Cn.itcast.entity

c) Cn.itcast.dao

dao date access object

创建类

User类

UserDao类

User界面类



package cn.itcast.entiry;

//创建用户类
public class User {

private String name;
private String sex;
private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

}


package cn.itcast.view;

import java.util.Scanner;

import cn.itcast.dao.UserDao;
import cn.itcast.entiry.User;

//用户操作界面类
public class UserFrame {
Scanner sc = new Scanner(System.in);
UserDao dao = new UserDao();

// 1.创建一个初始化页面的方法
public void initFrame() {
while (true) {
System.out.println("请选择你要做的操作:\n 0:注册 \n 1:登录\n 2:退出");
int type = sc.nextInt();
switch (type) {
case 0:
registFrame();
break;
case 1:
loginFrame();
break;
case 2:
exit();
break;
default:
System.out.println("谢谢光临.");
}
}
}

// 这是选择退出时要执行的方法
public void exit() {
System.out.println("谢谢你的访问");
System.exit(0); // jvm停止
}

// 这是选择注册操作时要执行的内容
public void registFrame() {
System.out.println("请输入你的姓名");
String name = sc.next();
System.out.println("请输入你的性别");
String sex = sc.next();
System.out.println("请输入你的年龄");
int age = sc.nextInt();
// 将数据封装到User对象中。
User user = new User();
user.setName(name);
user.setSex(sex);
user.setAge(age);

// 需要调用UserDao中的regist方法
// UserDao dao = new UserDao();
dao.regist(user);

// dao.regist(name,sex,age);
System.out.println("注册成功");
}

// 这是选择登录操作时要执行的内容:
public void loginFrame() {
System.out.println("请输入你的姓名");
String name = sc.next();

// 需要调用UserDao中的login方法
// UserDao dao = new UserDao();

// boolean flag = dao.login(name);

User user = new User();
user.setName(name);
boolean flag = dao.login(user);
if (flag) {
System.out.println("登录成功");
} else {
System.out.println("登录失败");
}
}
}


package cn.itcast.dao;

import java.util.ArrayList;
import java.util.List;

import cn.itcast.entiry.User;

public class UserDao {
private  List<User> users = new ArrayList<User>(); // 它就是一個用于存儲用户信息的数据库。

// 注册操作
public void regist(User user) {
// System.out.println("用户注册操作");

users.add(user); //将用户存储到集合中.
}

// 登录操作
public boolean login(String name) {
//      System.out.println("用户的登录操作");

for(User user:users){ //遍历集合
if(user.getName().equals(name)){//集合中每一个User对象的名字与传递过来要登录用户的名称一样
return true;
}
}
return false;
}

public boolean login(User user) {
return users.contains(user);
}
}


功能实现

1. 注册功能

先访问的是UserFrame类中的initFrame方法,在提示中我们选择0就要进行注册操作。

会调用UserFrame类中的registFrame方法,这个方法中会提示,让我们输入name sex age信息。

调用UserDao中的regist方法进行注册操作。

a) 问题:注册的数据怎样传递到regist方法中

需要我们在得到数据后,将数据封装到User对象

将封装后的User对象传递到regist方法中,在regist方法中完成注册操作(将user对象存储到集合中)

2. 登录功能

当程序 运行时先访问的是UserFrame类中的initFrame方法,当我们根据提示输入1,代表要进行登录操作。这时会调用loginFrame方法,要求我们输入用户名。

当访问loginFrame方法时,我们输入了name值,这时就会调用UserDao中的login方法,完成登录操作。

a) 问题:需要将输入的用户名传递到login方法中才可以进行判断是否能登录。

b) 问题:在login方法中怎样完成登录操作哪?

遍历集合,将集合中所有的用户取出,判断用户的name属性与我们传递的name值是否一样,如果一样,就说明这个用户存在,可以登录,如果不一样,说明,用户不存在,登录失败。

我们让login方法的返回值为boolean类型,通过返回值来判断是否登录成功。

对代码进行改进及优化

问题:现在的代码,注册或登录操作执行完成后,程序就结束了,内存中存储的信息也就消失了。

//就是做了一个死循环,让程序没有选择”退出”永远执行

while (true) {
System.out.println("请选择你要做的操作:\n 0:注册 \n 1:登录\n 2:退出");
int type = sc.nextInt();
switch (type) {
case 0:
registFrame();
break;
case 1:
loginFrame();
break;
case 2:
exit();
break;
default:
System.out.println("谢谢光临.");
}
}


问题:我们现在将用户的信息注册成功后,登录时也是失败的?

原因 :因为我们在UserDao中声明的的private List users它是成员变量,那么代表的就是只要是UserDao的对象中就有自己的users.而我们在loginFrame,registFrame中每一次都是重新new UserDao();

解决方案:

1. 将UserDao中的集合声明成static

2. 在UserFrame中声明一个UserDao对象,在所有方法中使用同一个对象就可以。

优化:

在loginFrame中我们调用UserDao 中的login方法进行登录操作。

1. 我们在传递时,不传递String 类型的name属性,而是传递一个User对象。

2. 在UserDao中将login方法改进

public boolean login(User user) {

return users.contains(user);

}

现在这个操作是有问题的,我们知道contains方法是判断集合中是否包含指定的对象,是根据equals方法比较。我们只需要将user类中的equals方法重写就可以。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: