关于用mvc三层设计模式来设计用户登录系统
2017-09-14 11:56
417 查看
刚学玩mvc设计模式,结合面向对象的思想以及,数组对象,包括二级菜单等于是制作一个用户登录注册系统,mvc主要分为三层,view层主要分为:主函数和菜单层。model层用来存储数据和操作数据,这是最关键的一层,它里面存储了用户的信息,以及如何处理信息,manager层作为交互层,把用户层和页面层隔开,降低了代码的耦合度,同时增强了代码的可读性
下面是代码:首先是用户层的东西
1.新建了一个Model包里面有两个类,首先是第一个Usel类用来存储用户的信息,包括用户的名字,密码,性别,和电话号码,以及相关的set和get方法
以及构造函数
package model;
public class Usel {
private String name;
private String password;
private String sex;
private String phonenumber;
public Usel() {
super();
// TODO Auto-generated constructor stub
}
public Usel(String name, String password, String sex, String phonenumber) {
super();
this.name = name;
this.password = password;
this.sex = sex;
this.phonenumber = phonenumber;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhonenumber() {
return phonenumber;
}
public void setPhonenumber(String phonenumber) {
this.phonenumber = phonenumber;
}
public void setName(String name) {
this.name = name;
}
}
1.1其次是第二次Model包里的UselModel类,关于对用户的信息操作都在这里面进行,包括增加,登录以及登录以后进入二级菜单的查询,删除等等。
package model;
import java.util.Scanner;
public class UselModel {
private Scanner sc=new Scanner(System.in);
private String name;
private String password;
private String sex;
private String phonenumber;
private int count=0;
//注册也就是功能
public Usel[] add(Usel[] use)
{
boolean b=true;
// 利用正则表达式和循环控制语句来控制用户要注册的名字,要求必须长度大于且不能有特殊字符
a:while(b)
{
while(true){
System.out.print("请输入要注册的用户名,用户名不能为特殊字符,或者长度大于6");
name=sc.next();
String regEx="[~!/@#$%^&*()-_=+\\|[{}];:\'\",<.>/?]+";
//利用String的matches方法和上面这个字符串做匹配,返回一个结果,如果是true,或者长度大于了6,则执行下面
的语句,continue要求重新输入,如果成功,break,跳出
if(name.matches(regEx)||name.length()>6)
{
System.out.println("用户名不能为特殊字符,或者长度大于6");
continue;
}
break;
}
// 进行密码注册
while(true){
String regex="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{1,}$";
System.out.print("请输入要注册的密码,密码必须为数字和字母的组合");
password=sc.next();
//进行密码与要求注册的数字和字母组合进行匹配,注意前面有一个逻辑非的叹号,如果输入的就是数字和字母
匹配的结果本身成功返回一个true加上前面的叹号就是一个false,不会执行下面的if语句,直接break出
if(!password.matches(regex))
{
System.out.println("密码必须为数字和字母的组合");
continue;
}
break;
}
//进行输入性别的判定,性别只能是男或者女
while(true){
System.out.print("请输入你的性别");
sex=sc.next();
//如果输入的是男和女就会反回一个false,不会执行这个这句话
if(!(sex.equals("男")||sex.equals("女")))
{
System.out.println("输入不正确请重新输入");
continue;
}
break;
}
//电话号码的判断
while(true){
String str="^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$";
System.out.print("请输入你的电话号码");
phonenumber=sc.next();
//如果电话号码匹配成功就不会执行下面这句话
if(!phonenumber.matches(str))
{
System.out.println("输入不正确请重新输入");
continue;
}
//前面所有的注册条件都满足了就会开始执行下面的将注册的信息添加到对象里面去
else
{
Usel usel3=new Usel(name,password,sex,phonenumber);
//首先前面给了一个初始长度的数组,如果添加的数量小于数组的容量则放在原数组即可
if(count<use.length)
{
use[count]=usel3;
count++;
//如果添加的用户超过了用户的数量
}else
{
//创建新数组将原数组的长度加3同时遍历将原数组放入新数组
Usel[] newusel=new Usel[use.length+3];
for(int i=0;i<use.length;i++)
{
newusel[i]=use[i];
}
//同时将新数组的地址传递给原数组
use=newusel;
//在将相对原数组超出的对象放入数组中
use[count]=usel3;
count++;
}
System.out.println("注册成功");
break;
}
}
break a;
}
//给一个返回值数组主要是自己存的对象返回回去
return use;
}
//查看功能遍历就可以
public void show(Usel[] arr)
{
for(int i=0;i<arr.length;i++)
{
//注意由于定义的数组的长度本身为3,却只放了一个,所以可以出现空指针的情况,给一个判断语句就好
if(arr[i]!=null){
System.out.println(arr[i].getName()+";"+
arr[i].getPassword()+";"+arr[i].getSex()+";"+arr[i].getPhonenumber());
}
}
}
//登录,登录主要是用户名和密码都要同时匹配,
public boolean login(Usel[] arr)
{
a:while(true)
{
System.out.print("请输入用户名");
String name4=sc.next();
System.out.print("请输入密码");
String password1=sc.next();
for(int i=0;i<arr.length;i++)
{
if(arr[i]!=null){
//输入一个名字和密码和注册的进行匹配
if((arr[i].getName().equals(name4)&&arr[i].getPassword().equals(password1)))
{
System.out.println("登录成功");
break a;
}
}
}
//如果匹配没有成功就继续输入
continue;
}
//结果肯定输入成功了然后返回个true值,这个值为后面的登录成功进入二级菜单做好了准备
return true;
}
//进入二级菜单进行用户的名字修改,密码,以及电话修改
public Usel[] xiugai(Usel[] arr)
{
System.out.println("请输入要修改的用户名字");
String name5=sc.next();
for(int i=0;i<arr.length;i++)
{
if(arr[i] !=null){
if(name5.equals(arr[i].getName()))
{
System.out.println("请输入要修改的名字");
String name1=sc.next();
arr[i].setName(name1);
System.out.println("请输入要修改的密码");
String password=sc.next();
arr[i].setPassword(password);
System.out.println("请输入要修改的电话号码");
String phone=sc.next();
arr[i].setPhonenumber(phone);
}
}
}
return arr;
}
//这里主要是设计了一个管理员,只有管理员才能进行这项操作,对人的删除,想法就是
对管理设计了一个特殊的用户名和密码输入成功就会进入这个这个页面,这个东西在之前就已经添加好了
public Usel[] mana(Usel[] arr)
{
//创建一个新数组,由于要删除,长度减1即可
Usel[] newuse=new Usel[arr.length-1];
System.out.println("请输入名字");
for(int i=0;i<arr.length;i++)
{
if(arr[i] !=null)
{
//首先是找到这个管理员
if(sc.next().equals("admin"))
{
System.out.println("请输入要删除的用户名");
String name6=sc.next();
int index=0;
for(int i1=0;i1<arr.length;i1++)
{
if(arr[i1] !=null){
//找到这个要删除的用户名,根据名字要查找
if(name6.equals(arr[i1].getName()))
{
//这是它的角标
index=i1;
}
}
}
// 将旧的东西放进新数组,除了这个找到的index
for(int j=0;j<arr.length;j++)
{
if(j<index)
{
newuse[j]=arr[j];
}
if(j>index)
{
newuse[j-1]=arr[j];
}
}
}
}
}
//返回新数组
return newuse;
}
}
上面即是模型层所有的东西,可以看到关于用户的基本信息的定义以及操作都在这个层里面进行都在model包里面
接着是用于和用户的交互主要就是菜单和显示的这个层view层这个层的东西相对少很多
2.1 新建一个view包里面建立一个MainView类这个是主菜单主要是进行了new 了一个对象,然后调用了onemenu();
package View;
public class MainView {
public static void main(String[] args)
{
Menu menu=new Menu();
menu.onemenu();
}
}
2.2在view包里面在新建一个类,主要用于放置一级和二级菜单
package View;
import java.util.Scanner;
import Contorller.Manager;
public class Menu {
private Scanner sc=new Scanner(System.in);
//这里和controller层进行联系时只需创建一个该层的对象
private Manager manager=new Manager();
//一级菜单
public void onemenu()
{
boolean b=true;
while(b)
{
System.out.println("欢迎使用用户查询系统");
System.out.println("1.注册2.登录3.退出");
switch(sc.nextInt())
{
case 1:
//注册
manager.regesit();
break;
case 2:
//登录。如果成功,进入二级菜单
boolean c=manager.login();
if(c)
{
twomenu();
}else
{
System.out.println("登录失败!确定你的用户名密码是否输入正确!");
}
break;
case 3:
break;
default:
System.out.println("输入错误,请重新输入");
break;
}
}
}
//二级菜单
public void twomenu()
{
boolean d=true;
while(d)
{
System.out.print("1.查看用户2.修改3.删除用户4.返回上级菜单");
switch (sc.nextInt()) {
case 1:
//查看用户
manager.Lookusel();
break;
case 2:
//修改
manager.gai();
break;
case 3:
//删除
manager.mana();
break;
case 4:
break;
default:
break;
}
}
}
}
上面就是view界面层的所有东西,现在model层和view层都已经写完了,如何把这两个层面联系起来还需要一个contronller层,这是一个管理层
3.1首先创建一个Contronller包,在新建一个manager类
ackage Contorller;
import model.Usel;
import model.UselModel;
public class Manager
{
//创建了Usemodel类的对象
private UselModel model=new UselModel();
//创建了Usel数组用来存用户,下面就是一个一个调用UseModel中的功能,在将这些功能传递给view层中,这样该改动一处就不需要改动多处
private Usel[] usel=new Usel[3];
public void regesit()
{
usel=model.add(usel);
}
public boolean login()
{
return model.login(usel);
}
public void Lookusel()
{
model.show(usel);
}
public void gai()
{
usel=model.xiugai(usel);
}
public void mana()
{
usel=model.mana(usel);
}
}
当然在创建对象的层面里面还应该在set里面添加正则判断表达,这是以后修改用户的名字时也应该输入符合要求的名字,这里就没有做了
下面是代码:首先是用户层的东西
1.新建了一个Model包里面有两个类,首先是第一个Usel类用来存储用户的信息,包括用户的名字,密码,性别,和电话号码,以及相关的set和get方法
以及构造函数
package model;
public class Usel {
private String name;
private String password;
private String sex;
private String phonenumber;
public Usel() {
super();
// TODO Auto-generated constructor stub
}
public Usel(String name, String password, String sex, String phonenumber) {
super();
this.name = name;
this.password = password;
this.sex = sex;
this.phonenumber = phonenumber;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhonenumber() {
return phonenumber;
}
public void setPhonenumber(String phonenumber) {
this.phonenumber = phonenumber;
}
public void setName(String name) {
this.name = name;
}
}
1.1其次是第二次Model包里的UselModel类,关于对用户的信息操作都在这里面进行,包括增加,登录以及登录以后进入二级菜单的查询,删除等等。
package model;
import java.util.Scanner;
public class UselModel {
private Scanner sc=new Scanner(System.in);
private String name;
private String password;
private String sex;
private String phonenumber;
private int count=0;
//注册也就是功能
public Usel[] add(Usel[] use)
{
boolean b=true;
// 利用正则表达式和循环控制语句来控制用户要注册的名字,要求必须长度大于且不能有特殊字符
a:while(b)
{
while(true){
System.out.print("请输入要注册的用户名,用户名不能为特殊字符,或者长度大于6");
name=sc.next();
String regEx="[~!/@#$%^&*()-_=+\\|[{}];:\'\",<.>/?]+";
//利用String的matches方法和上面这个字符串做匹配,返回一个结果,如果是true,或者长度大于了6,则执行下面
的语句,continue要求重新输入,如果成功,break,跳出
if(name.matches(regEx)||name.length()>6)
{
System.out.println("用户名不能为特殊字符,或者长度大于6");
continue;
}
break;
}
// 进行密码注册
while(true){
String regex="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{1,}$";
System.out.print("请输入要注册的密码,密码必须为数字和字母的组合");
password=sc.next();
//进行密码与要求注册的数字和字母组合进行匹配,注意前面有一个逻辑非的叹号,如果输入的就是数字和字母
匹配的结果本身成功返回一个true加上前面的叹号就是一个false,不会执行下面的if语句,直接break出
if(!password.matches(regex))
{
System.out.println("密码必须为数字和字母的组合");
continue;
}
break;
}
//进行输入性别的判定,性别只能是男或者女
while(true){
System.out.print("请输入你的性别");
sex=sc.next();
//如果输入的是男和女就会反回一个false,不会执行这个这句话
if(!(sex.equals("男")||sex.equals("女")))
{
System.out.println("输入不正确请重新输入");
continue;
}
break;
}
//电话号码的判断
while(true){
String str="^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$";
System.out.print("请输入你的电话号码");
phonenumber=sc.next();
//如果电话号码匹配成功就不会执行下面这句话
if(!phonenumber.matches(str))
{
System.out.println("输入不正确请重新输入");
continue;
}
//前面所有的注册条件都满足了就会开始执行下面的将注册的信息添加到对象里面去
else
{
Usel usel3=new Usel(name,password,sex,phonenumber);
//首先前面给了一个初始长度的数组,如果添加的数量小于数组的容量则放在原数组即可
if(count<use.length)
{
use[count]=usel3;
count++;
//如果添加的用户超过了用户的数量
}else
{
//创建新数组将原数组的长度加3同时遍历将原数组放入新数组
Usel[] newusel=new Usel[use.length+3];
for(int i=0;i<use.length;i++)
{
newusel[i]=use[i];
}
//同时将新数组的地址传递给原数组
use=newusel;
//在将相对原数组超出的对象放入数组中
use[count]=usel3;
count++;
}
System.out.println("注册成功");
break;
}
}
break a;
}
//给一个返回值数组主要是自己存的对象返回回去
return use;
}
//查看功能遍历就可以
public void show(Usel[] arr)
{
for(int i=0;i<arr.length;i++)
{
//注意由于定义的数组的长度本身为3,却只放了一个,所以可以出现空指针的情况,给一个判断语句就好
if(arr[i]!=null){
System.out.println(arr[i].getName()+";"+
arr[i].getPassword()+";"+arr[i].getSex()+";"+arr[i].getPhonenumber());
}
}
}
//登录,登录主要是用户名和密码都要同时匹配,
public boolean login(Usel[] arr)
{
a:while(true)
{
System.out.print("请输入用户名");
String name4=sc.next();
System.out.print("请输入密码");
String password1=sc.next();
for(int i=0;i<arr.length;i++)
{
if(arr[i]!=null){
//输入一个名字和密码和注册的进行匹配
if((arr[i].getName().equals(name4)&&arr[i].getPassword().equals(password1)))
{
System.out.println("登录成功");
break a;
}
}
}
//如果匹配没有成功就继续输入
continue;
}
//结果肯定输入成功了然后返回个true值,这个值为后面的登录成功进入二级菜单做好了准备
return true;
}
//进入二级菜单进行用户的名字修改,密码,以及电话修改
public Usel[] xiugai(Usel[] arr)
{
System.out.println("请输入要修改的用户名字");
String name5=sc.next();
for(int i=0;i<arr.length;i++)
{
if(arr[i] !=null){
if(name5.equals(arr[i].getName()))
{
System.out.println("请输入要修改的名字");
String name1=sc.next();
arr[i].setName(name1);
System.out.println("请输入要修改的密码");
String password=sc.next();
arr[i].setPassword(password);
System.out.println("请输入要修改的电话号码");
String phone=sc.next();
arr[i].setPhonenumber(phone);
}
}
}
return arr;
}
//这里主要是设计了一个管理员,只有管理员才能进行这项操作,对人的删除,想法就是
对管理设计了一个特殊的用户名和密码输入成功就会进入这个这个页面,这个东西在之前就已经添加好了
public Usel[] mana(Usel[] arr)
{
//创建一个新数组,由于要删除,长度减1即可
Usel[] newuse=new Usel[arr.length-1];
System.out.println("请输入名字");
for(int i=0;i<arr.length;i++)
{
if(arr[i] !=null)
{
//首先是找到这个管理员
if(sc.next().equals("admin"))
{
System.out.println("请输入要删除的用户名");
String name6=sc.next();
int index=0;
for(int i1=0;i1<arr.length;i1++)
{
if(arr[i1] !=null){
//找到这个要删除的用户名,根据名字要查找
if(name6.equals(arr[i1].getName()))
{
//这是它的角标
index=i1;
}
}
}
// 将旧的东西放进新数组,除了这个找到的index
for(int j=0;j<arr.length;j++)
{
if(j<index)
{
newuse[j]=arr[j];
}
if(j>index)
{
newuse[j-1]=arr[j];
}
}
}
}
}
//返回新数组
return newuse;
}
}
上面即是模型层所有的东西,可以看到关于用户的基本信息的定义以及操作都在这个层里面进行都在model包里面
接着是用于和用户的交互主要就是菜单和显示的这个层view层这个层的东西相对少很多
2.1 新建一个view包里面建立一个MainView类这个是主菜单主要是进行了new 了一个对象,然后调用了onemenu();
package View;
public class MainView {
public static void main(String[] args)
{
Menu menu=new Menu();
menu.onemenu();
}
}
2.2在view包里面在新建一个类,主要用于放置一级和二级菜单
package View;
import java.util.Scanner;
import Contorller.Manager;
public class Menu {
private Scanner sc=new Scanner(System.in);
//这里和controller层进行联系时只需创建一个该层的对象
private Manager manager=new Manager();
//一级菜单
public void onemenu()
{
boolean b=true;
while(b)
{
System.out.println("欢迎使用用户查询系统");
System.out.println("1.注册2.登录3.退出");
switch(sc.nextInt())
{
case 1:
//注册
manager.regesit();
break;
case 2:
//登录。如果成功,进入二级菜单
boolean c=manager.login();
if(c)
{
twomenu();
}else
{
System.out.println("登录失败!确定你的用户名密码是否输入正确!");
}
break;
case 3:
break;
default:
System.out.println("输入错误,请重新输入");
break;
}
}
}
//二级菜单
public void twomenu()
{
boolean d=true;
while(d)
{
System.out.print("1.查看用户2.修改3.删除用户4.返回上级菜单");
switch (sc.nextInt()) {
case 1:
//查看用户
manager.Lookusel();
break;
case 2:
//修改
manager.gai();
break;
case 3:
//删除
manager.mana();
break;
case 4:
break;
default:
break;
}
}
}
}
上面就是view界面层的所有东西,现在model层和view层都已经写完了,如何把这两个层面联系起来还需要一个contronller层,这是一个管理层
3.1首先创建一个Contronller包,在新建一个manager类
ackage Contorller;
import model.Usel;
import model.UselModel;
public class Manager
{
//创建了Usemodel类的对象
private UselModel model=new UselModel();
//创建了Usel数组用来存用户,下面就是一个一个调用UseModel中的功能,在将这些功能传递给view层中,这样该改动一处就不需要改动多处
private Usel[] usel=new Usel[3];
public void regesit()
{
usel=model.add(usel);
}
public boolean login()
{
return model.login(usel);
}
public void Lookusel()
{
model.show(usel);
}
public void gai()
{
usel=model.xiugai(usel);
}
public void mana()
{
usel=model.mana(usel);
}
}
当然在创建对象的层面里面还应该在set里面添加正则判断表达,这是以后修改用户的名字时也应该输入符合要求的名字,这里就没有做了
相关文章推荐
- 系统设计 - 关于用户体验与安全性之间的折衷
- 【数据库设计-2】权限设计-系统登录用户权限设计
- dao设计用户登录系统 总结 strus2+hibernate(1)
- 关于一个普通的系统中用户注销后以其他用户登录的实现
- 设计一个可扩展的用户登录系统 (1)
- JSP系统开发学习之四关于用户登录界面的补充——通过request页面传值&wel.jsp的MVC的实现
- 转载:如何设计一个可扩展的用户登录系统
- 设计一个可扩展的用户登录系统 (2)
- 在iOS系统上设计用户登录(原创技巧)
- 设计一个可扩展的用户登录系统
- 设计一个可扩展的用户登录系统 (3)
- 单用户登录系统的设计与实现方案
- 设计一个可扩展的用户登录系统
- 设计一个(安全、通用、灵活、可扩展)的用户登录系统
- 杂感-关于登录系统中用户不能重复登录的问题
- 权限设计-系统登录用户权限设计
- 设计一个可扩展的用户登录系统
- 网站用户登录系统设计——jsGen实现版
- centos禁止root用户登录系统
- 关于Eclipse链接SQLServer2008时运行java出现的用户 ‘sa’ 登录失败问题!