一个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"));
}
}
本文深入解析Servlet如何通过ServletConfig获取web.xml中配置的初始化参数,包括init-param元素的使用及在Servlet生命周期中的作用。

5013

被折叠的 条评论
为什么被折叠?



