通过一段小程序练习List集合
simulationUserLogin java 控制台应用程序主要完成用户的注册和登录功能的模拟,没有实际数据库访问, 数据库使用程序中DataSource类进行模仿, 其中成员静态属性List usersTable 表示是一个数据库用户表,里面存储Users(用户) 对象; UserDao 接口定义相关业务抽象方法, 任务中主要必需编写一个处理用户注册和登录功能业务实现UserDao 接口的具体类, 此类必需实现UserDao 接口中的抽象方法,添加功能实现;
TestUserRegister 和TestUserLogin 是测试用户注册和登录的主类.
请将simulationUserLogin应用导入的Eclipse 开发工具中并修改导入可能出现的错误, 根据程序中的代码注释及此文档说明,完成注册及登录功能并测试执行
DataSource
import java.util.ArrayList;
import java.util.List;
/***
* 模拟数据库的类
* @author lenovo
*
*/
public class DataSource{
static List<Users> usersTable = new ArrayList();
}
Users
/***
* 用户实体类
* @author lenovo
*
*/
public class Users {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
UsersDao
/***
* 访问数据的组件接口
* @author lenovo
*
*/
public interface UsersDao {
public abstract void userRegister();//注册
public abstract void userLogin();//登录
}
UsersRegist_Login
import java.util.Iterator;
import java.util.Scanner;
/***
* 接口实现类
* @author lenovo
*
*/
public class UsersRegist_Login implements UsersDao{
Scanner in = new Scanner(System.in);
/**
* 用户选择登陆或注册
*/
public void select() {
System.out.println("您需要注册还是登录?请输入相应代码,注册:1,登录:0");
if(in.nextInt()==1) {
userRegister();
}else if(in.nextInt()==0){
userLogin();
}else {
System.err.print("输个1和0还得我手把手教你?");
}
}
/**
* 注册
*/
@Override
public void userRegister() {
/*
* 用户名规范判断
*/
System.out.println("请输入用户名");
int flag = 0;//设置标志量
String name;
while(true) {
name = in.next();
flag = 0;//标志量初始化
if(name.length()<6||name.length()>16) {
System.err.println("用户名必须在6-16个字符之间,请重新输入");
continue;
}else {
char []chs = name.toCharArray();
for(char ch:chs) {
if((ch<'1'||ch>'9')&&(ch<'a'||ch>'z')&&(ch<'A'||ch>'Z')&&ch!='@') {
System.err.println("用户名仅由数字,大小写字母,和@组成,请重新输入");
flag = -1;
break;
}
}
if(flag==-1)
continue;
}
break;
}
/*
* 密码规范判断
*/
System.out.println("请输入密码");
String pwd;
while(true) {
flag = 0;
pwd = in.next();
if(pwd.length()<6||pwd.length()>16) {
System.err.println("密码必须在6-16个字符之间,请重新输入");
continue;
}else {
char []chs = pwd.toCharArray();
for(char ch:chs) {
if((ch<'1'||ch>'9')&&(ch<'a'||ch>'z')&&(ch<'A'||ch>'Z')) {
System.err.println("用户名仅由数字和大小写字母组成,请重新输入");
flag = -1;
break;
}
}
if(flag==-1)
continue;
}
break;
}
/*将数据存入用户实体类 中*/
Users user = new Users();
user.setName(name);
user.setPassword(pwd);
/*将数据存入模拟数据库中*/
DataSource.usersTable.add(user);
System.out.println("注册成功!!!\n即将转至登录页面");
userLogin();
}
/**
* 登录
*/
@Override
public void userLogin() {
System.out.println("请输入用户名");
String name = in.next();
Iterator it = DataSource.usersTable.iterator();
if(!it.hasNext()) {
System.err.println("暂无用户注册,是否需要注册,是:1,否:0");
if(in.nextInt()==1) {
userRegister();
}else if(in.nextInt()==0) {
System.out.print("即将退出系统...");
}else {
System.err.print("输个1和0还得我手把手教你?");
}
}else {
while(it.hasNext()) {
Users user = (Users) it.next();
if(name.equals(user.getName())) {//判断两字符串数据是否相等用equals全等号是判断两字符串对象是否是同一个对象
System.out.println("请输入密码");
String pwd = in.next();
while(true) {
if(!pwd.equals(user.getPassword())) {
System.err.println("密码错误,请重新输入");
in.next();
}else {
break;
}
}
System.out.println("登录成功!!!");
}else {
System.err.println("该用户名未注册 ,是否注册?是:1,否:0");
if(in.nextInt()==1) {
userRegister();
}else if(in.nextInt()==0){
System.out.print("是否重新登录?是:1;否:0");
if(in.nextInt()==1)
userLogin();
else
System.out.println("即将退出系统...");
}else {
System.err.print("输个1和0还得我手把手教你?");
}
}
}
}
}
}
Test
public class Test {
public static void main(String []args) {
UsersRegist_Login url = new UsersRegist_Login();
url.select();
}
}
过程中出现的问题
- 在判断用户名和密码是否正确是误用全等号“==”,改为equals方法
- 在注册用户名和密码时为考虑到while循环内部的for循环,于是设置了标志量flag,用以对外层循环是否继续执行进行判断