每个Servlet都必须由Web容器读取Servlet设置信息,才可以真正成为一个Servlet。对于每个Servlet的设置信息,web容器会为其生成一个ServletConfig作为代表对象,我们可以从这个对象取得Servlet初始参数,以及代表整个web应用程序的ServletContext对象。
Servlet、ServletConfig、GenericServlet
在Servlet接口上,定义了一个与Servlet生命周期及请求服务相关的init()、service()、destroy()三个方法:
- init():容器启动后产生ServletConfig对象后,会调用Servlet接口的该方法,并将ServletConfig对象当作参数传入。
- service():在请求到来容器时,会产生HttpServletRequest与HttpServletResponse对象,并在调用该方法时当作参数传入。
- destory():对Servlet的一些善后工作。
ServletConfig就是每个Servlet设置的代表对象,容器会为每个Servlet设置信息产生一个Servlet及ServletConfig实例。GenericServlet同时实现了Servlet与ServletConfig。它的目的就是将初始Servlet调用init()方法传入的ServletConfig封装起来:
private transient ServletConfig config;
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {}
在编写Servlet时,如果有一些初始时所要运行的动作,可以重新定义这个无参数的init()方法。
GenericServlet也包括了Servlet与ServletConfig所定义方法的简单实现,实现内容是通过ServletConfig来取得一些相关信息:
public ServletConfig getServletConfig() {
return config;
}
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
public Enumeration getInitParameterNames() {
return getServletConfig().getInitParameterNames();
}
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
所以在继承HttpServlet实现Servlet时,就可以通过这些方法来取得所要的相关信息,而不用直接意识到ServletConfig的存在。
使用ServletConfig
ServletConfig相当于个别Servlet的设置信息代表对象,这意味着可以从中取得Servlet设置信息。ServletConfig定义了getInitParameter()、getInitParameterNames()方法,可以取得设置Servlet时的初始参数。
使用标注设置个别Servlet的初始参数,并取得Servlet初始参数如下所示:
...
@WebServlet(name = "ServletConfigDemo", urlpatterns = {"/conf"},
initParams = {
@WebInitParam(name = "PARAM1", value = "VALUE1"),
@WebInitParam(name = "PARAM2", value = "VALUE2")
}
)
public class ServletConfigDemo extends HttpServlet {
private String PARAM1;
private String PARAM2;
public void init() throws ServletException {
PARAM1 = getServletConfig().getInitParameter("PARAM1");
//PARAM1 = getInitParameter("PARAM1");
PARAM2 = getServletConfig().getInitParameter("PARAM2");
//PARAM2 = getInitParameter("PARAM2");
}
...
}
使用ServletContext
该接口定义了运行Servlet的应用程序环境的一些行为与观点,可以使用它实现对象来取得所请求资源的URL、设置与储存属性、应用程序初始参数,甚至动态设置Servlet实例。
当Web应用程序加载Web容器后,生成ServletContext对象作为整个应用程序的代表,并设置给ServletConfig,通过ServletConfig的getServletContext()方法就可以取得ServletContext对象。
该对象有三个常用方法:getRequestDispatcher()、getResourcePaths()
、getResourceAsStream()
getRequestDispatcher()
该接口中定义了二种方法用于请求转发:
1)forward(req, resp)方法:将请求转发给服务器上另外一个Servlet,JSP页面,或者HTML文件;这个方法必须在响应被提交给客户端之前调用,否则抛出异常。方法调用后在响应中的没有提交的内容被自动消除。
2)include(req,resp)方法 :用于在响应中包含其他资源(Servlet,JSP页面或HTML文件)的内容。即请求转发后,原先的Servlet还可以继续输出响应信息,转发到的Servlet对请求做出的响应将并入原先Servlet的响应对象中。
context.getRequestDispatcher("/pages/some.jsp").forword(request, response);
context.getRequestDispatcher("/pages/some.jsp").include(request, response);
getResourcePaths()
得到某个目录下的所有文件名,使用方法如下:
for(String fileName : getContextConfig().getResourcePaths("/") {
...
}
getResourceAsStream()
读取某个文件的内容。