| 原因 | 檢查重點 | 解決方式 |
|---|---|---|
表單 action 與 Servlet 映射不符 | <form action="/xxx"> vs @WebServlet("/yyy") 或 web.xml url-pattern | 確保完全一致,包含大小寫與前導斜線 |
輸入框缺少 name 屬性 | <input type="text"> 無 name="username" | 補上 name,getParameter("username") 才能取值 |
| GET/POST 方法不匹配 | form method="POST" 但 Servlet 僅覆寫 doGet | 覆寫 doPost 或統一用 doGet,或改用 service |
| 編碼導致中文亂碼/空值 | POST 請求未設 request.setCharacterEncoding("UTF-8") | 在讀取參數**第一行**設定編碼 |
使用了 enctype="multipart/form-data" | 檔案上傳表單,一般 getParameter 失效 | 用 Part / Commons FileUpload / ServletFileUpload 解析 |
| 轉發/重導向丟失參數 | RequestDispatcher.forward 後參數仍在;sendRedirect 參數丟失 | 重導向需手動帶參數或用 Session 傳遞 |
<%@ page contentType="text/html;charset=UTF-8" %>
<form action="process" method="POST">
用戶名:<input type="text" name="username" /><br/>
密碼:<input type="password" name="pwd" /><br/>
<input type="submit" value="送出" />
</form>
@WebServlet("/process")
public class ProcessServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8"); // 必須在 getParameter 前
String username = req.getParameter("username");
String pwd = req.getParameter("pwd");
System.out.println("username=" + username + ", pwd=" + pwd);
// 後續邏輯...
}
}
<servlet>
<servlet-name>ProcessServlet</servlet-name>
<servlet-class>com.example.ProcessServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ProcessServlet</servlet-name>
<url-pattern>/process</url-pattern>
</servlet-mapping>
req.getParameterMap() 確認伺服器端實際收到什麼。catalina.out 是否有錯誤堆疊。request.getParameter 為空 90% 是 **表單 action 與 Servlet 映射不符** 或 **輸入框缺 name 屬性**。對照上表逐項排查即可快速定位。