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

web.xml 參數完解:context-param vs init-param 作用域與 Servlet 存取方式

     編輯:Java 程式設計入門

web.xml 定義兩種初始化參數,作用域、生命週期、存取方式截然不同。本文透過配置範例與程式碼,釐清 context-param(應用層)與 init-param(Servlet 層)的核心差異。

配置對比

維度context-paraminit-param
作用域整個 Web 應用 (ServletContext)單一 Servlet (ServletConfig)
配置位置<web-app> 直屬子元素<servlet> 內部
生命週期應用啟動~銷毀Servlet 初始化~銷毀
可見性所有 Servlet、Filter、Listener僅對應 Servlet
存取 APIServletContext.getInitParameter()ServletConfig.getInitParameter()

web.xml 完整範例

<web-app xmlns="https://xmlns.jcp.org/xml/ns/javaee" version="4.0">

    <!-- 應用層參數:資料庫連線池、全域功能開關 -->
    <context-param>
        <param-name>db.pool.size</param-name>
        <param-value>20</param-value>
    </context-param>
    <context-param>
        <param-name>feature.export.enabled</param-name>
        <param-value>true</param-value>
    </context-param>

    <servlet>
        <servlet-name>ReportServlet</servlet-name>
        <servlet-class>com.example.ReportServlet</servlet-class>
        <!-- Servlet 專屬參數:報表模板路徑、分頁大小 -->
        <init-param>
            <param-name>template.path</param-name>
            <param-value>/WEB-INF/templates/report.jrxml</param-value>
        </init-param>
        <init-param>
            <param-name>page.size</param-name>
            <param-value>50</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>ReportServlet</servlet-name>
        <url-pattern>/report</url-pattern>
    </servlet-mapping>

</web-app>

Servlet 存取程式碼

public class ReportServlet extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);

        // 1. 讀取 Servlet 專屬參數 (init-param)
        String template = config.getInitParameter("template.path");
        int pageSize = Integer.parseInt(config.getInitParameter("page.size"));

        // 2. 讀取應用層參數
        ServletContext ctx = getServletContext();
        int poolSize = Integer.parseInt(ctx.getInitParameter("db.pool.size"));
        boolean exportEnabled = Boolean.parseBoolean(
            ctx.getInitParameter("feature.export.enabled"));

        System.out.printf("Template: %s, PageSize: %d, Pool: %d, Export: %b%n",
                          template, pageSize, poolSize, exportEnabled);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        // doGet 也可透過 getServletContext() 讀取 context-param
        String pool = getServletContext().getInitParameter("db.pool.size");
        resp.getWriter().write("DB Pool: " + pool);
    }
}

關鍵觀念釐清

1. init-param 僅在 init() 可用?

錯誤迷思。ServletConfig 實例隨 Servlet 生命週期存在,doGet/doPost 同樣可呼叫 getServletConfig().getInitParameter()。但慣例在 init() 讀取並快取為欄位,避免重複查找。

2. 參數名稱衝突

若 context-param 與 init-param 同名,互不干擾,分別透過 ServletContext / ServletConfig 存取。

3. 現代替代方案:Spring @Value / @ConfigurationProperties

@Component
public class ReportService {
    @Value("${db.pool.size:10}")       // 對應 context-param 或 application.yml
    private int poolSize;

    @Value("${template.path}")         // 對應 init-param 或配置檔
    private String templatePath;
}

Spring 容器整合 ServletContextInitParameter,可無縫讀取 web.xml 參數,建議新專案採用配置檔 (application.yml) 統一管理。

總結

  • context-param:應用級共享配置(資料庫、快取、功能開關)
  • init-param:Servlet 專屬配置(模板路徑、演算法參數)
  • 存取 API 分別為 ServletContext / ServletConfig
  • 新專案建議外部化配置至 application.yml,搭配 Spring @Value
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved