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

联系人管理系统

请使用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();
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值