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

Servlet 核心架構全解析:從 HelloWorld 到生產級最佳實踐

     編輯:Java 相關知識

Servlet 核心接口與生命周期

Servlet 是運行在 Servlet 容器(Tomcat、Jetty、WebLogic 等)中的 Java 類,遵循 javax.servlet.Servlet 接口契約。核心生命周期三方法:

  1. init(ServletConfig):實例化後調用一次,完成初始化
  2. service(ServletRequest, ServletResponse):每次請求調用,分發到 doGet/doPost 等
  3. destroy():容器關閉/卸載前調用,釋放資源

HTTP Servlet 快速入門

最小化實現

@WebServlet("/hello") // Servlet 3.0+ 註解配置,替代 web.xml
public class HelloServlet extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        
        resp.setContentType("text/plain;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        out.println("Hello, Servlet!");
    }
}

關鍵對象解析

對象核心職責常用方法
HttpServletRequest封裝 HTTP 請求getParameter(), getHeader(), getSession(), getInputStream()
HttpServletResponse構建 HTTP 響應setStatus(), setHeader(), setContentType(), getWriter(), getOutputStream()
HttpSession會話狀態管理setAttribute(), getAttribute(), invalidate(), setMaxInactiveInterval()
ServletContext應用級上下文getInitParameter(), getResourceAsStream(), log(), getRequestDispatcher()

部署與運行:從傳統到現代

web.xml 傳統配置(Servlet 2.5 兼容)

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.example.HelloServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

Maven 項目結構

src/
├── main/
│   ├── java/com/example/HelloServlet.java
│   ├── webapp/
│   │   ├── WEB-INF/web.xml (可選)
│   │   └── index.jsp
└── test/

打包與部署

  • mvn package 生成 .war
  • 放入容器 webapps/ 目錄(熱部署)或通過管理控制台部署
  • 訪問 https://host:port/context-path/hello

進階:輸出 HTML 與模板分離

工具類封裝頁面骨架

public class ServletUtils {
    public static final String DOCTYPE = 
        "<!DOCTYPE html>";
    
    public static String headWithTitle(String title) {
        return DOCTYPE + "\n" +
               "<html>\n<head><title>" + title + "</title></head>\n";
    }
}

// 使用
out.println(ServletUtils.headWithTitle("歡迎") +
            "<body><h1>Hello, World!</h1></body></html>");

最佳實踐:轉發給 JSP/模板引擎

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
    
    // 1. 業務邏輯準備數據
    List users = userService.findAll();
    req.setAttribute("users", users);
    
    // 2. 轉發給視圖渲染(JSP/Thymeleaf/FreeMarker)
    req.getRequestDispatcher("/WEB-INF/views/user-list.jsp")
       .forward(req, resp);
}

生產級核心模式

統一異常處理:錯誤頁面配置

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/error/500.jsp</location>
</error-page>
<error-page>
    <error-code>404</error-code>
    <location>/error/404.jsp</location>
</error-page>

過濾器鏈:橫切關注點

@WebFilter("/*")
public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        chain.doFilter(req, resp);
    }
}

異步 Servlet:長輪詢/Comet 支持

@WebServlet(value = "/async", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        AsyncContext ctx = req.startAsync();
        ctx.start(() -> {
            try {
                Thread.sleep(5000); // 模擬耗時操作
                ctx.getResponse().getWriter().write("Async Done");
                ctx.complete();
            } catch (Exception e) { /* handle */ }
        });
    }
}

性能調優清單

  • 線程池:調整容器連接器 maxThreads、acceptCount
  • 會話:必要時才 getSession(),大對象存 Redis 不存 Session
  • 輸出緩衝:resp.setBufferSize(8192) 減少網絡交互
  • 靜態資源:交給 Nginx/Apache 或容器默認 Servlet,啟用壓縮、緩存頭

總結

Servlet 是 Java Web 技術棟樑,Spring MVC、Struts、JSF 等框架本質上都是構建在 Servlet API 之上。掌握其核心契約、生命周期、請求響應模型、部署機制,是排查疑難雜症、設計高性能系統的前提。現代開發雖多用框架,但「懂 Servlet」永遠是資深 Java Web 工程師的分水嶺。

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