Java入门:注册模块的实现
1.主活动图
用户选择注册选项,进入注册界面,开始输入注册信息,到最后完成注册。具体的活动图如下:
以上活动图中,矩形框里的操作不是在一个类里面实现的,而是通过Form类和UserService类来实现,Form类负责用户交互,UserService负责处理用户数据。
2.修改UserService类
2.1 UserService类总体分析
UserService负责用户数据的存取,需要根据所要实现的功能来重新设计UserService的成员变量和成员方法。(注意,我们在最初学习理解类的时候,是按照“类是对某类具体事物的抽象形成类”来理解的,也就是说类是描述一类具有相同属性和操作的事物。现在我们这里定义的UserService类并不能按这个思路去理解。UserService是一个抽象的类,并没有跟具体的事物相关联。所以,初学者要了解,类不仅仅是描述学生、动物、大楼、教师这样具体的事物,也可以是一些抽象操作的封装。也就说,将一些具有相关性的操作或属性封装在一起形成一个类,用来完成某一个特定的任务。UserService就是这样的类,我们将与用户相关的操作和属性特征封装在一起,形成UserService类。)
UserService类是给其它模块使用的,对其它代码模块来说,UserService需要提供的功能如下类图所示:
以上类图中,前面带+号的表示是UserService应该提供给其它模块使用的功能(即方法)。
String fileName:用来存储用户数据的文件名称。此文件保存在硬盘上,存储所有用户的数据。类图中前面的-号表示这个成员变量是私有的,不必让其它代码模块访问。
public boolean modifyInfo(User user):修改用户信息。修改成功返回true,用户不存在或存储用户信息的文件有错误时会导致修改失败,修改失败返回false。参数是一个User类的对象(User类定义见第3条)。
public boolean login(String name,String pwd):验证用户登录信息。用户名密码正确返回true,否则返回false。参数只需要用户名、密码即可,所以不需要将参数定义为User对象。
public boolean isExist(String name):验证某个用户名是否已经存在。存在,返回true,否则返回false。
public boolean register(User user):注册用户。返回值true表示注册成功,false表示注册失败。参数是User对象,即需要传入一个User对象才可以注册。注册成功,用户数据会保存到文件里。
了解了UserService类应该具有的核心成员方法和成员变量之后,我们还需要理清实现UserService的逻辑。要搞清一个类的实现逻辑,我们可以从这个类对象的使用角度去分析。
我们使用UserService类时,先是要实例化一个对象,在实例化对象时会调用构造方法。那么,应该在构造方法里写些什么内容呢?一旦实例化好一个UserService对象,我们希望这个对象拥有所有用户的信息,以便在后续代码中可以使用直接这些用户对象。所以,我们就可以在构造函数中去将0文本文件user.txt中描述的用户数据导入进内存,变成内存对象,这样我们后面的代码才可以用到这些User对象。这就是下面UserService.java代码中第13行到第24行的语句所做的事情。在这里,需要搞清楚两点:
1)从文件中读出来的是字符串数据,每行代表一个User对象,需要根据这个字符串所描述的用户信息,创建一个对应的User对象。这个过程在下面的代码中,对应的是toObject(String userStr)方法。
2)将文件中描述的用户转换成对象后,这些对象应该放到哪里去?我们把它放在了一个ArrayList对象users中了,后面注册也好,判断用户名密码也好,都可以直接使用这个链表对象,因为所有用户信息都在它里面放着了,没必要再去读文件了。这个链表对象是一个数组链表对象,这个数组链表可以存放很多元素,属于一个集合类型的对象。有关ArrayList类的用法,请参考Java入门系列:实例讲解ArrayList用法。下面的代码对应的是第18行语句。
UserService.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList; public class UserService {
String fileName = "user.txt";
ArrayList<User> users; public UserService(){
users = new ArrayList<User>(); String line;
try{
BufferedReader br = new BufferedReader(new FileReader(fileName));
line = br.readLine();
while(line != null){
users.add(toObject(line));
line = br.readLine(); }
}catch(IOException e){
e.printStackTrace();
}
} /**
* 验证用户名密码是否正确
* @param n
* @param pwd
* @return true:用户名密码正确,否则返回false。
*/
public boolean login(String n,String pwd){
for(User u : users){
if(u.name.equals(n) && u.password.equals(pwd)){
return true;
}else{
return false;
}
}
return false; // if(n.equals("Mike") && pwd.equals("123")){//String类的equals方法,不是使用 ==
// return true;
// }else{
// return false;
// }
}
/**
* 修改用户密码
* @param name:需要修改密码的用户名称
* @param newPwd:新密码
* @return
*/
public boolean modifyPwd(String name,String newPwd){
return true;
} /**
* 注册用户,将用户保存到文件中,同时更新users数组链表
* @param user
* @return
*/
public boolean register(User user){
return false;
}
/**
* 讲一个包含用户信息的字符串转换为一个User对象
* @param userStr
* @return
*/
private User toObject(String userStr){
String[] temp = userStr.split(" ");//split(“ ”)方法是将userStr字符串按空格进行拆分成几
//个部分,这几个部分组成一个String[],
return new User(temp[0],temp[1],temp[2]);
} }
2.2 register(User user)方法分析
这里拿其中一个方法boolean register(User user)来分析一下。
此方法的功能是:注册一个用户,也就是把这个用户信息写到user.txt文件中去。
方法声明语句:boolean register(User user){}。参数user:传递给register方法的用户对象
方法体的活动图:
1)将传递的user添加到users集合中:
users.add(user);
上面一条语句即可将传进来的user对象添加到users数组链表集合中。
2)将users集合写入到user.txt文件中
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(fileName)); for (User u : users) {
bw.write(u.name + " " + u.password + " " + u.email);
bw.newLine();
}
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
有关Java文件操作,请参考http://www.cnblogs.com/bayes/p/5478862.html
3.添加User类
User类是描述用户信息的类,代码如下:
User.java
public class User {
String name;
String password;
String email; public User(String name, String pwd, String email) {
this.name = name;
this.password = pwd;
this.email = email;
}
}
4.添加RegexUtils类
RegexUtils类专门用来完成用户密码、email合法性的判断。代码如下:
RegexUtils.java
import java.util.regex.Pattern; public class RegexUtils {
/**
* 验证Email
* @param email email地址,格式:zhangsan@sina.com,zhangsan@xxx.com.cn,xxx代表邮件服务商
* @return 验证成功返回true,验证失败返回false
*/
public static boolean checkEmail(String email) {
String regex = "\\w+@\\w+\\.[a-z]+(\\.[a-z]+)?";
return Pattern.matches(regex, email);
} /**
* 验证身份证号码
* @param idCard 居民身份证号码15位或18位,最后一位可能是数字或字母
* @return 验证成功返回true,验证失败返回false
*/
public static boolean checkIdCard(String idCard) {
String regex = "[1-9]\\d{13,16}[a-zA-Z0-9]{1}";
return Pattern.matches(regex,idCard);
} /**
* 验证手机号码(支持国际格式,+86135xxxx...(中国内地),+00852137xxxx...(中国香港))
* @param mobile 移动、联通、电信运营商的号码段
*<p>移动的号段:134(0-8)、135、136、137、138、139、147(预计用于TD上网卡)
*、150、151、152、157(TD专用)、158、159、187(未启用)、188(TD专用)</p>
*<p>联通的号段:130、131、132、155、156(世界风专用)、185(未启用)、186(3g)</p>
*<p>电信的号段:133、153、180(未启用)、189</p>
* @return 验证成功返回true,验证失败返回false
*/
public static boolean checkMobile(String mobile) {
String regex = "(\\+\\d+)?1[3458]\\d{9}$";
return Pattern.matches(regex,mobile);
} /**
* 验证固定电话号码
* @param phone 电话号码,格式:国家(地区)电话代码 + 区号(城市代码) + 电话号码,如:+8602085588447
* <p><b>国家(地区) 代码 :</b>标识电话号码的国家(地区)的标准国家(地区)代码。它包含从 0 到 9 的一位或多位数字,
* 数字之后是空格分隔的国家(地区)代码。</p>
* <p><b>区号(城市代码):</b>这可能包含一个或多个从 0 到 9 的数字,地区或城市代码放在圆括号——
* 对不使用地区或城市代码的国家(地区),则省略该组件。</p>
* <p><b>电话号码:</b>这包含从 0 到 9 的一个或多个数字 </p>
* @return 验证成功返回true,验证失败返回false
*/
public static boolean checkPhone(String phone) {
String regex = "(\\+\\d+)?(\\d{3,4}\\-?)?\\d{7,8}$";
return Pattern.matches(regex, phone);
} /**
* 验证整数(正整数和负整数)
* @param digit 一位或多位0-9之间的整数
* @return 验证成功返回true,验证失败返回false
*/
public static boolean checkDigit(String digit) {
String regex = "\\-?[1-9]\\d+";
return Pattern.matches(regex,digit);
} /**
* 验证整数和浮点数(正负整数和正负浮点数)
* @param decimals 一位或多位0-9之间的浮点数,如:1.23,233.30
* @return 验证成功返回true,验证失败返回false
*/
public static boolean checkDecimals(String decimals) {
String regex = "\\-?[1-9]\\d+(\\.\\d+)?";
return Pattern.matches(regex,decimals);
} /**
* 验证空白字符
* @param blankSpace 空白字符,包括:空格、\t、\n、\r、\f、\x0B
* @return 验证成功返回true,验证失败返回false
*/
public static boolean checkBlankSpace(String blankSpace) {
String regex = "\\s+";
return Pattern.matches(regex,blankSpace);
} /**
* 验证中文
* @param chinese 中文字符
* @return 验证成功返回true,验证失败返回false
*/
public static boolean checkChinese(String chinese) {
String regex = "^[\u4E00-\u9FA5]+$";
return Pattern.matches(regex,chinese);
} /**
* 验证日期(年月日)
* @param birthday 日期,格式:1992-09-03,或1992.09.03
* @return 验证成功返回true,验证失败返回false
*/
public static boolean checkBirthday(String birthday) {
String regex = "[1-9]{4}([-./])\\d{1,2}\\1\\d{1,2}";
return Pattern.matches(regex,birthday);
} /**
* 验证URL地址
* @param url 格式:http://blog.csdn.net:80/xyang81/article/details/7705960? 或 http://www.csdn.net:80
* @return 验证成功返回true,验证失败返回false
*/
public static boolean checkURL(String url) {
String regex = "(https?://(w{3}\\.)?)?\\w+\\.\\w+(\\.[a-zA-Z]+)*(:\\d{1,5})?(/\\w*)*(\\??(.+=.*)?(&.+=.*)?)?";
return Pattern.matches(regex, url);
} /**
* 匹配中国邮政编码
* @param postcode 邮政编码
* @return 验证成功返回true,验证失败返回false
*/
public static boolean checkPostcode(String postcode) {
String regex = "[1-9]\\d{5}";
return Pattern.matches(regex, postcode);
} /**
* 匹配IP地址(简单匹配,格式,如:192.168.1.1,127.0.0.1,没有匹配IP段的大小)
* @param ipAddress IPv4标准地址
* @return 验证成功返回true,验证失败返回false
*/
public static boolean checkIpAddress(String ipAddress) {
String regex = "[1-9](\\d{1,2})?\\.(0|([1-9](\\d{1,2})?))\\.(0|([1-9](\\d{1,2})?))\\.(0|([1-9](\\d{1,2})?))";
return Pattern.matches(regex, ipAddress);
}
}
Java入门:注册模块的实现的更多相关文章
- Java入门:用户登录与注册模块1(实践项目)——分析
任务描述:用户登录与注册是大多数软件都拥有的一个模块.请编写一个控制台程序,实现用户的登录与注册功能,并且用户能够修改自己信息. [需求分析]由于本程序是一个演示程序,用户的信息我们做简化处理,仅包括 ...
- Java入门——初识Java
Java入门——初识Java 摘要:本文主要对Java这门编程语言进行简单的介绍. Java简介 说明 Java语言历时十多年,已发展成为人类计算机史上影响深远的编程语言,从某种程度上来看,它甚至超出 ...
- Java入门(二)——果然断更的都是要受惩罚的。。。
断更了一个多月,阅读量立马从100+跌落至10-,虽说不是很看重这个,毕竟只是当这个是自己的学习笔记,但有人看,有人评论,有人认同和批评的感觉还是很巴适的,尤其以前有过却又被剥夺的,惨兮兮的. 好好写 ...
- Android初涉及之Android Studio&JAVA入门--二月不能不写东西
是的,我还没有放弃写博客. 是的,我也没有放弃PHP的学习. 是的,我要开始学学最TM火的Android开发了. 你呢 1.Android Studio 一.概况 安装和配置什么的就不具体说了,网上一 ...
- Java入门-浅析Java学习从入门到精通【转】
一. JDK (Java Development Kit) JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库 ...
- Java开发知识之Java入门
Java开发知识之Java入门 一丶了解JAVA的版本 JAVA 有三个版本 JAVA SE: 标准版,开发桌面跟商务应用程序 JAVA SE 包括了Java的核心类库,集合,IO 数据库连接 以及网 ...
- Flask12 数据库连接、创建数据库用户、注册模块
1 连接数据库 1.1 安装 flask-sqlalchemy flask-sqlalchemy 会让 sqlalchemy 使用起来更加方便 pip3 install flask-sqlalchem ...
- Java入门到实践系列(2)——Java环境搭建
一.上集回顾 在<Java入门到实践系列(1)--Java简介>中提到过,Java程序是运行在Java虚拟机的,也展示过下面这张图. JDK:Java程序开发工具包. JRE:Java运行 ...
- 测试人员学Java入门指南
目标读者 本指南特别适合有Python基础的同学学习Java入门,对于没有任何编程经验的同学可能会存在困难. 为什么测试人员要学Java 选择Java,应该不错.TesterHome测试论坛知名大佬基 ...
随机推荐
- D.王者荣耀交流协会——PSP Daily(测评人:贾男男)
D.王者荣耀交流协会——PSP Daily(测评人:贾男男) 一.基于NABCD评论作品,及改进建议 每个小组评论其他小组beta发布的作品.1.根据(不限于)NABCD评论作品的选题;2.评论作品对 ...
- MathExam6317
自己取一个大气又可爱的标题 小学二年级的还没来得及写,大部分时间还是花在巩固和查阅新旧知识上了,通过看学习视频,查资料,看博客园的博客...下次完善好了交上. 一.预估与实际 PSP2.1 Perso ...
- 《大象Think in UML》阅读笔记之二
Think in UML阅读笔记(二) 上一次读到面向对象和面向过程的区别和各自的优势,结合实例分析了面向过程在面对大数据的时候,已经不足以满足人们的需求,所以引入了面向对象,面向对象的方法把世界看做 ...
- DPDK L3fwd 源码阅读
代码部分 整个L3fwd有三千多行代码,但总体思想就是在L2fwd的基础上,增加网络层的根据 IP 地址进行路由查找的内容. main.c 文件 int main(int argc, char **a ...
- JS学习:JavaScript的核心
分享到 分类 JS学习 发布 ourjs 2013-12-02 注意 转载须保留原文链接,译文链接,作者译者等信息. 作者: JeremyWei 原文: JavaScript The ...
- 信安实践——CSRF攻击与防御
1.实验原理 CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的 ...
- Express搭建NodeJS项目
1.安装Node.js: 2.安装npm; 3.安装Express; 在本例中默认全局安装express 安装express生成器 如果没有安装express-generator或安装路径不对,会报以 ...
- RecyclerView 上拉加载下拉刷新
RecyclerView 上拉加载下拉刷新 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/teach_s ...
- js数组遍历 千万不要使用for...in...
昨天做个下拉框 扩充了一下数组的方法 Array.prototype.remove = function (val) { var index = this.indexOf(val); if (inde ...
- 最近JavaScript的一些收获
开发习惯的上的收获 1,开发过程中,要让整个逻辑展示在一个函数中,中间部分则做可以考虑公用策略优化 2,开发完成至少有三个角度进行测试,正面方面和中立 开发技巧上面的收获 1,驼峰转为‘-’以及‘-’ ...