欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ServletConfig与ServletContext用法小解

程序员文章站 2022-05-08 13:33:52
...

ServletConfig与ServletContext用法小解

      在上一篇文章中笔者详细讲解Servlet的原理,并结合源码做了分析,接下来我们讲讲在Servlet中ServletConfig与ServletContext用法。

1、ServletConfig用法

      Servlet容器(如:Tomcat)每创建一个servlet后就会立刻给他们创建一个ServletConfig对象用来获取配置文件(web.xml)的参数。config内有静态块调用时加载参数,从而获得配置文件中的参数。
      在一个项目(project)中只有唯一 一个对应的servletconfig对象(自动创建),它只能读取一个Servlet的配置文件中的参数。

1.1、ServletConfig Demo

package Test;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestForServletConfig extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
              throws ServletException, IOException {

        //该方法来自他的父类:GenericServlet
        ServletConfig cfg=getServletConfig();
        String maxonline=cfg.getInitParameter("maxonline");
        System.out.println("service method maxonline:"+maxonline);  
    }

    @Override
    public void init(ServletConfig config) throws ServletException {

        System.out.println("调用有参的init");
        //ServletConfig这个对象由Servlet容器创建,自动封装了<init-param>标签里面的数据
        String maxonline=config.getInitParameter("maxonline");
        System.out.println("init method maxonline:"+maxonline );        
        //调用了父类的init方法:保证了父类的完整性,相当于在父类的基础上加了前面的代码
        super.init(config);
    }
}

1.2、web.xml配置(以下的Demo也使用本配置,下面不做重复)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name> 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>


  <!-- 1、TestForTimeServlet -->
  <servlet>
        <servlet-name>nowTime</servlet-name>
        <servlet-class>Test.TestForTimeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
        <servlet-name>nowTime</servlet-name>
        <url-pattern>/nowTime</url-pattern>
  </servlet-mapping> 


  <!-- 2、TestForServletConfig -->
  <servlet>
        <servlet-name>getParameter</servlet-name>
        <servlet-class>Test.TestForServletConfig</servlet-class>
        <init-param>    
              <param-name>maxonline</param-name>
              <param-value>3000</param-value>
        </init-param>
  </servlet>
  <servlet-mapping>
        <servlet-name>getParameter</servlet-name>
        <url-pattern>/getParameter</url-pattern>
  </servlet-mapping>


  <!--3、设置 整个项目的参数 -->
  <context-param>
        <param-name>size</param-name>
        <param-value>10</param-value>
  </context-param>


  <!-- 4、TestForServletContext -->
  <servlet>
        <servlet-name>getCount</servlet-name>
        <servlet-class>Test.TestForServletContext</servlet-class>
  </servlet>
  <servlet-mapping>
        <servlet-name>getCount</servlet-name>
        <url-pattern>/getCount</url-pattern>
  </servlet-mapping>


</web-app>

1.3、结果解析

      使用浏览器访问:http://localhost:8080/TimeServlet/getParameter 可以得到如下结果:

ServletConfig与ServletContext用法小解

      ServletConfig对象由Servlet容器在实例化Servlet对象的时候将以下标签的内容:

<init-param>    
      <param-name>maxonline</param-name>
      <param-value>3000</param-value>
</init-param>

封装到了ServletConfig对象中,每一个Servlet对象唯一对应一个了ServletConfig对象。



2、ServletContext用法

      Servlet容器启动时首先给每个项目创建唯一 一个context(公共的),内部有静态块首次调用时执行 加载了web.xml内的参数。在一个项目中唯一 一个context可以读取到多个Servlet的配置文件(一对多)。
      context可以读写变量,config只可以读常量。因为context有如下两个方法:

public abstract void setAttribute(String s, Object obj);
public abstract Object getAttribute(String s);

      而config只有getInitParameter一个:

public abstract String getInitParameter(String s);


2.1、ServletContext Demo

package Test;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestForServletContext extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
              throws ServletException, IOException {


        ServletContext ctx=getServletContext();
        String size=ctx.getInitParameter("size");
        System.out.println("size:"+size);
        Integer count= (Integer) ctx.getAttribute("count");
        //每次调用service方法我们给count属性自动累加1
        ctx.setAttribute("count", ++count);
        System.out.println("流量:"+count);

    }

    @Override
    public void init(ServletConfig config) throws ServletException {

        super.init(config);//保持重写父类的完整性

        ServletContext sc=getServletContext();
        sc.setAttribute("count", 0);

    }
}

2.2、结果解析

      使用浏览器访问: http://localhost:8080/TimeServlet/getCount 能得到如下结果:

                         ServletConfig与ServletContext用法小解

      通过这两个方法可以在ServletContext对象设置一个变量和读取一个变量:

public abstract void setAttribute(String s, Object obj);
public abstract Object getAttribute(String s);

      在Servlet容器启动的时候会将一下标签的内容封装到ServletContext对象中。

 <context-param>
        <param-name>size</param-name>
        <param-value>10</param-value>
  </context-param>

      通过以下方法可以获得其中的参数:

 public abstract String getInitParameter(String s);

上一篇: maven

下一篇: maven