您的位置:首页 > 其它

XML解析--小项目实战(联系人管理系统)

2016-09-17 11:28 501 查看

项目实战!

**请使用XML保存数据,完成一个联系人管理系统(需求)。

               用户必须经过认证登录后方可以使用系统。

               注册、增加、删除、修改、查看联系人功能。

               分模块进行设计。

               两层框架-用户交互层,Dao层。

               其他支持层-数据封装层。

项目分析:
             开发步骤:

             第一步:设计数据结构-XML。

             第二步:设计项目层次图。

             第三步:准备资源并编码实现。

             第四步:运行测试。

代码实现:

XML文档:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
张三男18273739867milkfemale11223344556修改完成male正在修改中...Rose女18273735698王大锤男18273731156

工具类--utils包:
1)获得数据库文档对象并且保存方法实现

package xmlContact201601_1_2.utils;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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;
import org.xml.sax.SAXException;

public class MyDocumentFactory {
//这个类的作用是作为工具类,方便拿到document对象
private static final String FILE_NAME = "./xmls/contacts.xml";
private static Document dom;
//这里方便到一个xml文档中有两个不同的用户是---我们应该采取单例的方法来解决
static {
try {
dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(FILE_NAME);
} catch (SAXException e) {
System.out.println("第一个异常被捕捉到");
} catch (IOException e) {
System.out.println("第二个异常被捕捉到(IO流出问题)");
} catch (ParserConfigurationException e) {
System.out.println("第三个异常被捕捉到(解析出问题)");
}
}
public static Document getDocument(){
return dom;
}

public static void save(){    //把dom文档对象保存到FILE_NAME文档中去(transformer)
try {
TransformerFactory.newInstance().newTransformer().transform(new DOMSource(dom) , new StreamResult(FILE_NAME));
} catch (TransformerConfigurationException e) {
System.out.println("第一个异常被捕捉到");
} catch (TransformerException e) {
System.out.println("第二个异常被捕捉到");
} catch (TransformerFactoryConfigurationError e) {
System.out.println("第三个异常被捕捉到");
}
}
}

2)获取id数据--获取类型 4(伪随机生成的)UUID 的静态工厂。
package xmlContact201601_1_2.utils;

import java.util.UUID;

public class IDGenerate {
private IDGenerate(){    //工具类私有化构造方法---防止外部直接调用
}

public static String getId(){
return UUID.randomUUID().toString().replace("-", "");
}
}

dao层--数据库访问对象:
接口:

package xmlContact201601_1_2.dao;

import java.util.List;
import java.util.Map;

import org.w3c.dom.Element;

public interface ContactDAO {     //铁三角:接口
public abstract boolean login(String name, String pwd);
public abstract List> querry();
public abstract void add(String name,String sex,String tel);
public abstract Element del(String id);
public abstract Element update(String id,String name,String sex,String tel);
public abstract void reg(String name,String pwd);
}

实现类:

package xmlContact201601_1_2.dao;

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 xmlContact201601_1_2.utils.IDGenerate;
import xmlContact201601_1_2.utils.MyDocumentFactory;

public class ContactDAOImpl implements ContactDAO {
private Element currentUser = null;
@Override
public boolean login(String name, String pwd) {
// 用户输入的参数与数据库中的联系人对象进行比较
// 拿到数据库对象
Document dom = MyDocumentFactory.getDocument();
// 进行遍历操作
// 取根节点
Element root = (Element) dom.getFirstChild(); // contacts
NodeList ndList = root.getElementsByTagName("user");
for (int i = 0; i < ndList.getLength(); i++) {
Element eUser = (Element) ndList.item(i);
//System.out.println(el.getAttribute("name")+"  "+name);
//System.out.println(el.getAttribute("pwd")+"  "+pwd);
if (eUser.getAttribute("name").equalsIgnoreCase(name)
&& eUser.getAttribute("pwd").equalsIgnoreCase(pwd)) {
//把当前登录的对象保存起来方便遍历时直接拿出来进行操作
currentUser = eUser;
return true;     //登陆成功
}
}
return false;     //登录失败
}

/* (non-Javadoc)
* @see xmlContact201601_1_2.dao.ContactDAO#querry()
*/
@Override
public List> querry() {
List> list = new ArrayList>();
if(currentUser==null){
return list;
}
NodeList ndList = currentUser.getElementsByTagName("contact");
for(int i=0;i  map = new HashMap();
Element eContact = (Element) ndList.item(i);
String id = eContact.getAttribute("id");
map.put("id", id);//1
String name = eContact.getElementsByTagName("name").item(0).getTextContent();
map.put("name", name);//2
String sex = eContact.getElementsByTagName("sex").item(0).getTextContent();
map.put("sex", sex);//3
String tel = eContact.getElementsByTagName("tel").item(0).getTextContent();
map.put("tel", tel);//4

list.add(map);
}
return list;
}

/* (non-Javadoc)
* @see xmlContact201601_1_2.dao.ContactDAO#add()
*/
@Override
public void add(String name,String sex,String tel) {
// TODO 添加联系人的方法
//首先拿到数据库文本对象
Document dom = MyDocumentFactory.getDocument();
//创建需要添加的节点对象
Element eContact = dom.createElement("contact");
eContact.setAttribute("id", IDGenerate.getId());
Element eName = dom.createElement("name");
Element eSex = dom.createElement("sex");
Element eTel = dom.createElement("tel");
//设置文本内容---下面这种方法写死了
//		eName.setTextContent("爱新觉罗");
//		eSex.setTextContent("不详");
//		eTel.setTextConten
4000
t("15687987583");
//写活的----外部传参
eName.setTextContent(name);
eSex.setTextContent(sex);
eTel.setTextContent(tel);
eContact.appendChild(eName);
eContact.appendChild(eSex);
eContact.appendChild(eTel);
//拿到当前登录的用户对象并且把新的元素添加到节点上去
currentUser.appendChild(eContact);

//保存到硬盘
MyDocumentFactory.save();

}

/* (non-Javadoc)
* @see xmlContact201601_1_2.dao.ContactDAO#del()
*/
@Override
public Element del(String id) {
//当前用户对象: currentUser
NodeList ndList = currentUser.getElementsByTagName("contact");   //拿到当前用户的所有联系人进行遍历
for(int i=0;i

工厂类:

package xmlContact201601_1_2.dao;

public class ContactDAOFactory {
private ContactDAOFactory(){    //私有化构造方法,防止外部直接调用
}
public static ContactDAO getContactDAO(){
return new ContactDAOImpl();
}
}


主方法(main函数):

package xmlContact201601_1_2.cmd;

import java.util.List;
import java.util.Map;
import java.util.Scanner;

import org.w3c.dom.Element;

import xmlContact201601_1_2.dao.ContactDAO;
import xmlContact201601_1_2.dao.ContactDAOFactory;

public class ContactAction {
private Scanner sc = null;
private ContactDAO dao = null;     //导包
private String ids[] = null;
//核心代码的构造方法
public ContactAction(){
sc = new Scanner(System.in);
//没注入!!!!--爬坑
dao = ContactDAOFactory.getContactDAO();

while (true) {
//自顶向下,逐步细化(首先把基本框架搭好)
System.out.println("欢迎来到电话簿管理界面!");
System.out.println("1. 登录");
System.out.println("2. 注册");
System.out.println("3. 注销");
//用户进行选择操作
//Scanner sc = new Scanner(System.in);
System.out.print("请选择操作方式(1/2/任意键):");
String sel = sc.nextLine();
if ("1".equals(sel)) {
login(); //如果用户选择的是登录操作---即调用登录方法
} else if ("2".equals(sel)) {
reg(); //如果用户选择的是注册操作---即调用注册方法
} else { //在这里默认选择其他按钮就调用注销操作
break;
}
}
}

/**
*
*/
private void reg() {
System.out.print("请输入用户名: ");
String name = sc.nextLine();
System.out.println("请输入密码: ");
String pwd = sc.nextLine();
dao.reg(name, pwd);
System.out.println("注册成功,请前往登录!");
}

/**
*
*/
private void login() {
//判断是否登录成功
System.out.println("欢迎来到登录界面!");
System.out.print("请输入管理员姓名: ");
String name = sc.nextLine();
System.out.print("请输入管理员密码: ");
String pwd = sc.nextLine();
boolean boo = dao.login(name, pwd);    //把用户输入的姓名和密码拿到进行校验
//System.out.println("返回结果"+boo);
if(boo){
System.out.println("恭喜您! 登陆成功");
operate();
}else{
System.out.println("登录失败,请判断用户名和密码是否输入正确!");
}
}

private void operate() {
// TODO:登陆成功需要进行的操作方法等待完成
System.out.println("1. 查询所有联系人");
System.out.println("2. 添加联系人");
System.out.println("3. 删除联系人");
System.out.println("4. 修改联系人");
System.out.println("5. 返回上一级");
System.out.println("请选择您需要进行的操作:");
Scanner sc = new Scanner(System.in);
String sel = sc.nextLine();
if("1".equals(sel)){
List> list = dao.querry();
System.out.println("序号\t姓名\t性别\t电话号码");
System.out.println("-------------------------------------");
int i = 1;
ids = new String[list.size()];
for(Map map:list){
String id = map.get("id");
ids[i-1] = id;    //把id放入数组中,以便于下面的del()方法能够访问到
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);
}
}else if("2".equals(sel)){
add();
}else if("3".equals(sel)){
del();
}else if("4".equals(sel)){
update();
}else{
return;
}
operate();
}

private void update() {
System.out.print("请输入待修改的联系人序号: ");
int num = sc.nextInt();
sc.nextLine();          //吸掉换行符
System.out.print("请输入修改后的姓名: ");
String name = sc.nextLine();
System.out.print("请输入修改后的性别: ");
String sex = sc.nextLine();
System.out.print("请输入修改后的电话号码: ");
String tel = sc.nextLine();
Element updContact = dao.update(ids[num-1],name,sex,tel);
if(updContact==null){
System.out.println("联系人修改失败!");
}else{
String byName = updContact.getElementsByTagName("name").item(0).getTextContent();
System.out.println("联系人 "+byName+"修改成功!");
}
}

private void del() {
//拿到联系人对应的序号进行删除操作-----先搭好基本框架
System.out.print("请输入待删除的联系人序号: ");
int num = sc.nextInt();
sc.nextLine();       //吸掉换行符
Element delEContact = dao.del(ids[num-1]);
if(delEContact==null){
System.out.println("改联系人不存在或已经被删除!");
}else{
String name = delEContact.getElementsByTagName("name").item(0).getTextContent();
System.out.println("恭喜您! 联系人"+ name +"已被删除");
}

}

private void add() {
System.out.print("请输入需要添加的联系人姓名: ");
String name = sc.nextLine();
System.out.print("请输入联系人性别(男/女): ");
String sex = sc.nextLine();
System.out.print("请输入联系人电话: ");
String tel = sc.nextLine();

dao.add(name, sex, tel);
System.out.println("新的联系人添加成功!");
}

//main方法
public static void main(String[] args) {
new ContactAction();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: