【XML解析】(6)利用XML+DOM4j+Xpath+MD5加密+图形界面(Jtabe+Vector)实现《通讯录管理系统》
来源:互联网 发布:帝国cms用户密码忘记 编辑:程序博客网 时间:2024/06/16 15:06
【通讯录管理系统】
(一)项目所需的技术:
1、XML相关技术
2、DOM4J相关技术
3、Xpath相关技术
4、MD5加密相关技术
5、图形界面JTable、历史集合Vector相关技术
拥有了上面的这些技术,可以写一个简单的“通讯录管理程序了”!
(二)实现方式:
首先需要对整个系统框架进行分层:
(三)代码分析演示:
(1)表现层:
LoginWin:
package cn.hncu.contact.ui;import java.awt.BorderLayout;import java.awt.Container;import java.awt.FlowLayout;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 cn.hncu.contact.dao.ContactDAO;import cn.hncu.contact.dao.factory.ContactDAOfactory;public class LoginWin extends JFrame{ ContactDAO dao=ContactDAOfactory.getContactDAO(); public LoginWin(String string) { //界面基本默认参数设置 setTitle(string); setDefaultCloseOperation(EXIT_ON_CLOSE); setBounds(200, 200, 300, 150); Container c=getContentPane(); c.setLayout(new FlowLayout()); //显示表格的 //用户交互组件:----输入 JLabel jlb1=new JLabel("姓名"); c.add(jlb1); final JTextField tfdName= new JTextField(20); c.add(tfdName); JLabel jlb2=new JLabel("密码"); c.add(jlb2); final JPasswordField tfdPwd=new JPasswordField(20); c.add(tfdPwd); //用户交互组件:----按钮 JPanel jpl2=new JPanel(); c.add(jpl2,BorderLayout.SOUTH); /* * 登录按钮的事件交互 */ JButton btnLogin=new JButton("登录"); jpl2.add(btnLogin); btnLogin.setActionCommand("login"); btnLogin.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("login")){ //1、收集参数 String name=tfdName.getText(); String pwd=new String(tfdPwd.getPassword()); //2、组织参数(略过,因为逻辑层没有写,JavaBean也就不用封装了) //3、调用逻辑层(略过,直接在表现层调用DAO,不用在逻辑层调用DAO,小程序就简写了) boolean boo=dao.login(name,pwd); //4、根据逻辑层返回结果执行不同的结果页面 if(boo){ /*【注意】: * 此时有个问题: * --①某个用户登录成功后,ContactWin中的JTable会显示【当前用户】下的所有联系人的详细信息; * --②当我们new ContactWin之后,该如何知道当前的ContactWin界面的用户就是已经登录的用户; * --③ContactWin完全没有必然的联系,该如何将登录时候的用户传到登录后的界面中去呢? * --④可以将当前登录时候调用的dao传给ContactWin界面,因为dao是唯一的; * --⑤因为传的是同一个dao,用户肯定是同一个; * --⑥但是我们在登录的同时要将所调用的dao作为当前dao存储记录下来,好让下个界面使用; * */ new ContactWin(dao); }else{ JOptionPane.showMessageDialog(LoginWin.this, "用户名或密码错误"); return; } } } }); /* * 注册按钮的事件交互 */ JButton btnReg=new JButton("注册"); jpl2.add(btnReg); btnReg.setActionCommand("reg"); btnReg.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("reg")){ String name=tfdName.getText(); String pwd=new String(tfdPwd.getPassword()); boolean boo=dao.reg(name, pwd); if(boo){ System.out.println(boo); }else{ System.out.println(boo); } } } }); /* * 取消按钮的事件交互 */ JButton btnCancel =new JButton("取消"); jpl2.add(btnCancel); btnCancel.setActionCommand("cancel"); btnCancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("cancel")){ System.exit(0); } } }); setVisible(true); } public static void main(String[] args) { new LoginWin("通讯录管理系统"); }}
ContactWin:
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.Iterator;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 cn.hncu.contact.dao.ContactDAO;public class ContactWin extends JFrame{ /* * 接收当前dao为参数中的dao */ private static ContactDAO dao=null; public ContactWin(final ContactDAO dao){ /* * 表现层默认参数设置 */ setTitle("联系人管理"); setBounds(100, 100, 900, 400); Container c=getContentPane(); /* 维护Table数据层数据 data the data of the table, a Vector of Vectors of Object values columnNames vector containing the names of the new columns */ //①添加表头---将固定的表头添加到列名集合中 final Vector<String> columnNames =new Vector<String>(); columnNames.add("ID"); columnNames.add("Name"); columnNames.add("Sex"); columnNames.add("Tell"); columnNames.add("Addr"); //②添加表数据---从数据库中拿到所有的信息,然后逐行遍历并且添加到表格 Vector<Vector<Object>> data=new Vector<Vector<Object>>(); Vector<Vector<Object>> vv=dao.getAllContacts(); for(Vector<Object> v:vv){ data.add(v); } //③添加数据库中读取的所有信息加入到表格中 final DefaultTableModel dtm=new DefaultTableModel(data, columnNames); final JTable jtable=new JTable(dtm); jtable.removeColumn(jtable.getColumn("ID")); c.add(new JScrollPane(jtable)); /* * 用户交换数据的表现层 */ JPanel jpl2=new JPanel(); JLabel jlb1=new JLabel("姓名"); jpl2.add(jlb1); final JTextField tfdName=new JTextField(10); jpl2.add(tfdName); JLabel jlb2=new JLabel("性别"); jpl2.add(jlb2); final JTextField tfdSex=new JTextField(10); jpl2.add(tfdSex); JLabel jlb3=new JLabel("电话"); jpl2.add(jlb3); final JTextField tfdTel=new JTextField(10); jpl2.add(tfdTel); JLabel jlb4=new JLabel("地址"); jpl2.add(jlb4); final JTextField tfdAddr=new JTextField(10); jpl2.add(tfdAddr); /* * 按钮---实现逻辑层功能 */ //按钮---添加 JButton btnAdd=new JButton("添加"); jpl2.add(btnAdd); btnAdd.setActionCommand("add"); btnAdd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("add")){ //1、收集数据 //2、组织数据 String name=tfdName.getText(); String sex=tfdSex.getText(); String tell=tfdTel.getText(); String addr=tfdAddr.getText(); //3、调用数据层 boolean boo=dao.addContact(name,sex,tell,addr); //4、根据调用结果返回不同结果页面 if(boo){ //回显---从数据库中读出所有信息添加到表格中 Vector<Vector<Object>> dataVector =dao.getAllContacts(); dtm.setDataVector(dataVector, columnNames); jtable.removeColumn(jtable.getColumn("ID")); }else{ JOptionPane.showMessageDialog(ContactWin.this, "此联系人已经存在"); } } } }); //按钮---删除 JButton btnDel=new JButton("删除"); jpl2.add(btnDel); btnDel.setActionCommand("del"); btnDel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int num=jtable.getSelectedRow(); if(num==-1){ JOptionPane.showMessageDialog(ContactWin.this, "请选择要删除的一行表格数据"); return; } //Object getValueAt(int row, int column) 返回 row 和 column 处单元格的属性值。 String id=(String) dtm.getValueAt(num, 0); String name=(String) dtm.getValueAt(num, 1); boolean boo=dao.delContact(id); if(boo){ dtm.setDataVector(dao.getAllContacts(), columnNames); JOptionPane.showMessageDialog(ContactWin.this, "联系人"+name+"已经删除成功!"); return; }else{ JOptionPane.showMessageDialog(ContactWin.this, "联系人"+name+"删除失败!"); return; } } }); //按钮---修改 JButton btnUpDate=new JButton("修改"); jpl2.add(btnUpDate); btnUpDate.setActionCommand("update"); btnUpDate.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int num=jtable.getSelectedRow(); if(num==-1){ JOptionPane.showMessageDialog(ContactWin.this, "请选择要修改的一行表格数据"); return; } String id=(String) dtm.getValueAt(num, 0); //直接读取对应编辑框中的内容作为修改的值 String name=tfdName.getText(); String sex=tfdSex.getText(); String tell=tfdTel.getText(); String addr=tfdAddr.getText(); boolean boo=dao.upDateContact(id,name,sex,tell,addr); if(boo){ dtm.setDataVector(dao.getAllContacts(), columnNames); JOptionPane.showMessageDialog(ContactWin.this, "联系人修改成功"); return; }else{ JOptionPane.showMessageDialog(ContactWin.this, "联系人修改失败"); return; } } }); //按钮---查询 JButton btnQuery=new JButton("查询"); jpl2.add(btnQuery); btnQuery.setActionCommand("query"); btnQuery.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("查询"); } }); c.add(jpl2,BorderLayout.SOUTH); setVisible(true); } public static void main(String[] args) { new ContactWin(dao); }}
(2)DAO层:
(2-1)接口:
ContactDAO:
package cn.hncu.contact.dao;import java.util.Vector;public interface ContactDAO { public boolean login(String name,String pwd); public boolean reg(String name,String pwd); public Vector<Vector<Object>> getAllContacts(); public boolean addContact(String name, String sex, String tell, String addr); public boolean delContact(String id); public boolean upDateContact(String id, String name, String sex, String tell, String addr);}
(2-2)工厂:
ContactDAOfactory:
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(); }}
(2-3)实现类:
ContactDAOImpl:
package cn.hncu.contact.dao.impl;import java.util.List;import java.util.Vector;import org.dom4j.Document;import org.dom4j.Element;import cn.hncu.contact.commons.DocumentFactory;import cn.hncu.contact.dao.ContactDAO;import cn.hncu.contact.utils.PwdUtils;import cn.hncu.contact.utils.UUIDUtils;public class ContactDAOImpl implements ContactDAO{ private Document dom=DocumentFactory.getDom(); private Element eCurrentUser=null; /** * 登录某一个用户 */ @Override public boolean login(String name, String pwd) { //1、收集数据 //2、组织数据对密码进行MD5加密 String newPwd=PwdUtils.mkMD5Pwd(pwd); //3、调用逻辑层 Element root=dom.getRootElement(); Element euser=(Element) root.selectSingleNode("/contacts/user[@name='"+name+"'][@pwd='"+newPwd+"']");// Element euser =root.element("user"); if(euser!=null){ /* * 将当前登录的用户元素记录下来,以供下次调用用户管理界面使用 */ eCurrentUser=euser; return true; } return false; } /** * 用户注册 */ @Override public boolean reg(String name, String pwd) { //1、收集参数 //2、组织参数 //判断此注册用户是否已经存在::: Element root=dom.getRootElement(); List<Element>list=root.elements("user"); for(Element e:list){ if(name.equals(e.attribute("name"))){ return false; } } String newPwd=PwdUtils.mkMD5Pwd(pwd); Element user=root.addElement("user"); user.addAttribute("name", name); user.addAttribute("pwd", newPwd); //保存修改后的DOM树 DocumentFactory.save(); return true; } /** * 获得所有的联系人 */ @Override public Vector<Vector<Object>> getAllContacts() { Vector<Vector<Object>> vv=new Vector<Vector<Object>>(); List<Element> list=eCurrentUser.elements("contact"); for(Element e:list){ Vector<Object> v=new Vector<Object>(); v.add(e.attribute("id").getText()); v.add(e.elementText("name")); v.add(e.elementText("sex")); v.add(e.elementText("tell")); v.add(e.elementText("addr")); vv.add(v); } return vv; } /** * 添加某一个联系人 */ @Override public boolean addContact(String name, String sex, String tell, String addr) { List<Element> list=eCurrentUser.elements("contact"); //需要判断下联系人是否已经存在 for(Element e:list){ if(name.equals(e.elementText("name"))){ return false; } } String id=UUIDUtils.getID(); Element eContact=eCurrentUser.addElement("contact").addAttribute("id", id); eContact.addElement("name").setText(name); eContact.addElement("sex").setText(sex); eContact.addElement("tell").setText(tell); eContact.addElement("addr").setText(addr); //保存修改后的DOM树 DocumentFactory.save(); return true; } /** * 删除一个联系人 */ @Override public boolean delContact(String id) { //利用XPath直接找到要删除的联系人 Element contact=(Element) eCurrentUser.selectSingleNode("//contact[@id='"+id+"']"); boolean boo=contact.getParent().remove(contact); if(boo){ DocumentFactory.save(); } return boo; } /** * 更新一个联系人 */ @Override public boolean upDateContact(String id, String name, String sex, String tell, String addr) { Element contact=(Element) eCurrentUser.selectSingleNode("//contact[@id='"+id+"']"); contact.element("name").setText(name); contact.element("sex").setText(sex); contact.element("tell").setText(tell); contact.element("addr").setText(addr); DocumentFactory.save(); return true; }}
(3)公共数据层:
DocumentFactory:
package cn.hncu.contact.commons;import java.io.File;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.IOException;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class DocumentFactory { private static File file = null; private static Document dom = null; private DocumentFactory() { } /** * * @return 获得DOM树 */ public static Document getDom() { try { file = new File("./xml/contacts.xml"); SAXReader sax = new SAXReader(); dom = sax.read(file); } catch (DocumentException e) { throw new RuntimeException("xml数据库读取异常"); } return dom; } /** * 保存修改后的DOM树 */ public static void save() { try { XMLWriter xw=new XMLWriter(new FileOutputStream(file), OutputFormat.createPrettyPrint()); xw.write(dom); xw.close(); } catch (IOException e) { throw new RuntimeException("数据库写入失败"); } }}
(4)工具层:
PwdUtils:
package cn.hncu.contact.utils;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class PwdUtils { public PwdUtils(){ } public static String mkMD5Pwd(String pwd){ String newPwd=""; MessageDigest md; try { md = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { throw new RuntimeException("加密失败"); } byte[] b=md.digest(pwd.getBytes()); /* * 对b字节数组进一步处理转换成16进制 */ for(byte i:b){ String s=Integer.toHexString(i&0xFF); if(s.length()==1){ s="0"+s; } newPwd+=s; } newPwd=newPwd.toUpperCase(); return newPwd; }}
UUIDUtils:
package cn.hncu.contact.utils;import java.util.UUID;public class UUIDUtils { private UUIDUtils(){ } public static String getID(){ return UUID.randomUUID().toString().replace("-", ""); }}
结果:
阅读全文
0 0
- 【XML解析】(6)利用XML+DOM4j+Xpath+MD5加密+图形界面(Jtabe+Vector)实现《通讯录管理系统》
- 通讯录系统(控制台+dom4j+xPath+xml)
- 【XML解析】(3)利用DOM解析技术在XML文档下实现一个《通讯录管理系统》
- DOM4J+XPath 解析XML
- Dom4j解析XML文件(Xpath)
- xml解析dom4j xpath方式
- dom4j使用XPath解析xml
- xpath和dom4j解析xml
- 利用DOM4J开发包 进行XML解析和Xpath
- xml解析--通讯管理系统(图形界面版)
- 利用dom4j解析XML
- 利用dom4j解析xml
- 利用dom4j解析xml
- 利用Dom4j+xpath读取XML文档
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- 关于一个简单的mysql存储过程实例
- 试用版SQL Server 2008 R2 提示评估期已过
- Java实现-买卖股票的最佳时机1
- ubuntu/centos 搭建 搭建 redis 集群
- Windows下C/C++获取当前系统时间
- 【XML解析】(6)利用XML+DOM4j+Xpath+MD5加密+图形界面(Jtabe+Vector)实现《通讯录管理系统》
- luogu P1387 最大正方形
- python之nltk基础用法
- JavaScript之Set和Map数据结构
- CentOS 7 中使用 Sendmail 通过 PHP 发送邮件
- cocos-js 常用API
- jsp页面中的代码执行加载顺序介绍
- 如何在C++中将filetime时间转化为字符串?
- 滑动鼠标改变背景色