【XML解析】(3)利用DOM解析技术在XML文档下实现一个《通讯录管理系统》

通讯录管理系统版本2请参考:

http://blog.csdn.net/qq_35415600/article/details/72819217

项目实战!

①请使用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>
一、开发背景 随着互联网的普及和信息技术的发展,教学信息化管理尤为重要。 我们可以通过计算机来实现学生作业信息化的管理,这样不仅可以将作业进行保存,方便以后的素材选择,而且也方便了教师对作业的批改,老师即可以在办公室批改作业,也可以在家里的电脑上批改,甚至在能上网的计算机上就能完成对学生作业的批改。这样不仅有助于作业批改质量的提高,而且也为教师节约了很多宝贵的时间。 二、系统功能 1、学生进入系统后能完成的操作  --查看教师布置的作业 在这个功能模块中,学生能够查看教师所布置的作业信息。  --作业的提交 在这个功能模块中,学生能够完成上交作业功能。  --查看作业的批改信息 在该功能模块中,学生能够查看自己作业的批发情况。  --修改密码 在该功能模块中,学生能够修改自己的系统登录密码。  --安全退出 该功能实现安全退出系统。 2、教师登录系统后能完成的操作  --发布作业信息 在该功能模块中,教师能够向学生布置作业及发布作业的参考答案。  --批改作业 在这个功能模块中,教师能够完成对学生所上交作业的批改功能。  --作业情况统计 在这个功能模块中,教师能够实现按作业批次对作业进行统计的功能。  --修改密码 在该功能模块中,教师能够修改自己的系统登录密码。  --安全退出 该功能实现安全退出系统。 本系统采用的是浏览器/服务器结构,即浏览器端和WEB服务器端(B/S架构)。 本系统采用JSP制作界面,做人机交互,采用JavaBeans封装业务逻辑,与XML数据之间采用JDOM连接通信。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值