06 ServletContext 接口介绍

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/world_zheng/article/details/85250167

1 什么是ServletContext

ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。所有的Servlet都共享这个对象,ServletContext作用:Servlet对象可以通过ServletContext来访问容器中的各种资源。

Servletcontext 它是servlet与servlet容器之间通信的接口。每一个web程序都有一个唯一的ServletContext对象,我们可以把ServletContext对象形象地理解为web应用总管家,同一个web应用中的所有的Servlet对象都共享一个总管家,servlet对象可以通过这个总管家访问容器中的各种资源。由于web应用中的所有的Servet共享同一个ServletContext对象,因此,servlet对象之间可以通过ServletContext对象来实现通讯。

Servlet容器(服务器)启动一个web应用的时候,会为它创建一个ServletContext对象

(总结:ServletContext是一个上下文对象,也可以理解为Sevlet的一个容器,所有的Servlet都会共享这个对象,它的主要作用就是是servlet可以通过这个ServletContext对象来获取容器中的各种资源,比如读取全局配置参数、获得工程目录下面的各种资源、还可以通过Servletcontext接口存放共享的数据等。)

ServletContext的生命周期:Servlet容器在启动一个web应用是,会为它创建一个唯一的ServletContext对象,当Servlet容器终止一个Web容器时,就会销毁它的ServletContext对象。

 

 

1.2.  作用

1.      是一个域对象

2.      可以读取全局配置参数

3.      可以搜索当前工程目录下面的资源文件

4.      可以获取当前工程名字(了解)

5.      通过Servletcontext存放共享数据

1.3.怎样获得ServletContext对象

1.3.1因为GenericServlet实现了ServletConfig这个借口,这个接口中定义了获得ServletContext对象的方法叫“getServletContext”,

所以我们可以通过调用GenericServlet类型getServletContext()方法,来获得这个对象;

1.3.2我们也可以通过调用GenericServlet 中的init(Servletconfig conf)方法来获得ServletContext对象。

2.ServletContext的使用

2.1通过ServletContext对象读取Servlet的全局配置参数;

在web.xml 配置文件中,在<web-app>标签下定义<context-param>l来设置servlet的全局属性,所有的servlet都可以读取到这个属性。在web.xml文件中,直接在<web-app>根元素下定义的<context-param>元素中定义全局初的始化参数名和参数值。 

<context-param>

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

<param-value>value </param-value>

</context-param>

调用ServletContext接口中的getInitParameter(String name);根据定 义的参数名,返回web应用范围内的匹配的初始化参数值。

2.2通过ServletContext接口存放Web应用范围内的共享数据

在ServeletContext接口中常用的用于存取共享数据的方法包括以下几种

1.setAttribute(String name,Object object):向Web应用范围内存入共享数据,参数name  指定属性名,参数Object表示共享数据)。

2.removeAttribute(String name):表示根据参数给定,从web应的属性名用范围内删除匹配的共享数据;

3.getAttribute(String name):根据参数给定的属性名,返回从Web应用范围内匹配到的共享数据。

在web应用内范围内存放共享数据的范例:

利用ServletContext来实现统计网页被客户端访问的次数:

第一个Servlet:

//通过ServletContext接口来实现网页被客户端数访问的次数*/

public class TwoWebVisitnNmberServletContext extends HttpServlet {

    private static final long serialVersionUID = 1L;

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


        ServletContext sc=getServletContext();
        Integer number=(Integer)sc.getAttribute("visitNumber");
        if(number==null){
        sc.setAttribute("visitNumber", 1);
        }else{
        sc.setAttribute("visitNumber", ++number);
        }
        Integer number2=(Integer)sc.getAttribute("visitNumber");
        String str="<font color='red'>sdfsdfdsf</font>"+number2+"次访问";
        response.getOutputStream().write(str.getBytes());
    
    }

}

 

第二个Servlet

//通过ServletContext接口来实现网页被客户端数访问的次数*/
public class WebVisitnNmberServletContext extends HttpServlet {

    private static final long serialVersionUID = 1L;


    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        ServletContext sc=getServletContext();
        Integer number=(Integer)sc.getAttribute("visitNumber");
        if(number==null){
        sc.setAttribute("visitNumber", 1);
        }else{
        sc.setAttribute("visitNumber", ++number);
        }
        Integer number2=(Integer)sc.getAttribute("visitNumber");
        String str="<font color='red'>客户端被第</font>"+number2+"次访问";
        resp.getOutputStream().write(str.getBytes());
    }
}
使用客户端分别访问这两个servlet,方文的总数是累计的。若果乱码,把浏览器的字符编码,设置成utf-8,当然,前提是MyEclipse的字符编码本身就是utf-8.

 

2.3通过ServletContext访问服务器端的文件系统资源

2.31 访问WebRoot下的文件的资源路径

在web-root 的web-inf文件夹下新建一个文件为text.properties;

创建ServletContext对象;

调用ServletContext对象中的:getRealPath(String str):这个方法是通过参数指定的文件的相对路径(虚拟路径)来获取它的绝对路径(物理路径)

例:    public void init(ServletConfig config) throws ServletException {
    
        ServletContext sc=config.getServletContext();

        //读取webroot 下text.properties文件的物理路径(绝对路径);
        String path=sc.getRealPath("text.properties");
        System.out.println(path);

      //读取Webroot下的文件夹,加入webroot下新建一个Test文件夹:
     String path=sc.getRealPath("/Text");

      System.out.println(path);

在这里需要用斜杠:表示web工程中的根目录。实际上部署项目之后,webroot 文件夹是不存在的,打开部署到Tomcat上的web程序,会发现,项目名下面就是META-INF文件夹和WEB-INF文件夹
     

绝对路径(物理路径):是从盘符开始的路径,形如C:\windows\system32\cmd.exe

相对路径:是从当前路径开始的路径,如当前路径为C:\windows  要描述上述路径,只需输入入system32\cmd.exe 。

实际上,严格的相对路径写法应为.\system32\cmd.exe其中,.表示当前路径,在通常情况下可以省略,只有在特殊的情况下不能省略。

相对路径(虚拟路径):从当前目录开始的路径。../表示返回到上一层;

完全路径:完全路径指的是指从根目录下开始的路径;/表示根目录;

2.32读取资源文件中的内容:

public class ServletContextRealPath1 extends HttpServlet {

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

    }
    
    @Override
    public void init(ServletConfig config) throws ServletException {
        /*1.
         * 获得Web-root路径下的资源路径
         * */
        //获得ServletContext对象
        ServletContext sc=config.getServletContext();
        //根据指定资源的虚拟路径来获得资源的物理路径;(根据资源的相对路径获得资源的绝对路径)
        String path=sc.getRealPath("/Text");
        System.out.println(path);
        String str2=sc.getRealPath("/、text.properties");
        System.out.println(str2);
        
        
        /*2.
         * 读取文件中的内容
         */
        /*getResourceAsStream()方法时用来获得文件的资源流;路径写文件的完全路径,就是从根目录开始,第一个'/'表示根目录
         项目部署后WebRoot文件夹实际上是不存在的*/


        InputStream input=sc.getResourceAsStream("/WEB-INF/text.properties");//获得Web工程下的资源流
        
        //Properties 类表示了一个持久的属性集。Properties(属性集) 可保存在流中或从流中加载属性集。
        Properties pro=new  Properties();
        try {
            //从输入流中读取属性列表(键和元素对)。(从输入流中加载属性集。保存到ProPerties对象当中去。)
            pro.load(input);
            
            /*返回指定键所映射到的值,如果此映射不包含此键的映射,则返回 null;
             * 我们已经在text.properties文件中添加了内容:key=world_zheng;
             * 所以根据key键名获得映射的值,最后的值,System.out.println(pro.get("key"))打印
             * 出来的一定是world,当然这个键名不止是key,也可以是其他的字符当做键名。*/
            
            System.out.println(pro.get("key"));
        } catch (IOException e) {
    
            e.printStackTrace();
        }

    
    }
    


}
 

 

展开阅读全文

没有更多推荐了,返回首页