前言:

    Servlet 容器初始化 Servlet 时,会为这个 Servlet 创建一个 ServletConfig 对象,并将 ServletConfig 对象作为参数传递给 Servlet 。通过 ServletConfig 对象即可获得当前 Servlet 的初始化参数信息。
一个 Web 应用中可以存在多个 ServletConfig 对象,一个 Servlet 只能对应一个 ServletConfig 对象,即 Servlet 的初始化参数仅对当前 Servlet 有效。

返回值类型 方法 功能描述
String getInitParameter(String name) 根据初始化参数名 name,返回对应的初始化参数值。
Enumeration<String> getInitParameterNames() 返回 Servlet 所有的初始化参数名的枚举集合,如果该 Servlet 没有初始化参数,则返回一个空的集合。
ServletContext getServletContext() 返回一个代表当前 Web 应用的 ServletContext 对象。
String getServletName() 返回 Servlet 的名字,即 web.xml 中 <servlet-name> 元素的值。

 

一、配置servlet 初始化 有两种 

  1. 使用 web.xml 配置初始化参数。
  2. 使用 @WebServlet 配置初始化参数。

(1)配置 web.xml 文件

  使用标签初始化的参数是被应用程序中所有的servlet所共享。但是有时候我们需要为某一个特定的servlet配置参数,这个时候我们就需要使用servlet初始化参数。

  在web.xml文件中为当前web应用添加三个名为 admin-email、admin-name和admin-password 的ServletConText 初始化参数,在Select中获取这三个参数。

  xml部分:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

<!--   配置 Servlet类 路径 -->
    <servlet>
        <servlet-name>Servlet</servlet-name>
        <servlet-class>main.java.com.Servlet</servlet-class>
    </servlet>

<!--  配置整个web应用的初始化参数  -->
    <context-param>
        <param-name>admin-email</param-name>
        <param-value>123456@qq.com</param-value>
    </context-param>
    <context-param>
        <param-name>admin-name</param-name>
        <param-value>xiaoxi</param-value>
    </context-param>
    <context-param>
        <param-name>admin-password</param-name>
        <param-value>123456</param-value>
    </context-param>

<!--  配置 Servlet 映射  -->
    <servlet-mapping>
        <servlet-name>Servlet</servlet-name>
        <url-pattern>/Servlet</url-pattern>
    </servlet-mapping>
</web-app>

 

Servlet部分:

使用  ServletConfig 接口的 getServletConfig() 的方法 获取Config ,  再通过getServletContext() 获取 ServletContext对象 最后通过getInitParameter(String name)方法,根据 配置的param-name名称返回 param-value

package main.java.com;

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

@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletConfig config = this.getServletConfig();

        ServletContext servletContext = config.getServletContext();
        String adminEmail = servletContext.getInitParameter("admin-email");//利用名字获取值
        String adminName = servletContext.getInitParameter("admin-name");//利用名字获取值
        String password = servletContext.getInitParameter("admin-password");//利用名字获取值
        response.getWriter().println("admin-email: " + adminEmail);
        response.getWriter().println("admin-name: " + adminName);
        response.getWriter().println("admin-password: " + password);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response); // 使用doGet
    }
}

最后的输结果是:

当然了 xml 中可以 配置web 全局的 Servlet 初始化参数,也可以 使用<init-param> 配置 当前 Servlet的初始化参数

以下配置说明:

  1. <init-param> 元素是 <servlet> 的子元素, 需要在 <servlet> 元素内使用,表示只对当前 Servlet 有效 。
  2. <param-name> 子元素表示参数的名称。
  3. <param-value> 子元素表示参数的值。
<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>java.com.MyServlet</servlet-class>
    <!-- Servlet 初始化参数 -->
    <init-param>
        <param-name>name</param-name>
        <param-value>xiaoxi</param-value>
    </init-param>
    <!-- Servlet 初始化参数 -->
    <init-param>
        <param-name>admin</param-name>
        <param-value>xiaoxi</param-value>
    </init-param>
</servlet>

 

(2)、在 @WebServlet注释中  添加 @WebInitParam 注释 配置初始化参数

package main.java.com;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

@WebServlet(
        name = "helloServlet",
        value = "/helloServlet",  //这里加上逗号
        initParams = {   //添加一个 initParams 属性
                @WebInitParam(  // 再使用 @WebInitParam 注解 携带 name和value 的属性和属性值 多个参数可以用逗号隔开 再次使用@WebInitParam注解
                        name = "name",
                        value = "测试"),
                @WebInitParam(
                        name = "Admin",
                        value = "123456")
        })
public class helloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8"); // 设置编码集为 utf-8
        PrintWriter writer = response.getWriter(); // 创建一个Writer流
        ServletConfig config = getServletConfig(); // 获取ServletConfig对象
        String servletName = config.getServletName();// 获取servletName
        Enumeration<String> initParameterNames = config.getInitParameterNames();// 返回 servlet 的初始化参数的名称的集合
        while (initParameterNames.hasMoreElements()) { // 遍历集合获取初始化参数名称
            String initParamName = initParameterNames.nextElement(); // 获取初始化参数名称
            String initParamValue = config.getInitParameter(initParamName); // 获取相应的初始参数的值
            writer.write(initParamName + "  :  " + initParamValue + "<br/>"); // 向页面输出
        }
        // 关闭流
        writer.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
}

 

在浏览器中输入 地址 最后结果是:

 总结:

  1. 使用xml 既可以全局配置 Servlet 的初始化参数 可以针对当前的Servlet 生效
  2. 使用注解方式 只对当前的Servlet生效