小小相册

来源:互联网 发布:linux eclipse 下载 编辑:程序博客网 时间:2024/05/03 09:56

整个小项目是基于Tomcat服务器上运行
涉及到的功能:上传照片,查看已上传的照片,删除照片(只有ip地址相同的才能删除–权限问题),大图展示(点击图片即可查看大图),下载到本地硬盘

所涉及到的知识点:上传文件,servlet的熟练掌握,架构分析和设计
(写代码时记得导入相应的jar包)

基本架构设计:分层:
1)前端jsp页面(主页面,上传文件页面)
2)后台表现层–值对象(domain)
3)后台逻辑层–在这里把servlet看成逻辑层
4)后台dao(数据访问对象)层–dao
5)工具类:数据库文档对象(xml)的获得和保存,uuid的随机生成,日期格式的转换,打散目录的生成

代码实现:
前端jsp页面
主页

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>相册管理页面</title>  </head>  <body>    <a href="<%=request.getContextPath()%>/jsps/upload.jsp">上传您的照片</a><br/>    <a href="<%=request.getContextPath() %>/servlet/ShowServlet">查看照片库</a>  </body></html>

上传页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>上传照片页面</title>  </head>  <body>    <form action="<%=request.getContextPath() %>/servlet/UploadServlet" method="post" enctype="multipart/form-data">        上传照片:<input type="file" name="file" /><!-- 上传文件的 --><br/>        照片信息:<input type="text" name="desc" /><!-- 描文件内容的 --><br/>        <input type="submit" value="上传" /><br/>    </form>  </body></html>

后台分层
值对象domain层

package cn.hncu.domain;//值对象---用来对照片信息进行封装public class PhotoModel {    private String id;//uuid--相当于数据库中的key值    private String realName;//文件的真实名字---相当于数据库中的value值    private String dateTime;//获得当前用户上传的时间    private String ext;//文件名的扩展名    private String dir;//获得文件保存时打散目录    private String ip;//获得上传者的ip地址    private String desc;//获得照片的说明信息    /**     * @return the id     */    public String getId() {        return id;    }    /**     * @param id the id to set     */    public void setId(String id) {        this.id = id;    }    /**     * @return the realName     */    public String getRealName() {        return realName;    }    /**     * @param realName the realName to set     */    public void setRealName(String realName) {        this.realName = realName;    }    /**     * @return the dataTime     */    public String getDateTime() {        return dateTime;    }    /**     * @param dataTime the dataTime to set     */    public void setDateTime(String dataTime) {        this.dateTime = dataTime;    }    /**     * @return the ext     */    public String getExt() {        return ext;    }    /**     * @param ext the ext to set     */    public void setExt(String ext) {        this.ext = ext;    }    /**     * @return the dir     */    public String getDir() {        return dir;    }    /**     * @param dir the dir to set     */    public void setDir(String dir) {        this.dir = dir;    }    /**     * @return the ip     */    public String getIp() {        return ip;    }    /**     * @param ip the ip to set     */    public void setIp(String ip) {        this.ip = ip;    }    /**     * @return the desc     */    public String getDesc() {        return desc;    }    /**     * @param desc the desc to set     */    public void setDesc(String desc) {        this.desc = desc;    }    /* (non-Javadoc)     * @see java.lang.Object#toString()     */    @Override    public String toString() {        return "PhotoModel [id=" + id + ", realName=" + realName                + ", dateTime=" + dateTime + ", ext=" + ext + ", dir=" + dir                + ", ip=" + ip + ", desc=" + desc + "]";    }}

servlet逻辑业务层
上传模块

package cn.hncu.servlet;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.util.List;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.apache.commons.io.FileUtils;import com.sun.org.apache.xml.internal.serializer.utils.Utils;import cn.hncu.dao.PhotoDAO;import cn.hncu.dao.PhotoDAOFactory;import cn.hncu.domain.PhotoModel;import cn.hncu.myUtils.MyUtils;public class UploadServlet extends HttpServlet {    private String charset;    private PhotoModel model = new PhotoModel();    @Override    public void init(ServletConfig config) throws ServletException {        charset = config.getInitParameter("charset");        super.init(config);    }    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>提交方式错误</TITLE></HEAD>");        out.println("  <BODY>");        out.println("照片上传不支持GET方式");        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        request.setCharacterEncoding(charset);        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        //文件上传        File file = new File("d:/a");//用来存放临时文件的地方        DiskFileItemFactory f = new DiskFileItemFactory(1024*8,file);//每次上传文件大小        ServletFileUpload upload = new ServletFileUpload(f);//真正的上传工具        upload.setFileSizeMax(1024*1024*5);//设置单个文件上传的最大值为5M        upload.setSizeMax(1024*1024*8);//设置一次性上传所有文件的大小不超过8M        //为什么这里又设置了一次编码!!!!        //upload.setHeaderEncoding("utf-8");//等价于: request.setCharacterEncoding("utf-8");        FileItem item2 = null;        //使用解析工具解析        try {            List<FileItem> fileItem = upload.parseRequest(request);//解析出来的是一些普通表达组件还是文件上传的表单组件            InputStream in = null;            //进行遍历            for(FileItem item:fileItem){                item2 = item;                //判断表单组件的类型---是不是普通表单组件(因为普通表单组件的编码格式要另外设置)                if(item.isFormField()){//是普通表单组件                    String desc = item.getString(charset);//拿到普通表单组件及编辑框文本内容解决其乱码问题(文件描述内容)                    //#1--第一个参数的收集(普通表单组件的内容存在则在这里进行收集)                    model.setDesc(desc);                    //System.out.println("文件说明:"+desc);                }else{//非普通表单组件                    in = item.getInputStream();//拿到输入流                    //▲2防护: 过滤掉没有选择文件的 空文件组件===虽然在这里只有一个上传照片的地方                    //item.getSize();   ---返回当前文件的大小                    if(item.getSize()==0){                        continue;                    }                    //接下来要做的是拿到文件名字--通过uuid生成的新文件名                    //#2--第二个参数的收集:真实的文件名字                    String realName = item.getName();                    if(realName==null || "".equals(realName.trim())){//预防用户没有进行选择上传的文件导致文件名为null                        out.println("您没有选择需要上传的照片!请返回重新选择...");                        return;                    }                    //#3--第三个参数--文件扩展名                    String ext = realName.substring(realName.lastIndexOf("."));                    //System.out.println("文件扩展名:"+ext);                    model.setExt(ext);                    //System.out.println("真实文件名字:"+realName);                    realName = realName.substring(realName.lastIndexOf("\\")+1, realName.lastIndexOf("."));                    //System.out.println("真实文件名字:"+realName);                    model.setRealName(realName);                    //=====收集参数时要注意!我们只收集我们能够从已知条件上收集到的参数,另外的自己进行补充                    //需要补充的参数:id,dateTime,dir,ip                    //#4--收集的第四个参数--随机生成的uuid                    String id = MyUtils.getUuid();                    model.setId(id);                    //#5--收集的第五个参数--拿到当前的时间                    String dateTime = MyUtils.getFormateDate();                    model.setDateTime(dateTime);                    //#6--收集的第六个参数--拿到随机生成的打散目录                    String dir = MyUtils.getDir(model.getId());                    model.setDir(dir);                    //#7--收集的第七个参数--拿到上传者的ip地址                    String ip = request.getRemoteAddr();                    model.setIp(ip);                    //以上收集到所有的参数并进行封装操作                }            }            //通过以上七步:完成model值对象的封装,下面进行调用dao层进行存储            //※1※--把照片文件存储到xml文档中            PhotoDAO dao = PhotoDAOFactory.getPhotoDAO();            boolean boo = dao.save(model);            //※2※  把照片文件存储到硬盘            if(boo){//如果存储成功                //把照片存储到项目根目录下的"photos"文件夹中"(以打散目录的方式进行存储)                //首选找到项目根目录下                String path = getServletContext().getRealPath("/photos");//带盘符的绝对路径                path = path+"/"+model.getDir();//细致到打散目录下                File dir = new File(path);                if(!dir.exists()){                    dir.mkdirs();//如果不存在该文件夹,则利用程序自动生成                }                //在服务器硬盘中的完整文件名(含盘符的绝对路径及文件名): path+"/"+uuid+ext                String fileName = path+"/"+model.getId()+model.getExt();                FileUtils.copyInputStreamToFile(in, new File(fileName));                out.println("照片上传成功...");                //out.println("<a href='"+request.getContextPath()+"/servlet/UploadServlet'>返回文件上传页面</a>");            }else{                out.println("文件信息无法保存到数据库,上传失败");            }        } catch (FileUploadException e) {            e.printStackTrace();        }        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }}

查看功能模块

package cn.hncu.servlet;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import cn.hncu.dao.PhotoDAO;import cn.hncu.dao.PhotoDAOFactory;import cn.hncu.domain.PhotoModel;public class ShowServlet extends HttpServlet {    private PhotoDAO dao = PhotoDAOFactory.getPhotoDAO();//注入dao    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>相册浏览</TITLE></HEAD>");        out.println("  <BODY>");        String str = "<table border='1' width='100%'>"+                        "<tr><th>文件名</th> <th>上传时间</th> <th>上传者IP地址</th> <th>照片(点击照片即可查看大图)</th>" +                        "<th>照片详细信息</th> <th>操作</th>";        out.println(str);        //从dao层把所有照片读取出来,发送到前端页面显示        PhotoModel model = new PhotoModel();        List<PhotoModel> list = dao.getAllPhotos();//拿到所有的PhotoModel对象        //进行遍历操作输出到前端页面显示        for(PhotoModel photo:list){            out.println("<tr>");            //不知道为什么我们拿到的真实文件名是带路径的,在这里我们要进行相应的处理            out.println("<td width='100'>"+photo.getRealName()+photo.getExt()+"</td>");//显示文件名            out.println("<td width='100'>"+photo.getDateTime()+"</td>");//显示上传时间            out.println("<td width='100'>"+photo.getIp()+"</td>");//显示上传者的IP地址            //显示照片            //照片所在服务器硬盘上的路径            String path = request.getContextPath()+"/photos/"+photo.getDir()+"/"+photo.getId()+photo.getExt();            //System.out.println("照片所在路径:"+path);            out.println("<td><a href='"+path+"'><img width='180' height='100' src='"+path+"'></a></td>");            //显示照片的详细信息            out.println("<td width='100'>"+photo.getDesc()+"</td>");            //显示对照片需要进行的操作            //删除和下载            String op = "<a href='/photoWeb/servlet/DelServlet?id="+photo.getId()+"'>删除</a>&nbsp;";            op = op+ "<a href='/photoWeb/servlet/DownServlet?id="+photo.getId()+"'>下载</a>&nbsp;";            out.println("<td width=100>"+op+"</td>");            out.println("</tr>");            System.out.println(photo.getDesc());        }        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //request.setCharacterEncoding("utf-8");//查看好像不需要设置编码格式        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        out.println("<h2>不支持POST方式查看</h2>");        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }}

删除功能模块

package cn.hncu.servlet;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import cn.hncu.dao.PhotoDAO;import cn.hncu.dao.PhotoDAOFactory;import cn.hncu.domain.PhotoModel;public class ShowServlet extends HttpServlet {    private PhotoDAO dao = PhotoDAOFactory.getPhotoDAO();//注入dao    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>相册浏览</TITLE></HEAD>");        out.println("  <BODY>");        String str = "<table border='1' width='100%'>"+                        "<tr><th>文件名</th> <th>上传时间</th> <th>上传者IP地址</th> <th>照片(点击照片即可查看大图)</th>" +                        "<th>照片详细信息</th> <th>操作</th>";        out.println(str);        //从dao层把所有照片读取出来,发送到前端页面显示        PhotoModel model = new PhotoModel();        List<PhotoModel> list = dao.getAllPhotos();//拿到所有的PhotoModel对象        //进行遍历操作输出到前端页面显示        for(PhotoModel photo:list){            out.println("<tr>");            //不知道为什么我们拿到的真实文件名是带路径的,在这里我们要进行相应的处理            out.println("<td width='100'>"+photo.getRealName()+photo.getExt()+"</td>");//显示文件名            out.println("<td width='100'>"+photo.getDateTime()+"</td>");//显示上传时间            out.println("<td width='100'>"+photo.getIp()+"</td>");//显示上传者的IP地址            //显示照片            //照片所在服务器硬盘上的路径            String path = request.getContextPath()+"/photos/"+photo.getDir()+"/"+photo.getId()+photo.getExt();            //System.out.println("照片所在路径:"+path);            out.println("<td><a href='"+path+"'><img width='180' height='100' src='"+path+"'></a></td>");            //显示照片的详细信息            out.println("<td width='100'>"+photo.getDesc()+"</td>");            //显示对照片需要进行的操作            //删除和下载            String op = "<a href='/photoWeb/servlet/DelServlet?id="+photo.getId()+"'>删除</a>&nbsp;";            op = op+ "<a href='/photoWeb/servlet/DownServlet?id="+photo.getId()+"'>下载</a>&nbsp;";            out.println("<td width=100>"+op+"</td>");            out.println("</tr>");            System.out.println(photo.getDesc());        }        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //request.setCharacterEncoding("utf-8");//查看好像不需要设置编码格式        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        out.println("<h2>不支持POST方式查看</h2>");        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }}

下载功能模块

package cn.hncu.servlet;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import cn.hncu.dao.PhotoDAO;import cn.hncu.dao.PhotoDAOFactory;import cn.hncu.domain.PhotoModel;public class ShowServlet extends HttpServlet {    private PhotoDAO dao = PhotoDAOFactory.getPhotoDAO();//注入dao    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>相册浏览</TITLE></HEAD>");        out.println("  <BODY>");        String str = "<table border='1' width='100%'>"+                        "<tr><th>文件名</th> <th>上传时间</th> <th>上传者IP地址</th> <th>照片(点击照片即可查看大图)</th>" +                        "<th>照片详细信息</th> <th>操作</th>";        out.println(str);        //从dao层把所有照片读取出来,发送到前端页面显示        PhotoModel model = new PhotoModel();        List<PhotoModel> list = dao.getAllPhotos();//拿到所有的PhotoModel对象        //进行遍历操作输出到前端页面显示        for(PhotoModel photo:list){            out.println("<tr>");            //不知道为什么我们拿到的真实文件名是带路径的,在这里我们要进行相应的处理            out.println("<td width='100'>"+photo.getRealName()+photo.getExt()+"</td>");//显示文件名            out.println("<td width='100'>"+photo.getDateTime()+"</td>");//显示上传时间            out.println("<td width='100'>"+photo.getIp()+"</td>");//显示上传者的IP地址            //显示照片            //照片所在服务器硬盘上的路径            String path = request.getContextPath()+"/photos/"+photo.getDir()+"/"+photo.getId()+photo.getExt();            //System.out.println("照片所在路径:"+path);            out.println("<td><a href='"+path+"'><img width='180' height='100' src='"+path+"'></a></td>");            //显示照片的详细信息            out.println("<td width='100'>"+photo.getDesc()+"</td>");            //显示对照片需要进行的操作            //删除和下载            String op = "<a href='/photoWeb/servlet/DelServlet?id="+photo.getId()+"'>删除</a>&nbsp;";            op = op+ "<a href='/photoWeb/servlet/DownServlet?id="+photo.getId()+"'>下载</a>&nbsp;";            out.println("<td width=100>"+op+"</td>");            out.println("</tr>");            System.out.println(photo.getDesc());        }        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //request.setCharacterEncoding("utf-8");//查看好像不需要设置编码格式        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        out.println("<h2>不支持POST方式查看</h2>");        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }}

dao层
接口

package cn.hncu.dao;import java.util.List;import cn.hncu.domain.PhotoModel;public interface PhotoDAO {    public abstract boolean save(PhotoModel model);    public abstract List<PhotoModel> getAllPhotos();    public abstract PhotoModel getSingleById(String id);    public abstract boolean del(String id);}

实现类

package cn.hncu.dao;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import org.dom4j.Document;import org.dom4j.Element;import cn.hncu.domain.PhotoModel;import cn.hncu.myUtils.DocumentFactory;public class PhotoDAOImpl implements PhotoDAO {    @Override    public boolean save(PhotoModel model) {        //保存        //首先拿到xml文档然后进行保存操作        Document dom = DocumentFactory.getDom();//拿到对象        Element eRoot = dom.getRootElement();//拿到根节点        //对根节点进行添加元素并给元素设置属性        Element ePhoto = eRoot.addElement("photo");        ePhoto.addAttribute("id", model.getId());        ePhoto.addAttribute("realName", model.getRealName());        ePhoto.addAttribute("dateTime", model.getDateTime());        ePhoto.addAttribute("ip", model.getIp());        ePhoto.addAttribute("ext", model.getExt());        ePhoto.addAttribute("dir", model.getDir());        ePhoto.addElement("desc").setText(model.getDesc());        return DocumentFactory.save();    }    @Override    public List<PhotoModel> getAllPhotos() {        // TODO Auto-generated method stub        List<PhotoModel> list = new ArrayList<PhotoModel>();        Document dom = DocumentFactory.getDom();//拿到xml文档对象        Element eRoot = dom.getRootElement();//拿到根节点        Iterator<Element> it = eRoot.elementIterator("photo");        while(it.hasNext()){            Element e = it.next();            PhotoModel model = new PhotoModel();            model.setId(e.attributeValue("id"));            model.setRealName(e.attributeValue("realName"));            model.setDateTime(e.attributeValue("dateTime"));            model.setExt(e.attributeValue("ext"));            model.setDir(e.attributeValue("dir"));            model.setIp(e.attributeValue("ip"));            model.setDesc(e.elementText("desc"));            list.add(model);        }        return list;    }    @Override    public PhotoModel getSingleById(String id) {        //用过调用getAllPhotos()在进行比对直接拿到        List<PhotoModel> list = getAllPhotos();        for(PhotoModel model:list){            if(model.getId().equals(id)){                return model;            }        }        return null;    }    @Override    public boolean del(String id) {        //对文档数据库进行删除操作---在这里用dom4j的技术进行处理        Document dom = DocumentFactory.getDom();//拿到xml数据库文档对象        Element e = (Element) dom.selectSingleNode("//photo[@id='"+id.trim()+"']");//通过xpath来找是否存在        return e.getParent().remove(e);//返回是否成功删除    }}

工厂类

package cn.hncu.dao;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import org.dom4j.Document;import org.dom4j.Element;import cn.hncu.domain.PhotoModel;import cn.hncu.myUtils.DocumentFactory;public class PhotoDAOImpl implements PhotoDAO {    @Override    public boolean save(PhotoModel model) {        //保存        //首先拿到xml文档然后进行保存操作        Document dom = DocumentFactory.getDom();//拿到对象        Element eRoot = dom.getRootElement();//拿到根节点        //对根节点进行添加元素并给元素设置属性        Element ePhoto = eRoot.addElement("photo");        ePhoto.addAttribute("id", model.getId());        ePhoto.addAttribute("realName", model.getRealName());        ePhoto.addAttribute("dateTime", model.getDateTime());        ePhoto.addAttribute("ip", model.getIp());        ePhoto.addAttribute("ext", model.getExt());        ePhoto.addAttribute("dir", model.getDir());        ePhoto.addElement("desc").setText(model.getDesc());        return DocumentFactory.save();    }    @Override    public List<PhotoModel> getAllPhotos() {        // TODO Auto-generated method stub        List<PhotoModel> list = new ArrayList<PhotoModel>();        Document dom = DocumentFactory.getDom();//拿到xml文档对象        Element eRoot = dom.getRootElement();//拿到根节点        Iterator<Element> it = eRoot.elementIterator("photo");        while(it.hasNext()){            Element e = it.next();            PhotoModel model = new PhotoModel();            model.setId(e.attributeValue("id"));            model.setRealName(e.attributeValue("realName"));            model.setDateTime(e.attributeValue("dateTime"));            model.setExt(e.attributeValue("ext"));            model.setDir(e.attributeValue("dir"));            model.setIp(e.attributeValue("ip"));            model.setDesc(e.elementText("desc"));            list.add(model);        }        return list;    }    @Override    public PhotoModel getSingleById(String id) {        //用过调用getAllPhotos()在进行比对直接拿到        List<PhotoModel> list = getAllPhotos();        for(PhotoModel model:list){            if(model.getId().equals(id)){                return model;            }        }        return null;    }    @Override    public boolean del(String id) {        //对文档数据库进行删除操作---在这里用dom4j的技术进行处理        Document dom = DocumentFactory.getDom();//拿到xml数据库文档对象        Element e = (Element) dom.selectSingleNode("//photo[@id='"+id.trim()+"']");//通过xpath来找是否存在        return e.getParent().remove(e);//返回是否成功删除    }}

工具类
xml文档数据库对象的获取和保存

package cn.hncu.myUtils;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;import sun.java2d.pipe.BufferedOpCodes;//获得数据库文档对象及对数据库文档对象进行保存的工具类public class DocumentFactory {    private static Document dom = null;    private static String filePath;    //申明静态,保证单例    static{        try {            SAXReader reader = new SAXReader();            filePath = DocumentFactory.class.getClassLoader().getResource("myPhoto.xml").getPath();            //System.out.println("xml文档路径通过类加载器拿到:"+filePath);            /*             * 这里有一个BUG(两种解决办法):             *      1)还有就是你用myEclipse新建的.xml文档他的默认编码格式为平台编码格式(GBK),我们将它另存为utf-8也可以解决这一bug             *      2)读取时用下面的io流指定编码格式也可以解决次BUG             */            //dom = reader.read(filePath);            //法二解决上述BUG问题            try {                dom = reader.read(new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"utf-8")));            } catch (UnsupportedEncodingException e) {                // TODO Auto-generated catch block                e.printStackTrace();            } catch (FileNotFoundException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        } catch (DocumentException e) {            System.out.println("文件读取时异常");            e.printStackTrace();        }    }    public static Document getDom(){        return dom;    }     //保存xml文档对象    public static boolean save(){        try {            XMLWriter w = new XMLWriter(new FileWriter(filePath));            w.write(dom);            w.close();            return true;//保存成功返回true        } catch (IOException e) {            System.out.println("IO异常");            e.printStackTrace();            //return false;//出异常返回false        }        return false;    }}

uuid的随机生成,日期时间格式的转换,打散目录的获取

package cn.hncu.myUtils;import java.text.SimpleDateFormat;import java.util.Date;import java.util.UUID;import org.junit.Test;//我的工具类--具体实现的功能有:1)随机生成uuid;2)把时间格式转换成项目需求;3)创建打散目录public class MyUtils {    //随机生成uuid    public static String getUuid(){        return UUID.randomUUID().toString().replace("-", "");    }    //把时间格式转换成项目需求//  @Test//  public void getFormateDate(){//      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//给定一个指定格式//      String str =  sdf.format(new Date());//      System.out.println(str);//  }    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//给定一个指定格式    public static String getFormateDate(){        return sdf.format(new Date());    }    //创建打散目录    public static String getDir(String uuid){        String dir1 = Integer.toHexString(uuid.hashCode()&0xf);        String dir2 = Integer.toHexString((uuid.hashCode()&0xf0)>>4);        return dir1+"/"+dir2;    }}
0 0