一、二者存在的价值
1.ServletConfig主要用于加载servlet配置文件的初始化参数,主要服务于servlet。我们可以在servlet配置信息里面存放一些需要用到的信息,在web.xml文件中的servlet标签下的init-param标签下配置,每个name和value值都需要重新写一个init-param标签。配置如下所示:
<servlet>
<servlet-name>...</servlet-name>
<servlet-class>...</servlet-class>
<init-param> //这个标签写在要设置的servlet内
<param-name>name</param-name> //属性名
<param-value>value</param-value> //属性值
</init-param>
</servlet>
2.ServletContext主要用于操作全文的配置文件。我们知道一个Web应用里面可以有多个servlet,如果现在有一份数据需要传给所有的servlet使用,那么我们就可以使用ServletContext对象了。举个例子,像一些账号、密码,我们就可以放在该容器中,当忘记更改账号、密码时直接在web.xml文件中更改就行了,而不用更改源代码。下面是全局参数的设置方法:
<context-param>
<param-name>user</param-name>
<param-value>password</param-value>
</context-param>
二、两个对象的创建过程
1.ServletConfig的创建过程
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息
2.ServletContext的创建过程
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。ServletContext对象servlet上下文对象。该对象在一个web应用中只会创建一个对象,代表当前web应用的环境。在当前的web应用中所有servlet都共享一个ServletContext对象。
三、如何获取两个对象
1.获取ServletConfig对象
首先HttpServlet继承自GenericServlet类,而GenericServlet类又继承自Servlet接口,Servlet接口有方法getServletConfig() ,所以HttpServlet肯定有方法getServletConfig()。而GenericServlet类又实现了ServletConfig 接口,也就是他肯定实现了ServletConfig接口中的所有方法,在servlet文件中直接用this.getServletConfig()就可以获取ServletConfig对象,也可以直接在servlet中调getInitParameter(“name”)获取参数值。
2.获取ServletContext对象
开发者十分巧妙的将ServletContext对象放入在了该web应用里的每一个servlet中的ServletConfig对象里!在一个servlet被创建时,会调用它的构造方法,随后就会调用init()方法对它初始化,而在初始化的过程中,就把ServletContext对象放入到ServletConfig对象中了!那么这个servlet得到ServletContext对象对象就十分方便了,只需要用一句代码:
ServletContext servletContext = this.getServletContext();
四、两个对象的常用方法
1.ServletConfig常用的方法(config为ServletConfig对象)
- 根据名称获取参数值
String value=config.getInitParameter(String name)
- 得到所有参数
Enumeration enums=config.getInitParameterNames()
- 获取servlet上下文对象
ServletContext context=config.getServletContext()
- 获取当前Servlet在web.xml中配置的名字
String value=config.getServletName()
2.ServletContext常用的方法
- 通过文件后缀名得到媒体类型
ServletContext context = this.getServletContext();
String mimeType =context.getMimeType(filename);
- 获取web应用的全局参数
ServletContext context = this.getServletContext();
Enumeration<String> enums = context.getInitParameterNames();
while(enums.hasMoreElements()){
String paramName = enums.nextElement();
String paramValue = context.getInitParameter(paramName);
- 域对象相关的方法(以request域为例)
servlet1写上:
ServletContext context = this.getServletContext();
context.setAttribute("id", 123);
然后servlet2通过获得它
ServletContext context = this.getServletContext();
String id = context.getAttribute("id");
- 用于转发
ServletContext context = this.getServletContext();
RequestDispatcher rd=context.getRequestDispatcher(String path)
- web应用加载资源文件方法
ServletContext context = this.getServletContext();
String abosolutePate=context.getRealPath(String path);
//得到资源的绝对路径
ServletContext context = this.getServletContext();
InputStream is=context.getResourceAsStream(String path)
//得到资源的的一个输入流