servletconfig和ServletContext的用法和区别

来源:互联网 发布:java package private 编辑:程序博客网 时间:2024/06/03 21:31

一.ServletConfig:从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问。当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,我们通过ServletConfig对象就可以得到当前servlet的初始化参数信息。在web.xml中这样配置:

<servlet> 

     <servlet-name>DemoServlet</servlet-name> 

     <servlet-class>cn.csdn.web.servlet.DemoServlet</servlet-class>         

     <init-param>  

        <param-name>characterEncoding</param-name>  

        <param-value>UTF-8</param-value>  

     </init-param>  

    <init-param> 

         <param-name>driver</param-name> 

         <param-value>com.mysql.jdbc.driver</param-value> 

     </init-param>

    <load-on-startup>1</load-on-startup>

</servlet>

 

public class DemoServletextends HttpServlet {

        

            public void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException { 

                      this.doPost(request, response); 

       }

           public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException { 

                    String characterEncoding =  super.getServletConfig().getInitParameter("characterEncoding"); 

                    System.out.println(characterEncoding);

      }

}

其实还有一种取得characterEncoding的方法,就是在DemoServlet的init(ServletConfig config)方法:

public class DemoServletextends HttpServlet {

          private ServletConfig config;

          public void init(ServletConfig config)throws ServletException { 

                  this.config = config;

        }

        public void doPost() throws ServletException,IOException{

               String characterEncoding =  this.config.getInitParameter("characterEncoding");

              System.out.println("characterEncoding");

       } 

}    

以上两种方法都可以取到web.xml中配置的characterEncoding,其实这两种方式的实现是一样的,只不过是第二种重写了父类的init()方法。

二.ServletContext:

    每一个web应用启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。ServletConfig对象中维护了ServletContext对象的引用,由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。ServletContext基本上有两方面的应用:

1.servlet间的通信:

可以初始化context的值,在WEB-INF中这样配置:

<web-app>  

    <context-param>  

       <param-name>url</param-name>  

       <param-value>jdbc:mysql://localhost:3306/4g</param-value>  

    </context-param>  

    <context-param>  

        <param-name>name</param-name>  

         <param-value>1314qr</param-value>  

    </context-param>  

</web-app> 

在servlet中这样写:

    ServletContext context = this.getServletContext();

    String name = context.getInitParameter("name");

    context.setAttribute("name", "haha");

    response.setStatus(302);

    response.setHeader("location",http://day05/servlet/ListServlet);

这样就会跳转到ListServlet的doGet()方法,并可以在doget()方法中取到name这个变量。

2.读取web工程下的资源文件:

   有的时候只知道文件的相对路径,但是不知道绝对路径,可以通过这种方式获得:

   ServletContext context = this.getServletContext();      //ServletConfig可以取得ServletContext

   String path = context.getRealPath("WEB-INF/classes/a.txt");

   System.out.println(path);

getRealPath(path):根据相对于当前web工程的相对路径来取得绝对路径。

 

 

 

 

 

 

 

 



 

0 0
原创粉丝点击