ServletContext和ServletConfig是Servlet中比较重要的两个概念,在Java Web开发的很多时候都会碰到这两个对象,下面就详细的介绍下他们。
1.ServletContext
ServletContext,即Servlet上下文是servlet与servlet容器之间的直接通信的接口。Servlet容器在启动一个Webapp时,会为它创建一个ServletContext对象。每个webapp都有唯一的ServletContext对象。同一个webapp的所有servlet对象共享一个ServeltContext,servlet对象可以通过ServletContext来访问容器中的各种资源。下面通过一些具体的servlet方法来了解servletContext的作用:
1)在webapp范围内进行数据的共享
主要是通过对Attribute的操作来实现数据的存储、传递等
方法 | 作用 |
---|---|
setAttribute(String name, Object object) | 以key-value的形式将数据存入context |
Object getAttribute(String name) | 从Context中取出传入key对应的value |
Enumeration(String) getAttributeNames() | 取context中所有设置的Attribute的name |
void removeAttribute(String name) | 移除指定key对应的value |
2)访问webapp的资源
方法 | 作用 |
---|---|
String servletContext.getContextPath() | 返回当前webapp的URL入口,如果不配置默认为空字符串 |
String getInitParameter(String name) | 获取context中配置的初始化参数,即web.xml中context-param元素中配置的参数,这个元素中配置的参数是webapp范围内都有效的初始化参数 |
Enumeration(String) getInitParameterNames() | 获取context中配置的所有初始化参数名称 |
RequestDispatcher getRequestDispatcher(String path) | 返回一个用于向其他web组件转发请求的RequestDispatcher对象 |
3)获取Servelt容器相关信息
方法 | 作用 |
---|---|
ServletContext getContext(String uripath) | 根据参数指定的url,返回当前servlet容器中其他web应用的servletContext()对象 |
4)访问Servlet容器相关的信息
方法名 | 作用 |
---|---|
getMajorVersion() | 返回servlet容器支持的java servlet API 的主版本号 |
getMinorVersion() | 返回servlet容器支持的java Servlet API的次版本号 |
getServerInfo() | 返回servlet容器的名字和版本 |
5)访问服务器端的文件系统资源
方法名 | 作用 |
---|---|
String getRealPath(String path) | 根据参数指定的虚拟路径,返回文件系统中的一个真实的路径,以webapp所在目录为根路径 |
getResource(String path) | 返回一个映射到参数指定的路径的url |
getResourceAsStream(String path) | 返回一个用于读取参数指定的文件的输入流。(把文件读到输入流中去) |
getMimeType(String file) | 返回参数指定的文件的MIME类型 |
获取ServeltContext对象的几种方法:
javax.servlet.http.HttpSession.getServletContext()
javax.servlet.jsp.PageContext.getServletContext()
javax.servlet.ServletConfig.getServletContext()
javax.servlet.ServletRequest.getServletContext()
2.ServeltConfig详解
Servlet容器初始化一个Servlet类型的对象时,会为这个Servlet对象创建一个ServletConfig对象。在ServletConfig对象中包含了Servlet的初始化参数信息。此外,ServletConfig对象还与ServletContext对象关联。Servlet容器在调用Servlet对象的init(ServletConfig config)方法时,会把ServletConfig类型的对象当做参数传递给servlet对象。Init(ServletConfig config)方法会使得当前servlet对象与ServletConfig类型的对象建立关联关系。在Servlet内部提供了 getServletConfig()方法来获取关联的ServletConfig对象,下面看下这个对象具体的方法:
方法名 | 作用 |
---|---|
ServletContext getServletContext() | 获得与ServletConfig相关联的ServletContext对象 |
getServltName() | 返回servlet的名字,即web.xml中的相对应的servlet的子元素servlet-name的值。如果没有配置这个子元素,则返回servlet类的全局限定名 |
getInitParameter(String name) | 根据给定的初始化参数,返回匹配的初始化参数值,即web.xml中servelt元素下init-param所配置的参数 |
getInitParameterNames() | 返回所有配置的初始化参数名称 |
下面的web.xml配置中展示了ServletContext初始化参数,以及Servlet初始化参数,并且展示了如何在代码中引用它们:
<!--ServletContext的初始化参数,可以通过servletContext.getInitParameter()方法获取-->
<context-param>
<param-name>context-param</param-name>
<param-value>context-param</param-value>
</context-param>
<servlet>
<servlet-name>MyFirstServlet</servlet-name>
<servlet-class>com.meituan.lkl.MyFirstServlet</servlet-class>
<!--Servlet初始化参数,可以通过servletConfig.getInitParameter()方法获取-->
<init-param>
<param-name>servlet-param</param-name>
<param-value>servlet-value</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyFirstServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
//重写了HttpServlet的doGet()方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = req.getServletContext();
System.out.println(servletContext.getInitParameter("context-param"));
//HttpServlet类继承了GenericServlet类,而GenericServlet类实现了ServletConfig接口,
// 因此在HttpServlet类和GenericServlet类及子类中都可以直接调用ServletConfig接口中的getServletConfig方法
ServletConfig config =getServletConfig();
System.out.println(config.getInitParameter("servlet-param"));
}