联系人管理系统
请使用XML保存数据,完成一个联系人管理系统。
- 用户必须经过认证登录后方可以使用系统。
- 用户必须经过认证登录后方可以使用系统。
- 分模块进行设计。
- 两层框架-用户交互层,Dao层。
- 其他支持层-数据封装层。
- 工具类-加密,工厂Bean。
说明:
因为仅仅是做一个小项目,分层就没那么复杂,仅仅分了两层。用户交互层和Dao层,(逻辑关系放在用户交互层)
没有用户界面,整个操作是根据提示信息完成,就像银行ATM机那样。
还要说明一点:项目大部分代码不是我写的,是老师写的为主,我自己写的版本实在是太没框架思想,很简单,但是还是做出来大部分功能了,个人比较害羞就不拿出来分享了。
首先看一下:包的层次结构
cmd包下面的ContactAction.java 是用户交互层代码
package cn.hncu.contact.cmd;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import org.w3c.dom.Element;
import cn.hncu.contact.dao.ContactDAO;
import cn.hncu.contact.dao.factory.ContactDaoFactory;
public class ContactAction {
private Scanner sc = null;
//注入dao
private ContactDAO dao = ContactDaoFactory.getContactDAO();
public ContactAction(){
sc = new Scanner(System.in);
System.out.println("※※警告用户:MyEclipse控制台中不支持中文!※※");
while(true){
System.out.println("1:登录");
System.out.println("2:注册");
System.out.println("0:退出");
String op = sc.nextLine();
if("1".equals(op)){
login();
}else if("2".equals(op)){
reg();
}else if("0".equals(op)){
System.out.println("您已经安全退出系统!");
break;
}
}
}
//业务逻辑代码
public void login(){
System.out.println("请输入用户名:");
String name = sc.nextLine().trim();
System.out.println("请输入密码:");
String pwd = sc.nextLine();
boolean boo = dao.login(name,pwd);
if(!boo){
System.out.println("用户名或密码错误,请重新输入!");
login();
}else{
System.out.println("恭喜,登录成功!");
doOpertate();//联系人信息管理模块
}
}
public void reg(){
System.out.println("请输入英文用户名:");
String name = sc.nextLine().trim();
System.out.println("请输入密码:");
String pwd = sc.nextLine();
System.out.println("请输入确认密码:");
String pwd2 = sc.nextLine();
if(pwd.equals(pwd2)){
boolean boo = dao.reg(name,pwd);
if(!boo){
System.out.println("该用户名已经存在,请重新输入!");
reg();
}else{
System.out.println("恭喜,您已经注册成功!");
}
}else{
System.out.println("两次密码不一致,请重新输入!");
reg();
}
}
public void doOpertate(){
System.out.println("1:显示所有联系人");
System.out.println("2:添加联系人");
System.out.println("3:删除联系人");
System.out.println("4:修改联系人");
System.out.println("0:退出");
String sel = sc.nextLine().trim();
if("1".equals(sel)){
showAllContacts();
}else if("2".equals(sel)){
addContact();
}else if("3".equals(sel)){
delContact();
}else if("0".equals(sel)){
return;
}else if("4".equals(sel)){
updateContact();
}
doOpertate();
}
public void addContact(){
System.out.println("请输入联系人的信息");
System.out.println("姓名:");
String name = sc.nextLine().trim();
System.out.println("性别:");
String sex = sc.nextLine().trim();
System.out.println("电话:");
String tel = sc.nextLine().trim();
dao.add(name,sex,tel);
}
public void showAllContacts(){
System.out.println("序号\t姓名\t性别\t电话");
System.out.println("----------------------------------");
List< Map<String,String> > list = dao.queryAllContacts();
int i=1;
delIds= new String[list.size()];//☆2☆
for(Map<String,String> map:list){
String name = map.get("name");
String sex = map.get("sex");
String tel = map.get("tel");
System.out.println((i++)+"\t"+name+"\t"+sex+"\t"+tel);
//☆3☆把当前记录的id存储到delIds[],为以后删除时读取出来
String id = map.get("id");
delIds[i-2]=id;
}
System.out.println("----------------------------------");
System.out.println();
}
private String delIds[]=null;//☆1☆专用于存储删除时要读取的id
public void delContact(){
System.out.println("请输入要删除联系人的序号:");
int num = sc.nextInt();
sc.nextLine();//吸掉多余的换行符
String name = dao.del( delIds[num-1] );
if(name==null){
System.out.println("要删除的联系人不存在!");
}else{
System.out.println(name+"已经被成功删除!");
}
//showAllContacts();
}
public void updateContact(){
showAllContacts();
System.out.println("请输入要修改联系人的序号:");
int num = sc.nextInt();
sc.nextLine();//吸掉多余的换行符
System.out.println("请输入你要修改练习人的项目代号和修改后的内容");
System.out.println("格式:1:李军");
System.out.println("1:修改联系人姓名");
System.out.println("2:修改联系人性别");
System.out.println("3:修改联系人电话");
System.out.println("0:退出");
String info = sc.next();
// 还需要校验用户输入格式
boolean boo = dao.update(delIds[num-1],info);
if(boo){
System.out.println("修改成功!");
showAllContacts();
}else{
System.out.println("修改失败,重新输入!");
updateContact();
}
}
public static void main(String[] args) {
new ContactAction();
}
}
:
common包下面的DocumentFactory.java是一个的获取Document对象和保存的方法。因需要经常用到重复的代码就抽取成工具方法了、其中获取Document对象,采用了单例(饿汉式)的设计模式,
package cn.hncu.contact.common;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
public class DocumentFactory {
private static Document dom;
private static File file;
private DocumentFactory(){
}
static{
try {
file = new File("./xml/contact.xml");
if(!file.exists()){
throw new RuntimeException("xml数据库不存在");
}else{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
dom = db.parse(file);
}
} catch (Exception e) {
throw new RuntimeException("xml数据库解析出错:"+e.getMessage(), e);
}
}
//提供给外面访问的方法
/**
* @return返回项目xml数据库对应的document对象
*/
public static Document getDom(){
return dom;
}
/**
* 把当前内存中的dom对象保存到项目xml数据库,这两个和getDom()时一样
*/
public static void save(){
try {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform( new DOMSource(dom), new StreamResult(file)); //
} catch (Exception e) {
throw new RuntimeException("xml数据库保存出错:"+e.getMessage(), e);
}
}
}
dao层,主要是三部分,接口、工厂方法、实现类。
接口代码如下:
package cn.hncu.contact.dao;
import java.util.List;
import java.util.Map;
public interface ContactDAO {
public boolean reg(String name,String pwd);
public boolean login(String name,String pwd);
public void add(String name, String sex, String tel);
public List<Map<String, String>> queryAllContacts();
public String del(String id);
public boolean update(String string, String info);
}
工厂方法:
package cn.hncu.contact.dao.factory;
import cn.hncu.contact.dao.ContactDAO;
import cn.hncu.contact.dao.impl.ContactDaoImpl;
public class ContactDaoFactory {
private ContactDaoFactory(){
}
public static ContactDAO getContactDAO(){
return new ContactDaoImpl();
}
}
还有实现类
package cn.hncu.contact.dao.factory;
import cn.hncu.contact.dao.ContactDAO;
import cn.hncu.contact.dao.impl.ContactDaoImpl;
public class ContactDaoFactory {
private ContactDaoFactory(){
}
public static ContactDAO getContactDAO(){
return new ContactDaoImpl();
}
}