首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java Web 檔案上傳解析入庫全流程:從 JSP 頁面到資料庫存儲

     編輯:程式設計疑難解答

業務流程概覽

  1. 前端(JSP):提供 `` 表單,`enctype="multipart/form-data"`。
  2. 控制器:接收上傳檔案,解析內容(txt/CSV/Excel/Word),提取使用者名稱/密碼欄位。
  3. 服務層:資料驗證、加密密碼、批次寫入資料庫。
  4. 前端展示:查詢資料庫,以表格/分頁呈現。

關鍵技術點與代碼骨架

1. JSP 上傳表單

<form action="uploadServlet" method="post" enctype="multipart/form-data">
  <input type="file" name="userFile" accept=".txt,.csv,.xls,.xlsx" />
  <button type="submit">上傳解析入庫</button>
</form>

2. Servlet 接收檔案(推薦 Apache Commons FileUpload 或 Servlet 3.0+ `getPart`)

@WebServlet("/uploadServlet")
@MultipartConfig(maxFileSize = 1024*1024*10) // 10MB
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Part filePart = req.getPart("userFile");
        String fileName = filePart.getSubmittedFileName();
        InputStream is = filePart.getInputStream();

        // 根據副檔名分派解析器
        List<User> users = parseFile(is, fileName);

        // 入庫
        userService.batchInsert(users);

        // 重導向至列表頁
        resp.sendRedirect("list.jsp");
    }
}

3. 多格式檔案解析策略

格式解析庫核心 API
TXT/CSVOpenCSV / 自寫 `BufferedReader``CSVParser.parse()` / `readLine().split(",")`
Excel (.xls)Apache POI HSSF`HSSFWorkbook`, `Sheet`, `Row`, `Cell`
Excel (.xlsx)Apache POI XSSF`XSSFWorkbook` (同上介面)
Word (.docx)Apache POI XWPF`XWPFDocument`, `XWPFTable` 提取表格

4. 統一解析介面範例

public interface FileParser {
    List<User> parse(InputStream is) throws IOException;
}

@Component
public class CsvParser implements FileParser {
    public List<User> parse(InputStream is) {
        try (CSVReader reader = new CSVReader(new InputStreamReader(is, "UTF-8"))) {
            String[] header = reader.readNext(); // 假設第一行表頭
            List<User> list = new ArrayList<>();
            String[] line;
            while ((line = reader.readNext()) != null) {
                User u = new User();
                u.setUsername(line[0]);
                u.setPassword(passwordEncoder.encode(line[1])); // 必須加密存儲
                list.add(u);
            }
            return list;
        }
    }
}

5. 服務層批次入庫(JdbcTemplate / MyBatis / JPA)

@Transactional
public void batchInsert(List<User> users) {
    String sql = "INSERT INTO sys_user(username, password, create_time) VALUES (?, ?, NOW())";
    jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
        public void setValues(PreparedStatement ps, int i) throws SQLException {
            ps.setString(1, users.get(i).getUsername());
            ps.setString(2, users.get(i).getPassword());
        }
        public int getBatchSize() { return users.size(); }
    });
}

6. 前端列表頁(JSP + JSTL)

<table>
  <c:forEach items="${userList}" var="u">
    <tr><td>${u.username}</td><td>******</td></tr> <!-- 密碼不顯示明文 -->
  </c:forEach>
</table>

安全與健壯性清單

  • ✅ 檔案大小/類型限制(前後端雙重校驗)。
  • ✅ 密碼必須加密存儲(BCrypt/Argon2/PBKDF2),嚴禁明文。
  • ✅ 解析異常捕獲、記錄日誌、回饋使用者具體錯誤行。
  • ✅ 防止重複提交(Token/冪等鍵)。
  • ✅ 大檔案採用流式解析(POI SXSSF / OpenCSV 串流),避免 OOM。
  • ✅ 上傳目錄權限最小化,定期清理暫存檔。

總結

「上傳 → 解析 → 入庫 → 展示」是 Java Web 經典場景。關鍵在於:多格式解析策略封裝、密碼加密、批次寫入優化、異常處理完備。新手建議先跑通 TXT/CSV → 再擴展 Excel/Word,循序漸進掌握各解析庫 API。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved