XML小项目------dom4j操作联系人(图形界面版)

在进行此项目之前需要将dom4j的jar包及其依赖包导入,具体操作间本博客文章:XML之------dom4j对XML文档增删改查点击打开链接

公共类:DocumentFactory.java

package cn.hncu.contact.common;

import java.io.FileWriter;
import java.io.IOException;

import org.dom4j.Document;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class DocumentFactory {
	private static Document dom=null;
	static{
		try {
			SAXReader sax=new SAXReader();
			dom=sax.read("xml/contact.xml");
		} catch (Exception e) {
			throw new RuntimeException("xml文件解析出错", e);
		}
	}
	private DocumentFactory(){
	}
	public static Document getDocument(){
		return dom;
	}
	public static void save(){
		try {
			XMLWriter writer=new XMLWriter(new FileWriter("xml/contact.xml"));
			writer.write(dom);
			writer.close();
		} catch (IOException e) {
			throw new RuntimeException("xml文件保存出错", e);
		}
	}
}

工具类:

IDGenerate.java

package cn.hncu.contact.utils;

import java.util.UUID;

public class IDGenerate {
	private IDGenerate(){
	}
	public static String getId(){
		String uuid=UUID.randomUUID().toString();
		uuid=uuid.replace("-", "");
		return uuid;
	}
}

PwdMd5Utils.java

package cn.hncu.contact.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import sun.misc.BASE64Encoder;

public class PwdMd5Utils {

	public static String mkPwd(String pwd){
		String pwd2="";
		try {
			MessageDigest msg=MessageDigest.getInstance("MD5");
			byte buf[]=msg.digest(pwd.getBytes());//buf的长度是16
			for (byte b:buf){
				String s=Integer.toHexString(b & 0xff);
				if (s.length()==1){
					s+="f";//可以把'f'换成其它的16进制数如'a'
				}
				pwd2+=s;
			}
			return pwd2;
		} catch (NoSuchAlgorithmException e) {
			throw new RuntimeException("加密失败", e);
		}
	}

	public static void main(String[] args) {
		//introduce1();
		//introduce2();
		md5_2();
	}

	//该加密方式目前可以用,但不建议,因为使用了oracle公司没有公开的类
	private static void introduce1() {
		String pwd="1234";
		try {
			MessageDigest msg=MessageDigest.getInstance("MD5");
			byte buf[]=msg.digest(pwd.getBytes());
			for (byte b:buf){
				System.out.print(b+" ");
			}
			System.out.println();
			System.out.println(buf.length);

			//BASE64Encoder在API文档中不存在,即该类是oracle公司没有公开的,因此我们要谨用!!!
			BASE64Encoder en=new BASE64Encoder();
			String pwd2=en.encode(buf);
			System.out.println("pwd2: "+pwd2);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	//该加密方式可用,我们自己写一段替代BASE64Encoder类中encode()方法的代码
	private static void introduce2() {
		String pwd="1234";
		String pwd2="";
		try {
			MessageDigest msg=MessageDigest.getInstance("MD5");
			byte buf[]=msg.digest(pwd.getBytes());
			for (byte b:buf){
				String s=Integer.toHexString(b & 0xff);
				if (s.length()==1){
					s+="f";
				}
				pwd2+=s;
			}
			System.out.println(pwd2);
			System.out.println("len: "+pwd2.length());
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}

	}

	private static void md5_2() {
		String pwd="1234";
		String pwd2="";
		try {
			MessageDigest msg=MessageDigest.getInstance("MD5");
			byte buf[]=msg.digest(pwd.getBytes());
			for (byte b:buf){
				String s=Integer.toHexString(b & 0xff);
				if (Math.abs(b)<16){
					s="a"+s;
				}
				pwd2+=s;
			}
			System.out.println(pwd2);
			System.out.println("len: "+pwd2.length());
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}

	}

}

表现层:ContactWin.java

package cn.hncu.contact.ui;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import org.dom4j.Element;

import cn.hncu.contact.dao.ContactDAO;
import cn.hncu.contact.utils.IDGenerate;

public class ContactWin extends JFrame implements ActionListener{
	private static Element currentUser=null;

	private JTable jTable;
	private DefaultTableModel dtm;
	JTextField tfdName,tfdTel,tfdAddr,tfdSex;
	JButton btnAdd,btnDel;

	private ContactDAO dao=new ContactDAO();

	public ContactWin(Element user){
		this.currentUser=user;
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setBounds(200, 200, 500, 400);
		this.setTitle("联系人管理界面");
		Container c=this.getContentPane();

		jTable=getTable();
		c.add(new JScrollPane(jTable));

		tfdName=new JTextField(5);
		tfdAddr=new JTextField(5);
		tfdSex=new JTextField(5);
		tfdTel=new JTextField(5);
		JPanel p=new JPanel();
		p.add(new JLabel("联系人信息"));
		p.add(tfdName);
		p.add(tfdTel);
		p.add(tfdSex);
		p.add(tfdAddr);
		btnAdd=new JButton("添加");
		btnDel=new JButton("删除");
		p.add(btnAdd);
		p.add(btnDel);
		c.add(p,BorderLayout.SOUTH);

		btnAdd.addActionListener(this);
		btnDel.addActionListener(this);

		this.setVisible(true);
	}

	private JTable getTable() {
		//表头
		Vector<Object> vHeader=new Vector<Object>();
		vHeader.add("id");
		vHeader.add("name");
		vHeader.add("telephone");
		vHeader.add("sex");
		vHeader.add("address");

		Vector<Vector<Object>>datas=dao.getContacts(currentUser);
		dtm=new DefaultTableModel(datas, vHeader);

		JTable jt=new JTable(dtm);
		//删除第一列,即不显示id
		jt.removeColumn(jt.getColumn("id"));

		return jt;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource()==btnAdd){
			//收集参数
			String name=tfdName.getText();
			String tel=tfdTel.getText();
			String sex=tfdSex.getText();
			String addr=tfdAddr.getText();
			//补一个id
			String id=IDGenerate.getId();
			//保存到后台
			boolean boo=dao.addContact(currentUser,id,name,tel,sex,addr);
			//保存成功,刷新界面
			if (boo){
				Vector<Object> v=new Vector<Object>();
				v.add(id);
				v.add(name);
				v.add(tel);
				v.add(sex);
				v.add(addr);
				dtm.addRow(v);
			} else {
				JOptionPane.showMessageDialog(this, "添加联系人失败");
				return;
			}
		} else if (e.getSource()==btnDel){
			int row=jTable.getSelectedRow();
			if (row==-1){
				JOptionPane.showMessageDialog(null, "前选择要删除的行");
				return;
			}
			String id=(String) dtm.getValueAt(row, 0);
			boolean isSuccess=dao.delete(currentUser,id);
			if (isSuccess){
				dtm.removeRow(row);
			} else {
				JOptionPane.showMessageDialog(this, "删除联系人失败");
				return;
			}
		}
	}
}

数据层:ContactDAO.java

package cn.hncu.contact.dao;

import java.util.Iterator;
import java.util.Vector;

import org.dom4j.Document;
import org.dom4j.Element;

import cn.hncu.contact.common.DocumentFactory;
import cn.hncu.contact.utils.PwdMd5Utils;

public class ContactDAO {
	private Document dom=DocumentFactory.getDocument();
	//private static Element currentUser=null;

	//登录
	public Element login(String name, String pwd){
		name=name.toLowerCase();
		pwd=PwdMd5Utils.mkPwd(pwd);
		String xpath="//user[fn:lower-case(@name)='"+name+"'][@pwd='"+pwd+"']";
		Element e=(Element) dom.selectSingleNode(xpath);
		//currentUser=e;
		return e;
	}

	//查询所有联系人
	public Vector<Vector<Object>> getContacts(Element currentUser) {
		Vector<Vector<Object>> datas=new Vector<Vector<Object>>();
		Iterator<Element> it=currentUser.elementIterator("contact");
		while (it.hasNext()){
			Element e=it.next();
			Vector<Object> v=new Vector<Object>();
			v.add(e.attributeValue("id"));
			v.add(e.elementText("name"));
			v.add(e.elementText("tel"));
			v.add(e.elementText("sex"));
			v.add(e.elementText("addr"));
			datas.add(v);
		}
		return datas;
	}

	public boolean addContact(Element currentUser, String id, String name, String tel, String sex, String addr) {
		Element e=currentUser.addElement("contact");
		e.addAttribute("id", id);
		e.addElement("name").setText(name);
		e.addElement("tel").setText(tel);
		e.addElement("sex").setText(sex);
		e.addElement("addr").setText(addr);
		try {
			DocumentFactory.save();
			return true;
		} catch (Exception e1) {
			return false;
		}
	}

	public boolean delete(Element currentUser, String id) {
		String xpath="//contact[@id='"+id+"']";
		Element e=(Element) dom.selectSingleNode(xpath);
		boolean boo=e.getParent().remove(e);
		if (boo){
			try {
				DocumentFactory.save();
				return true;
			} catch (Exception e1) {
				return false;
			}
		}
		return false;
	}
}

登陆界面:LoginWin.java

package cn.hncu.contact;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import org.dom4j.Element;

import cn.hncu.contact.dao.ContactDAO;
import cn.hncu.contact.ui.ContactWin;

public class LoginWin extends JFrame {
	private static Element currentUser=null;

	public LoginWin(){
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setBounds(200, 200, 400, 140);

		JPanel p1=new JPanel(new GridLayout(2,2));
		p1.add(new JLabel("用户名: "));
		final JTextField tfdName=new JTextField(10);
		p1.add(tfdName);
		p1.add(new JLabel("用户名: "));
		final JPasswordField jpfPwd=new JPasswordField(10);
		p1.add(jpfPwd);

		JPanel p2=new JPanel();
		JButton btnLogin=new JButton("登录");
		JButton btnCancel=new JButton("取消");
		p2.add(btnLogin);
		p2.add(btnCancel);

		this.getContentPane().add(p1);
		this.getContentPane().add(p2,BorderLayout.SOUTH);

		btnLogin.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				String name=tfdName.getText();
				String pwd=new String(jpfPwd.getPassword());
				if (name.trim().equals("")){
					JOptionPane.showMessageDialog(LoginWin.this, "请输入用户名");
					return;
				}
				Element user=new ContactDAO().login(name,pwd);
				if (!(user==null)){
					currentUser=user;
					new ContactWin(currentUser);
					LoginWin.this.setVisible(false);
				} else {
					JOptionPane.showConfirmDialog(LoginWin.this, "用户名或密码不正确");
					return;
				}
			}
		});

		btnCancel.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});

		this.setVisible(true);
	}

	public static void main(String[] args) {
		new LoginWin();
	}

}

xml文档:

<?xml version="1.0" encoding="UTF-8"?>
<contacts>
	<user name="Jack" pwd="81dc9bdb52d04dc20f36dbd8313ed055">
    <contact id="a001">
        <name>Tom</name>
        <sex>Male</sex>
        <tel>13812345678</tel>
        <addr>湖南益阳</addr>
    </contact>
    <contact id="a002">
    	<name>Rose</name>
        <sex>Female</sex>
        <tel>13887654321</tel>
        <addr>浙江杭州</addr>
    </contact>

	</user>

	<user name="Tom" pwd="d93591bdf786ef1e4ee2fca799911215">
	    <contact id="b001">
	    	<name>Jack</name>
	    	<sex>Male</sex>
	    	<tel>13800000000</tel>
	   		<addr>浙江杭州</addr>
	    </contact>
	    <contact id="b002">
	        <name>Rose</name>
	        <sex>Female</sex>
	        <tel>13887654321</tel>
	        <addr>中国上海</addr>
	    </contact>
	</user>

</contacts>
时间: 2024-10-01 04:23:15

XML小项目------dom4j操作联系人(图形界面版)的相关文章

XML小项目------DOM操作联系人(非图形界面版)

本例分了两层的模式,即数据层和表现层 公共类: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.trans

[小项目] 获取手机联系人并且向服务器发送JSON数据

[小项目] 获取手机联系人并且向服务器发送JSON数据 好久没有写文档了...最近忙着带班,也没有时间学习新东西,今天刚好有个小Demo,就写了一下,顺便丰富一下我的博客吧! 首先说一下需求: 简单的说,就是一个程序,会获取手机的联系人列表,然后转换成JSON字符串数组,向指定服务器中发送数据...总感觉有侵犯别人隐私权的意味; 注:仅供学习使用,不要做违法的事情哟 这个程序我写的有点有条理,首先有几个工具类: 1. 判断是否联网的工具类(NetUtils) 2. 从手机中获取所有联系人的工具类

最简单的基于DirectShow的示例:视频播放器图形界面版

本文记录一个最简单的基于DirectShow的图形界面的视频播放器.基于DirectShow的图形界面的播放器的例子还是比较多的,但是大部分都是"层层封装"的例子."层层封装"的例子相对来说更加稳定,但是却不是很容易理解.因为DirectShow本身的接口函数的数量就比较多,如果再加上封装DirectShow的函数,合起来的函数数量是非常大的,很容易让人搞不清哪些才是真正的DirectShow接口函数.本播放器剥去了DirectShow例子中的"层层封装&

github版本库使用详细图文教程(命令行及图形界面版)

投稿:mdxy-dxy 字体:[增加 减小] 类型:转载 时间:2015-08-06我要评论 今天我们就来学习github的使用,我们将用它来管理我们的代码,你会发现它的好处的,当然是要在本系列教程全部完成之后,所以请紧跟站长的步伐,今天是第一天,我们来学习如何在git上建立自己的版本仓库,并将代码上传到仓库中 Git是一个分布式的版本控制系统,作为开源代码库以及版本控制系统,Github目前拥有140多万开发者用户.随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现

github版本库使用详细教程(命令行及图形界面版)

Git是一个分布式的版本控制系统,作为开源代码库以及版本控制系统,Github目前拥有140多万开发者用户.随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法. Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.目前,包括 Rubinius和Merb在内的很多知名项目都使用了Git.Git同样可以被诸如Capistrano和Vl

Strus2第一次课:dom4j操作xml

先从底层的xml操作技术记录: 当我们新建一个项目,什么架包都没加入的时候,java提供了 org.w3c.dom给我们操作xml里面的元素 import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; 并且提供了 javax.xml来读取xml.对xml进行增删改操作 如何读取一个xml文件: 导包: javax.xml.parsers

盘点三个网络赚零花钱的小项目,傻瓜式操作

今天,写一篇比较特别的日志,咱们来盘点三个赚零花钱的小项目,都是“傻瓜式”操作. 这几个小项目,虽说赚不了太多的钱,但是却是一个可以锻炼执行力的好方法. 每一个项目操作都非常的简单,边锻炼执行力,边收钱,也是一种不错的体验. 废话不多说,咱们直接进入主题啊! 一,支付宝借条,可赚零花钱,也可赚大钱 支付宝有打借条的功能,本来他们开发这个,只是针对于熟人之前借钱的. 不过,无心插柳柳成荫,没成想,这个功能火的一塌糊涂,完全带火了陌生人之间的借贷业务. 如何利用支付宝借条赚钱? 其实就跟放贷是一样的

傻瓜式操作的三个网络赚零花钱的小项目

今天,写一篇比较特别的日志,咱们来盘点三个赚零花钱的小项目,都是"傻瓜式"操作. 这几个小项目,虽说赚不了太多的钱,但是却是一个可以锻炼执行力的好方法. 每一个项目操作都非常的简单,边锻炼执行力,边收钱,也是一种不错的体验. 废话不多说,咱们直接进入主题啊! 一,支付宝借条,可赚零花钱,也可赚大钱 支付宝有打借条的功能,本来他们开发这个,只是针对于熟人之前借钱的. 不过,无心插柳柳成荫,没成想,这个功能火的一塌糊涂,完全带火了陌生人之间的借贷业务. 如何利用支付宝借条赚钱? 其实就跟放

DOM4J操作XML(包括封装和解析)

先来看看dom4j中相应XML的DOM树建立的继承关系 针对于XML标准定义.相应于图2-1列出的内容,dom4j提供了下面实现: 以下给出一个详细事例: package com.iboxpay.settlement.gateway.common.util; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import org.dom4j.Document; import