详解ServletConfig和ServletContext

ServletConfig:

引入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>
  • ServletConfig对象的作用过程:

    在一个servlet进行初始化的时候会执行init(ServletConfigconfig)方法,这个config对象会把该servlet的web.xml中的配置信息封装到这个config对象中(先封装,再走init),这样通过ServletConfig对象拿到配置信息中path.
    详解ServletConfig和ServletContext_第1张图片

    但是上面获得config对象的方法比较麻烦,所有在GeneriServlet中提供了获取config对象的方法:getServletConfig(),这个方法返回的就是一个已经封装好配置信息的config对象了

在这里插入图片描述

ServletContext:

上下文对象,一个网站只会创建一个ServletContext对象,代表整个网站的环境信息,整个网站共享必须通过config对象获取context对象 ,是servlet启动时创建,而config对象是是再init方法被调用之前创建的,所以先有config再有context在构造ServletConfig对象的时候,就会把ServletContext扔进来,当作config对象的成员变量,然后通过getServletContext()可以拿到context对象,只是在init中为了减少参数的传递,就通过这种方式来传递这个context参数,所以是只能this.getServletConfig().getServleContext()这样通过config来获取的context对象

举例:

​ 做一个购物类的网站,要从数据库中提取物品信息,如果用session保存这些物品信息,每个用户都访问一便数据库,效率就太低了;所以要用来Servlet上下文来保存,在服务器开始时,就访问数据库,将物品信息存入Servlet上下文中,这样,每个用户只用从上下文中读入物品信息就行了。


ServletContext的五大作用 :

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)


ServletContext和ServletConfig二者区别

如果读者已经理解了仔细斟酌了上面的内容,那二者的区别已经显而易见了

​ 从作用范围来说,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的理解了,后面有内容会再继续补充.有不对的地方欢迎指正

你可能感兴趣的:(Others)