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

Servlet 入門完全指南:從環境搭建到登錄案例實戰

     編輯:Java 綜合教學

什麼是 Servlet?

Servlet (Server Applet) 是運行在 Web 容器(Tomcat/Jetty)中的 Java 類,遵循 javax.servlet.Servlet 規範。它接收 HTTP 請求,處理業務邏輯,生成動態響應。本質上是一個無 main 方法、由容器管理生命周期的特殊 Java 類。

Eclipse 快速創建 Servlet

  1. 新建 Dynamic Web Project,目標運行時選擇 Tomcat。
  2. 在 src 下新建包(如 com.example.servlet)。
  3. 右鍵包 → New → Servlet,類名 HelloWorldServlet,勾選 doGet/doPost,完成向導自動生成類並更新 web.xml。

核心代碼結構

package com.example.servlet;

import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;

public class HelloWorldServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp); // 統一委派給 doPost
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 設置編碼(防止中文亂碼)
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");

        // 2. 獲取參數
        String username = req.getParameter("userName");
        String password = req.getParameter("passWord");

        // 3. 業務邏輯(此處簡單演示)
        PrintWriter out = resp.getWriter();
        out.println("

登錄信息

"); out.println("用戶名: " + username + "
"); out.println("密碼: " + password); out.close(); } }

web.xml 映射配置 (Servlet 3.0+ 可用註解替代)

<servlet>
    <servlet-name>HelloWorldServlet</servlet-name>
    <servlet-class>com.example.servlet.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloWorldServlet</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>

註解版 (推薦): 在類上添加 @WebServlet("/HelloWorld"),無需 web.xml。

登錄案例完整流程

1. login.jsp (視圖層)

<%@ page contentType="text/html;charset=UTF-8" %>
<form action="${pageContext.request.contextPath}/HelloWorld" method="post">
    用戶名: <input type="text" name="userName" /><br/>
    密碼: <input type="password" name="passWord" /><br/>
    <input type="submit" value="登錄" />
</form>

2. Servlet 處理邏輯增強

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("UTF-8");
    String username = req.getParameter("userName");
    String password = req.getParameter("passWord");

    // 模擬驗證
    if ("admin".equals(username) && "123456".equals(password)) {
        // 登錄成功 -> 轉發到成功頁
        req.getRequestDispatcher("/WEB-INF/views/success.jsp").forward(req, resp);
    } else {
        // 登錄失敗 -> 設置錯誤信息,轉發回登錄頁
        req.setAttribute("error", "用戶名或密碼錯誤");
        req.getRequestDispatcher("/login.jsp").forward(req, resp);
    }
}

生命周期與線程安全

  • init(): 容器創建實例後調用一次(默認首次請求時),用於初始化資源(如數據庫連接池)。
  • service(): 每個請求一條線程調用,非線程安全。切勿在 Servlet 類中定義實例變量存儲請求級數據!
  • destroy(): 容器銷毀實例前調用,釋放資源。

常見問題排查

現象原因解決
404 Not Foundurl-pattern 不匹配 / 專案未發布檢查 web.xml 或 @WebServlet 路徑;Servers 視圖 Clean/Republish
中文亂碼未設置編碼req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8")
獲取參數為 null表單 name 屬性與 getParameter 參數不一致檢查 HTML name="userName" vs req.getParameter("userName")

總結

掌握「HttpServlet 繼承 → doGet/doPost 處理 → 參數獲取 → 業務邏輯 → 轉發/重定向」核心流程,理解容器管理生命周期與線程安全約束,是 JavaWeb 開發的基石。

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