XML学习---项目实战:联系人管理系统

来源:互联网 发布:免费制谱软件 编辑:程序博客网 时间:2024/05/17 23:23

联系人管理系统

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

  1. 用户必须经过认证登录后方可以使用系统。
  2. 用户必须经过认证登录后方可以使用系统。
  3. 分模块进行设计。
  4. 两层框架-用户交互层,Dao层。
  5. 其他支持层-数据封装层。
  6. 工具类-加密,工厂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();    }}
阅读全文
0 0
原创粉丝点击