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

Servlet 3.1:POST 請求無法進入 doGet,必須實作 doPost

     編輯:程式設計綜合問答

現象

  • 表單 method="get" → 正常進入 doGet,輸出正常。
  • 表單 method="post" → 頁面跳轉到 Servlet,但 System.out.println 無輸出,邏輯未執行。

原因

HttpServlet 預設:

  • doGet 處理 GET 請求
  • doPost 處理 POST 請求
  • **兩者互不調用**,若未覆寫對應方法,父類會回傳 HTTP 405 (Method Not Allowed) 或空白響應。

解決方案

方案一:覆寫 doPost 並轉發給 doGet(常見模式)

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String name = req.getParameter("username");
        System.out.println("servlet---" + name);
        // 共同業務邏輯
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);  // 統一入口
    }
}

方案二:分別實作 doGet/doPost(邏輯不同)

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
    // POST 專屬邏輯:如修改資料、上傳檔案
    String name = req.getParameter("username");
    // ...
}

最佳實踐

  • **查詢/安全冪等操作用 GET**,**修改/非冪等用 POST**。
  • 若邏輯完全相同,doPost 调用 doGet 是標準寫法。
  • 記得在 web.xml 或 @WebServlet 正確映射 URL。

常見坑

  • 以為 service() 會自動分派——它確實會,但前提是你**覆寫了對應的 doXxx 方法**。
  • POST 表單缺少 enctype="multipart/form-data" 導致檔案上傳失敗(另一問題)。

總結

POST 請求**必須覆寫 doPost**,否則 Servlet 容器不會執行你的業務代碼。最簡單做法:doPost 调用 doGet 統一處理。

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