- 分析功能
. - 搭建环境
- 创建一个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方法重写就可以。