首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

相冊管理系統實戰:Java Servlet + XML 數據存儲 + 文件上傳下載

     編輯:Java 相關知識

專案功能

  • 圖片上傳(支援多文件、描述)。
  • 相冊瀏覽(縮略圖、大圖查看)。
  • 圖片下載(Content-Disposition)。
  • 圖片刪除(僅限上傳者 IP)。

技術棧

  • Servlet / JSP
  • Commons FileUpload + Commons IO(文件上傳)
  • Dom4j + Jaxen(XML 解析、XPath)
  • Hash 目錄分散(優化文件系統性能)

核心模塊代碼

1. 工具類

// MyUtils:UUID、日期格式化、Hash 目錄生成
public static String getDir(String uuid) {
    String dir1 = Integer.toHexString(uuid.hashCode() & 0xf);
    String dir2 = Integer.toHexString((uuid.hashCode() & 0xf0) >> 4);
    return "/" + dir1 + "/" + dir2; // 如 /a/3/
}

// Dom4jFactory:單例管理 Document,支援讀寫
static {
    SAXReader sax = new SAXReader();
    String path = Dom4jFactory.class.getClassLoader().getResource("photos.xml").getPath();
    dom = sax.read(new FileInputStream(path));
}
public static boolean save() { /* XMLWriter 寫回磁盤 */ }

2. 值對象 PhotoModel

private String uuid, realName, ext, dir, dateTime, ip, desc;
// getter/setter/toString

3. DAO 層

// PhotoDao 介面
boolean save(PhotoModel photo);
List<PhotoModel> getAll();
PhotoModel getSingleById(String id);
boolean del(String id);

// PhotoDaoImpl:Dom4j 操作 XML
public boolean save(PhotoModel photo) {
    Element root = dom.getRootElement();
    Element e = root.addElement("photo");
    e.addAttribute("uuid", photo.getUuid());
    // ... 其他屬性
    e.addElement("desc").setText(photo.getDesc());
    return Dom4jFactory.save();
}

4. Servlet 控制器

  • UploadServlet:解析 multipart 請求 → 封裝 PhotoModel → 寫 XML → 保存文件到 Hash 目錄。
  • ShowServlet:讀取所有記錄 → 生成 HTML 表格展示圖片、描述、操作鏈接。
  • DownServlet:設置 Content-Disposition: attachment → 輸出文件流,處理中文文件名編碼(IE/Firefox 兼容)。
  • DelServlet:驗證 IP → 刪除 XML 節點 → 刪除物理文件 → 重定向列表頁。

關鍵技術點

部署與運行

  1. 導入依賴 JAR:commons-fileupload、commons-io、dom4j、jaxen。
  2. 配置 web.xml 映射 Servlet。
  3. 將 photos.xml 放入 src 目錄(編譯到 classes 根路徑)。
  4. 啟動 Tomcat 訪問 index.jsp。

擴展建議

  • 引入資料庫(MySQL)替換 XML,支援併發與大數據量。
  • 整合 Spring + MyBatis,分層解耦。
  • 增加圖片壓縮、水印、格式轉換功能。
  • 引入 Redis 緩存熱門相冊數據。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
技術點實現要點
文件上傳ServletFileUpload.parseRequest,FileItem.isFormField() 區分普通欄位與文件
大文件/臨時目錄DiskFileItemFactory.setRepository(tempDir)
目錄分散UUID hashCode 取低 8 位,分兩級 16 進制目錄,避免單目錄文件過多
XML 存儲Dom4j 操作簡單,適合小數據量;大數據量建議遷移資料庫
下載中文名User-Agent 判斷瀏覽器,Firefox 用 ISO-8859-1,其他用 URLEncoder