引入SerletConfig:先要提一下Servlet生命周期的init(ServletConfig)方法和无参的init(),为什么我们写的init方法是没有参数的呢,是因为在GenericServlet的源码中,init(ServletConfig)里面已经调用了无参的init方法,所以我们直接覆写无参的init方法就可以,有参的他不希望我们覆写,源码如下
Servletconfig是配置对象,主要把servlet的初始化参数封装到这个对象中。一个网站中可能会存在多个ServletConfig对象,一个ServletConfig对象就封装了一个servlet的配置信息,主要作用就是获取配置文件
<servlet>
<servlet-name>ConfigDemoservlet-name>
<servlet-class>config.ConfigDemoservlet-class>
<init-param>
<param-name>pathparam-name>
<param-value>e:/aaa.txtparam-value>
init-param>
servlet>
在一个servlet进行初始化的时候会执行init(ServletConfigconfig)方法,这个config对象会把该servlet的web.xml中的配置信息封装到这个config对象中(先封装,再走init),这样通过ServletConfig对象拿到配置信息中path.
但是上面获得config对象的方法比较麻烦,所有在GeneriServlet中提供了获取config对象的方法:getServletConfig(),这个方法返回的就是一个已经封装好配置信息的config对象了
上下文对象,一个网站只会创建一个ServletContext对象,代表整个网站的环境信息,整个网站共享必须通过config对象获取context对象 ,是servlet启动时创建,而config对象是是再init方法被调用之前创建的,所以先有config再有context在构造ServletConfig对象的时候,就会把ServletContext扔进来,当作config对象的成员变量,然后通过getServletContext()可以拿到context对象,只是在init中为了减少参数的传递,就通过这种方式来传递这个context参数,所以是只能this.getServletConfig().getServleContext()这样通过config来获取的context对象
举例:
做一个购物类的网站,要从数据库中提取物品信息,如果用session保存这些物品信息,每个用户都访问一便数据库,效率就太低了;所以要用来Servlet上下文来保存,在服务器开始时,就访问数据库,将物品信息存入Servlet上下文中,这样,每个用户只用从上下文中读入物品信息就行了。
1)获取web的上下文路径(web上下文路径就是tomacat服务器中运行的路径,不是项目目录的名称)
java.lang.String getContextPath()
演示在web.xml文件中配置需要初始化的参数信息。
<web-app>
<context-param>
<param-name>urlparam-name>
<param-value>jdbc:MySQL://localhost:3306/testparam-value>
context-param>
<context-param>
<param-name>passwordparam-name>
<param-value>1234param-value>
context-param>
<context-param>
<param-name>userparam-name>
<param-value>rootparam-value>
context-param>
web-app>
在DemoServlet的doPost方法中测试获取初始化参数的步骤如下:
//获取ServletContext对象
ServletContext context = this.getServletContext();
/获取初始化参数/
//获取指定名称的初始化参数
String url = context.getInitParameter("url");
//获取web.xml文件中所有的初始化应用参数
Enumeration<String> enumer = context.getInitParameterNames();
while(enumer.hasMoreElements()){
String name = enumer.nextElement();
String value = context.getInitParameter(name);
System.out.println(name+"=========="+value);
}
2)获取全局参数
java.lang.String getInitParameter(java.lang.String name)
java.util.Enumeration getInitParameterNames()
获取全局参数演示:
在InitServlet的Service方法中利用ServletContext对象存入需要共享的数据
//获取ServletContext对象
ServletContext context = this.getServletContext();
//存入共享的数据
context.setAttribute("name", "haha");
//在其它的Servlet中利用ServletContext对象获取共享的数据
/*获取ServletContext对象*/
ServletContext context = this.getServletContext();
//获取共享的数据
String name = context.getAttribute("name");
System.out.println("共享的内容值是:"+name);
3)和域对象相关的
void setAttribute(java.lang.String name, java.lang.Object object)
java.lang.Object getAttribute(java.lang.String name)
void removeAttribute(java.lang.String name)
Servlet三个域对象:
ServletContext
HttpServletRequest
HttpSession
4)请求转发
RquestDispatcher getRequestDispatcher(java.lang.String path)
在servlet跳转页面:
请求重定向:
1)地址栏会发送改变,变成重定向到的地址。
2)可以跳转到项目内的资源,也可以跳转项目外的资源
3)浏览器向服务器发出两次请求,那么就不能使用请求来作为域对象来共享数据。
请求转发:
1)地址栏不会改变。
2)只能跳转到项目内的资源,不能跳转到项目外的资源
3)浏览器向服务器发出一次请求,那么可以使用请求作为域对象共享数据。
转发演示:
///要利用ServletContext对象实现转发获取对象
ServletContext context = this.getServletContext();
//在request对象中存入name属性
request.setAttribute("name", "haha");
//根据转发的地址获取 RequestDispatcher对象
RequestDispatcher rd = context.getRequestDispatcher("/index.jsp");
//调用转发方法 以下采用任意方法即可
rd.forward(request, response);
//rd.include(request, response);
5)读取web项目的资源文件
java.lang.String getRealPath(java.lang.String path)
java.io.InputStream getResourceAsStream(java.lang.String path)
java.net.URL getResource(java.lang.String path)
如果读者已经理解了仔细斟酌了上面的内容,那二者的区别已经显而易见了
从作用范围来说,ServletConfig作用于某个特定的Servlet,即从该Servlet实例化,那么就开始有效,但是该Servlet之外的其他Servlet不能访问;ServletContext作用于某个webapp,即在一个webapp中相当于一个全局对象,在Servlet容器启动时就已经加载,对于不同的webapp,有不同的ServletContext。
二者参数的使用:
<context-param>
<param-name>ContextParamparam-name>
<param-value>this is ServletContext param.param-value>
context-param>
<servlet>
<servlet-name>servlet名称servlet-name>
<servlet-class>servlet全限定名servlet-class>
<init-param>
<param-name>ServletParamparam-name>
<param-value>this is ServletConfig param.param-value>
init-param>
servlet>
参数的获取:访问ServletConfig参数,取得ServletConfig对象后,调用getInitParameter()方法;访问ServletContext对象,只要调用现有的ServletConfig对象的getServletContext()即可,然后同样调用getInitParamter()方法就能获取参数。例如对于上面的参数,可以通过如下方法获取各自参数。
public class GetParam extends HttpServlet {
//拿到config
ServletConfig config;
public void init(ServletConfig config) {
this.config=config;
}
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
String servletparam=(String)config.getInitParameter("ServletParam");
System.out.println(servletparam);
String contextparam = (String)config.getServletContext().getInitParameter("ContextParam");
System.out.println(contextparam);
}
}
对上面Servlet部署运行就可以分别在控制台输出
this is ServletConfig param.this is ServletContext param.
以上内容就是我对ServletContext和ServletConfig的理解了,后面有内容会再继续补充.有不对的地方欢迎指正