// src/main/java/com/example/diary/servlet/DiaryServlet.java
package com.example.diary.servlet;
import com.example.diary.dao.DiaryDao;
import com.example.diary.model.Diary;
import com.example.diary.util.JsonUtil;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
@WebServlet("/api/diaries/*")
public class DiaryServlet extends HttpServlet {
private DiaryDao diaryDao;
private Gson gson;
@Override
public void init() throws ServletException {
super.init();
diaryDao = new DiaryDao();
gson = new Gson();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String pathInfo = req.getPathInfo();
if (pathInfo == null || pathInfo.equals("/")) {
// 获取日记列表
int page = req.getParameter("page") != null ? Integer.parseInt(req.getParameter("page")) : 1;
int size = req.getParameter("size") != null ? Integer.parseInt(req.getParameter("size")) : 10;
String searchType = req.getParameter("searchType") != null ? req.getParameter("searchType") : "title";
String searchQuery = req.getParameter("searchQuery") != null ? req.getParameter("searchQuery") : "";
try {
List<Diary> diaries = diaryDao.getAllDiaries(page, size, searchType, searchQuery);
int total = diaryDao.getTotalCount(searchType, searchQuery);
JsonObject responseJson = new JsonObject();
responseJson.add("list", gson.toJsonTree(diaries));
responseJson.addProperty("total", total);
sendJsonResponse(resp, responseJson.toString());
} catch (SQLException e) {
sendErrorResponse(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Database error");
}
} else {
// 获取单个日记
String[] splits = pathInfo.split("/");
if (splits.length != 2) {
sendErrorResponse(resp, HttpServletResponse.SC_BAD_REQUEST, "Invalid URL");
return;
}
String diaryId = splits[1];
try {
Diary diary = diaryDao.getDiaryById(Integer.parseInt(diaryId));
if (diary != null) {
sendJsonResponse(resp, gson.toJson(diary));
} else {
sendErrorResponse(resp, HttpServletResponse.SC_NOT_FOUND, "Diary not found");
}
} catch (NumberFormatException e) {
sendErrorResponse(resp, HttpServletResponse.SC_BAD_REQUEST, "Invalid diary ID");
} catch (SQLException e) {
sendErrorResponse(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Database error");
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
Diary diary = JsonUtil.parseJsonRequest(req, Diary.class);
diary.setCreateTime(new Date());
diary.setUpdateTime(new Date());
int id = diaryDao.createDiary(diary);
diary.setId(id);
resp.setStatus(HttpServletResponse.SC_CREATED);
sendJsonResponse(resp, gson.toJson(diary));
} catch (Exception e) {
sendErrorResponse(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error creating diary");
}
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String pathInfo = req.getPathInfo();
if (pathInfo == null || pathInfo.equals("/")) {
sendErrorResponse(resp, HttpServletResponse.SC_BAD_REQUEST, "Missing diary ID");
return;
}
String[] splits = pathInfo.split("/");
if (splits.length != 2) {
sendErrorResponse(resp, HttpServletResponse.SC_BAD_REQUEST, "Invalid URL");
return;
}
String diaryId = splits[1];
try {
Diary existingDiary = diaryDao.getDiaryById(Integer.parseInt(diaryId));
if (existingDiary == null) {
sendErrorResponse(resp, HttpServletResponse.SC_NOT_FOUND, "Diary not found");
return;
}
Diary diary = JsonUtil.parseJsonRequest(req, Diary.class);
diary.setId(Integer.parseInt(diaryId));
diary.setCreateTime(existingDiary.getCreateTime());
diary.setUpdateTime(new Date());
boolean updated = diaryDao.updateDiary(diary);
if (updated) {
sendJsonResponse(resp, gson.toJson(diary));
} else {
sendErrorResponse(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Failed to update diary");
}
} catch (NumberFormatException e) {
sendErrorResponse(resp, HttpServletResponse.SC_BAD_REQUEST, "Invalid diary ID");
} catch (SQLException e) {
sendErrorResponse(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Database error");
}
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String pathInfo = req.getPathInfo();
if (pathInfo == null || pathInfo.equals("/")) {
sendErrorResponse(resp, HttpServletResponse.SC_BAD_REQUEST, "Missing diary ID");
return;
}
String[] splits = pathInfo.split("/");
if (splits.length != 2) {
sendErrorResponse(resp, HttpServletResponse.SC_BAD_REQUEST, "Invalid URL");
return;
}
String diaryId = splits[1];
try {
boolean deleted = diaryDao.deleteDiary(Integer.parseInt(diaryId));
if (deleted) {
resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
} else {
sendErrorResponse(resp, HttpServletResponse.SC_NOT_FOUND, "Diary not found");
}
} catch (NumberFormatException e) {
sendErrorResponse(resp, HttpServletResponse.SC_BAD_REQUEST, "Invalid diary ID");
} catch (SQLException e) {
sendErrorResponse(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Database error");
}
}
private void sendJsonResponse(HttpServletResponse resp, String json) throws IOException {
resp.setContentType("application/json");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.print(json);
out.flush();
}
private void sendErrorResponse(HttpServletResponse resp, int statusCode, String message) throws IOException {
resp.setStatus(statusCode);
resp.setContentType("application/json");
resp.setCharacterEncoding("UTF-8");
JsonObject errorResponse = new JsonObject();
errorResponse.addProperty("error", message);
PrintWriter out = resp.getWriter();
out.print(gson.toJson(errorResponse));
out.flush();
}
}