Servlet中如何获取param-name对应的值?

本文深入解析Servlet如何通过ServletConfig获取web.xml中配置的初始化参数,包括init-param元素的使用及在Servlet生命周期中的作用。

一个web.xml,配置一个servlet如下

<servlet>
<servlet-name>BeerParamTests</servlet-name>
<servlet-class>TestInitParams</servlet-class>
<init-param>
<param-name>adminEmail</param-name>
<param-value>likewecare@wickedlysmart.com</param-value>
</init-param>
</servlet>

Servlet中是如何获取到这个参数adminEmail对应的值likewecare@wickedlysmart.com呢?

《Head First Servlet and JSP》上面有这样一段话

When the Container
initializes a servlet,
it makes a unique
ServletConfig for the
servlet.
The Container “reads”
the servlet init
parameters from the
DD and gives them to
the ServletConfig, then
passes the ServletConfig
to the servlet’s init()
method.

大概意思是说,当容器比如tomcat实例化一个servlet的时候,会为这个servlet造一个独一无二的ServletConfig,容器从DD也就是web.xml文件中读取servlet的<init-param>的name和value,并且将其传递到ServletConfig中,然后再将这个ServletConfig传递到servlet的init()方法中.

将ServletConfig传递到servlet的init()方法中是什么意思呢?

其实指的就是就是指传递到 GenericServlet的init(ServletConfig config)方法中,

我们先看下 GenericServlet这个类

public abstract class GenericServlet
  implements Servlet, ServletConfig, Serializable
{
  private static final long serialVersionUID = 1L;
  private transient ServletConfig config;

  public void destroy()
  {
  }

  public String getInitParameter(String name)
  {
    return getServletConfig().getInitParameter(name);
  }

  public Enumeration<String> getInitParameterNames()
  {
    return getServletConfig().getInitParameterNames();
  }

  public ServletConfig getServletConfig()
  {
    return this.config;
  }

  public ServletContext getServletContext()
  {
    return getServletConfig().getServletContext();
  }

  public String getServletInfo()
  {
    return "";
  }

  public void init(ServletConfig config)
    throws javax.servlet.ServletException
  {
    this.config = config;
    init();
  }

  public void init()
    throws javax.servlet.ServletException
  {
  }

  public void log(String msg)
  {
    getServletContext().log(getServletName() + ": " + msg);
  }

  public void log(String message, Throwable t)
  {
    getServletContext().log(getServletName() + ": " + message, t);
  }

  public abstract void service(ServletRequest paramServletRequest, ServletResponse paramServletResponse)
    throws javax.servlet.ServletException, IOException;

  public String getServletName()
  {
    return this.config.getServletName();
  }
}
所以GenericServlet通过init(ServletConfig config)获取到了web.xml中的ServletConfig
又因为public abstract class HttpServlet extends GenericServlet(HttpServlet继承于GenericServlet)

我们可以在doGet或者doPost方法中通过

this.getServletConfig().getInitParameter("emailAdress")获取


如果我们想在init()方法中获取参数,就应该重写init()方法,而不是init(arg)方法

当然也可以重写init(arg)方法

不过得保证执行了父类的super.init(arg)比如

@Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("你进入了init(arg)方法"+config.getInitParameter("emailAdress")+"---");
        super.init(config);//注释掉这一句,ServletConfig将为null
    }

这样一来,在ServletConfig对象才不为null,



附送一个测试的Servlet类

package servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 测试InitParameter
 * @author ken
 *
 */
public class ServletInitParameter extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 7094673076240375858L;

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

	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		super.init();
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("你进入了init(arg)方法"+config.getInitParameter("emailAdress")+"---");
		super.init(config);//注释掉这一句,下面的getServletConfig()将返回是null
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("aaaa"+this.getServletConfig().getInitParameter("emailAdress"));
	}

}



转载于:https://my.oschina.net/liangzhenghui/blog/183791

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值