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(); } }
相关文章推荐
- XML学习---项目实战:联系人管理系统
- 项目52-XML解析的银行管理系统
- Radware负载均衡项目配置实战解析之五-设备维护与管理
- Java基础(十六)——项目实战——交通灯管理系统
- WCF+SQL Server 2008 医院管理系统项目解析(一)
- 承志医院管理系统项目解析 门诊登记(二)
- 【课程分享】基于plusgantt的项目管理系统实战开发(Spring3+JDBC+RMI的架构、自己定义工作流)
- 客运综合管理系统项目解析-WCF-客户端-配置详细流程-登陆信息
- S2SH火车票订票管理系统项目实战
- 承志医院管理系统项目解析 登录(一)
- plusgantt的项目管理系统实战开发最全课程
- 凯云水利水电工程造价管理系统 技术解析(三)项目属性(二)
- 项目视频讲解_国内首部基于JBPM5.4实战流程引擎开发(动态表单、模板引擎、公文管理系统)
- 客运综合管理系统项目解析-WCF-新建项目与服务端架构
- 实战CRM系统项目:4.基础配置-区域管理
- 欣然药品库房管理系统项目实战【视频】
- Maven项目管理实战(二)--pom.xml
- Maven项目管理实战(四)-pom.xml文件详解
- 海马汽车经销商管理系统技术解析(一)新建项目,搭建WCF架构
- ACCP4.0 [项目实战2]学员成绩管理系统