ServletContext
ServletContext上下文提供对应用程序中所有Servlet所共有的各种资源和功能的访问。Servlet上下文 API用于设置应用程序中所有Servlet共有的信息。Servlet可能需要共享他们之间的共有信息。运行于同 一服务器的Servlet有时会共享资源,如JSP页面、文件和其他Servlet
ServletContext是一个全局的储存信息的空间,服务器开始就存在,服务器关闭才释放。
- request一个用户可有多个
- session一个用户一个
- servletContext所有用户共用一个
request一个用户可有多个 session一个用户一个 servletContext所有用户共用一个
ServletContext接口
容器供应商负责提供servlet容器内ServletContext接口的实现。使用ServletContext对象可以记录事件 日志、获取资源的URL地址,并且设置和保存上下文内可以访问的其他servlet的属性
在jsp中是9大默认对象的application对象
初始化参数
上下文参数一般都是配置在web.xml中
<context-param> 上下文参数的个数没有限制
<param-name>counter</param-name> 参数名称,不允许重复
<param-value>99999</param-value> 对应配置参数值
</context-param>
ServletContext接口的初始化参数允许servlet访问与web应用相关的上下文初始化参数,这些由应用开 发人员在部署描述符中指定:
- getInitParameter
String str=this.getServletContext().getInitParameter("counter");//如 果上下文中没有这个初始化参数配置,则获取值null
允许servlet的init-param和上下文参数同名,这里只是通过不同的方式进行获取, 上下文参 数使用application对象获取,servlet参数配置使用ServletConfig获取
- getInitParameterNames
final ServletContext application = this.getServletContext(); final Enumeration<String> names = application.getInitParameterNames(); while(names.hasMoreElements()){ String name=names.nextElement(); String value=application.getInitParameter(name); System.out.println(name+"---"+value); }
应用开发人员利用初始化参数传送配置信息。典型的例子是web管理员的e-mail地址或者一个持有关键 数据的系统名称
上下文属性
可以通过名称将对象属性绑定到上下文。任何绑定到上下文的属性可以被同一个web应用的其他servlet 使用。ServletContext接口的方法允许访问
- setAttribute
- getAttribute
- getAttributeNames
- removeAttribute
针对基本不发生改变而且需要频繁读取的数据,可以考虑将数据共享在application中
- 正确的做法是参数ServletContextListener实现application被创建时自动加载,在application销毁 时存储数据
- 变通做法是由Servlet在init方法中负责加载准备
<servlet>
<servlet-name>loadCatalog</servlet-name>
<servlet-class>com.yan.action.LoadCatalogServlet</servlet-class>
<!--默认情况下,当第一次客户端访问Servlet时,才由服务器负责加载并初始化Servlet
对象 -->
<!--配置参数load-on-startup表示应用启动时自动加载Servlet,值为大于等于零的整
数,值越大优先级越低.默认值-1表示按需加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>loadCatalog</servlet-name>
<url-pattern>/load.do</url-pattern>
</servlet-mapping>
在LoadCatalogServlet的init方法中加载类目信息,并存放在application对象的属性中,其它地方直接获 取即可