通讯录管理系统版本2请参考:
项目实战!
①请使用XML保存数据,完成一个联系人管理系统。
②用户必须经过认证登录后方可以使用系统。
③注册、增加、删除、查看联系人功能。
④分模块进行设计。
⑤两层框架-用户交互层,Dao层。
⑥其他支持层-数据封装层。
⑦工具类-加密,工厂Bean。
联系人管理系统:
开发步骤:
第一步:设计数据结构-XML。第二步:设计项目层次图。
第三步:准备资源并编码实现。
第四步:运行测试。
项目的整体框架:
整体的框架分层:
表现层:cmd
数据库层:dao
公共数据:common、
工具包:utils
如图:
表现层(cmd):
表现层的设计:
cmd包下的ContactAction.java类实现表现层功能。
代码实现:
package cn.hncu.contact.cmd;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import cn.hncu.contact.dao.ContactDao;
import cn.hncu.contact.dao.factory.ContactDaoFactory;
public class ContactAction {
private Scanner sc = new Scanner(System.in);
private ContactDao dao=ContactDaoFactory.getContactDAO();
public ContactAction(){
while (true) {
System.out.println("1:登录");
System.out.println("2:注册");
System.out.println("0:退出");
String sel = sc.nextLine();
if ("1".equals(sel)) {
login();
} else if ("2".equals(sel)) {
reg();
} else if ("0".equals(sel)) {
System.out.println("您已经成功退出系统!");
break;
}
}
}
//注册界面
private void reg() {
System.out.println("请输入英文用户名:");
String name=sc.nextLine();
System.out.println("请输入密码:");
String pwd=sc.nextLine();
System.out.println("请输入确认密码:");
String pwd2=sc.nextLine();
if(!(pwd.equals(pwd2))){
System.err.println("两次密码不一致,请重新输入!");
}else{
boolean boo=dao.reg(name, pwd);
if(boo){
System.out.println("用户注册成功!");
}else{
System.err.println("用户名或密码已经存在!");
}
}
}
//登录界面
private void login() {
System.out.println("请输入用户名:");
String name=sc.nextLine();
System.out.println("请输入密码:");
String pwd=sc.nextLine();
boolean boo=dao.login(name, pwd);
if(boo){
doOperator();
}else{
System.err.println("用户名或者密码错误!");
}
}
//登录后界面
private void doOperator() {
System.out.println("1:显示所有的联系人");
System.out.println("2:增加联系人");
System.out.println("3:删除联系人");
System.out.println("4:修改联系人");
System.out.println("0:退出");
String sel=sc.nextLine();
if("1".equals(sel)){
showAllContacts();
}else if("2".equals(sel)){
addContacts();
}else if("3".equals(sel)){
System.out.println("删除联系人");
delContacts();
}else if("4".equals(sel)){
}else if("0".equals(sel)){
return;/*return的一个主要作用是结束当前的方法*/
}
doOperator();
}
//删除指定联系人
private void delContacts() {
System.out.println("请输入要删除的联系人序号:");
int num=sc.nextInt();
sc.nextLine();
String id=ids[num-1];
boolean boo=dao.delContact(id);
if(boo){
System.out.println("联系人删除成功!");
}else{
System.err.println("联系人删除是被!");
}
}
//显示所有联系人
private String[] ids=null;
private void showAllContacts() {
System.out.println("----------------------------------");
System.out.println("序号\t姓名\t性别\t电话");
List<Map<String, String>> list=dao.showAll();
ids=new String[list.size()];
for(int i=0;i<list.size();i++){
String name=list.get(i).get("name");
String sex=list.get(i).get("sex");
String tell=list.get(i).get("tell");
String id=list.get(i).get("id");
ids[i]=id;
System.out.println("----------------------------------");
System.out.println((i+1)+"\t"+name+"\t"+sex+"\t"+tell);
}
System.out.println("----------------------------------");
}
//增加联系人
private void addContacts() {
System.out.println("请输入新加联系人信息:");
System.out.println("姓名:");
String name=sc.nextLine();
System.out.println("性别:");
String sex=sc.nextLine();
System.out.println("电话:");
String tel=sc.nextLine();
boolean boo=dao.createContact(name,sex,tel);
if(boo){
System.out.println("新联系人添加成功!");
}else{
System.err.println("联系人已经存在!");
}
}
//主程序入口
public static void main(String[] args) {
new ContactAction();
}
}
实现后的效果:
主界面下的登录界面: 主界面下的注册界面:
公共数据层(common):
公共数据层,只要是提取出公共的数据,减少代码冗余。
common包下的DocumentFactory.java实现公共数据层功能。
代码实现:
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.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
public class DocumentFactory {
private static File file = null;
private static Document dom = null;
private DocumentFactory() {
}
/**
* 利用静态快进行初始化
*/
static {
try {
file = new File("./xml/contact.xml/");
if (!file.exists()) {
throw new RuntimeException("xml数据库不存在");
}
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
dom = db.parse(file);
} catch (Exception e) {
throw new RuntimeException("xml数据库解析错误:" + e.getMessage(), e);
}
}
/**
* 提供给外边访问的方法
* @return获得XML中的DOM树
*/
public static Document getDom() {
return dom;
}
/**
* 保存修改后的DOM树
*/
public static void save() {
try {
TransformerFactory trans = TransformerFactory.newInstance();
Transformer transformer = trans.newTransformer();
transformer.transform(new DOMSource(dom),new StreamResult(file));
} catch (Exception e) {
throw new RuntimeException("xml数据库保存出错:"+e.getMessage(), e);
}
}
}
数据层(dao):
主要是利用xml数据库存储,对DOM树进行增删改查操作。
数据层下的接口类(ContactDao.java):
主要是提供 对外(表现层)可访问的接口,对其提供登录(login)、注册(reg)使用接口。
代码实现:
package cn.hncu.contact.dao;
public interface ContactDao {
public abstract boolean reg(String name,String pwd);
public abstract boolean login(String name,String pwd);
}
数据层下的接口实现类(impl):
主要是实现接口ContactDao类中的抽象方法。
代码实现:
package cn.hncu.contact.dao.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import cn.hncu.contact.common.DocumentFactory;
import cn.hncu.contact.dao.ContactDao;
import cn.hncu.contact.utils.IDGenerate;
public class ContactDaoImpl implements ContactDao{
private Document dom=DocumentFactory.getDom();
private Element currentUser=null;
@Override
public boolean reg(String name, String pwd) {
//遍历--用户是否已经存在
Element eroot=(Element) dom.getFirstChild();
NodeList nodeList=eroot.getElementsByTagName("user");
for(int i=0;i<nodeList.getLength();i++){
Element user=(Element) nodeList.item(i);
String ename=user.getAttribute("name");
if(name.equals(ename)){
return false;
}
}
//组装此子节点
Element euser=dom.createElement("user");
euser.setAttribute("name", name);
euser.setAttribute("pwd", pwd);
eroot.appendChild(euser);
//保存修改后的DOM树
DocumentFactory.save();
return true;
}
@Override
public boolean login(String name, String pwd) {
Element eroot=(Element) dom.getFirstChild();
NodeList nodeList=eroot.getElementsByTagName("user");
for(int i=0;i<nodeList.getLength();i++){
Element euser=(Element) nodeList.item(i);
String ename=euser.getAttribute("name");
String epwd=euser.getAttribute("pwd");
if(name.equals(ename) && pwd.equals(epwd)){
//确定登录的user就是当前的user
currentUser=euser;
return true;
}
}
return false;
}
@Override
public List<Map<String, String>> showAll() {
List<Map<String, String>> list=new ArrayList<Map<String,String>>();
NodeList nodeList=currentUser.getElementsByTagName("contact");
for(int i=0;i<nodeList.getLength();i++){
Map<String, String>map=new HashMap<String, String>();
Element eContact=(Element) nodeList.item(i);
String id=eContact.getAttribute("id");
String name=((Element)eContact.getElementsByTagName("name").item(0)).getTextContent();
String sex=((Element)eContact.getElementsByTagName("sex").item(0)).getTextContent();
String tel=((Element)eContact.getElementsByTagName("tell").item(0)).getTextContent();
map.put("id", id);
map.put("name", name);
map.put("sex", sex);
map.put("tell", tel);
list.add(map);
}
return list;
}
@Override
public boolean createContact(String name, String sex, String tel) {
//判断name是否存在
NodeList nodeList=currentUser.getElementsByTagName("contact");
for(int i=0;i<nodeList.getLength();i++){
Element eContact=(Element) nodeList.item(i);
if(eContact.getElementsByTagName("name").item(0).getTextContent().equals(name)){
return false;
}
}
//正式添加
String id=IDGenerate.getID();
Element eContact=dom.createElement("contact");
eContact.setAttribute("id",id);
currentUser.appendChild(eContact);
Element eName=dom.createElement("name");
eName.setTextContent(name);
Element eSex=dom.createElement("sex");
eSex.setTextContent(sex);
Element eTel=dom.createElement("tell");
eTel.setTextContent(tel);
eContact.appendChild(eName);
eContact.appendChild(eSex);
eContact.appendChild(eTel);
//保存
DocumentFactory.save();
return true;
}
@Override
public boolean delContact(String id) {
NodeList nodeList=currentUser.getElementsByTagName("contact");
for(int i=0;i<nodeList.getLength();i++){
Element e=(Element) nodeList.item(i);
if(id.equals(e.getAttribute("id"))){
e.getParentNode().removeChild(e);
return true;
}
}
DocumentFactory.save();
return false;
}
}
数据层下的工厂类(factory):
主要是完全封装接口,对外通过工厂方法提供接口实现方法。
代码实现:
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();
}
}
工具类层(utils):
主要是提供一个获取随机id号的方法。
实现类:
package cn.hncu.contact.utils;
import java.util.UUID;
/**
* 随机生成id
* @author user
*
*/
public class IDGenerate {
private IDGenerate(){
}
public static String getID(){
return UUID.randomUUID().toString().replace("-", "");
}
}
XML文档(contact.xml):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<contacts>
<user name="Jack" pwd="1234">
<contact id="2ed8162f83894cc9808dbbe8a4127a23">
<name>Tom</name>
<sex>female</sex>
<tell>110</tell>
</contact>
<contact id="91c18c4fee514af78621e6b9a2d53812">
<name>Rose</name>
<sex>male</sex>
<tell>120</tell>
</contact>
</user>
</contacts>