您的位置:首页 > 其它

05-Servletconfig&ServletCOntext

2012-08-02 00:15 253 查看

一、 ServletConfig 对象

作用 : 封装 Servlet 初始化参数

1. 可以在 web.xml 文件中 Servlet 元素下 为Servlet配置初始化参数

<init-param>
        <param-name>name</param-name>
        <param-value>aaaa</param-value>
</init-param>

2. web 容器在初始化Servlet时,会将初始化参数封装到一个 ServletConfig 对象中,传给init方法

 

3. 我们在Servlet 中覆写 init方法,就可以获得ServletConfig

 

4. 父类 GenericServlet 中定义了一个成员变量用于记住此对象,并提供了 getServletConfig 方法

我们可以直接调用此方法 获得 config 对象

 

5. 再调用 getInitParameter(name) 方法获得想要配置项

// 指定编码
       // 获得ServletConfig 对象
       ServletConfig config = getServletConfig();
       String encoding = config.getInitParameter("encoding");
      
      
       System.out.println("encoding=" + encoding);

 

二、 ServletContext 对象

1. ServletContext对象代表整个web应用

2. ServletContext对象是一个域对象(可以存储数据的对象)

ServletContext对象的内部维护了一个map集合, key是String类型 value是Object类型

class ServletContext {

    private Map<String, Object> map ;

}

 

3. ServletContext 作为域对象, 多个Servlet 可以共享数据

Servlet6

// 1. 获得ServletContext 对象
ServletContext context = getServletContext();
// 2. 存入域
context.setAttribute(“name”, “zhangsan”);

 

Servlet7

// 获得 context 域, getAttribute
String name = (String) getServletContext().getAttribute("name");

 

4.获取web应用的初始化参数

    getContext().getInitParameter(“name”);

 

5. 统计一个web应用的访问量

   在 context
域中维护一个count变量

   访问Servlet时,取出变量加1

 

6. 实现请求转发

实现请求转发需要用到转发对象 RequestDispatcher

有一个 forward
方法能转发请求

 

7. 如何读取工程中的文件

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

       // 获得绝对路径
      String realPath = ServletContext.getRealPath(相对web应用的路径);
    注意URL url =  ServletContext.getResource();  web的url
       // 获得与文件关联的流
       InputStream in=
 ServletContext.getResourceAsStream(“WEB-INF/classes/config.properties”;

 

7.2   读取java工程下的文件

   // 不能相对虚拟机目录不能用绝对路径

   // 只能类加载的方式读

    // 获得 流
    ClassLoader classLoader = Demo.class.getClassLoader(); 

      
    InputStream in = classLoader.getResourceAsStream("a.txt");

 

    // 获得绝对路径
    URL url = Demo.class.getClassLoader().getResource("a.txt");
 
    String path = url.getPath();

 

类加载方式缺点

1)不能读取类路径以外文件

2)  由于需要加载到内存,不能读大文件

 

web工程中如果用类加载的方式读

类加载实际上读取的是内存中加载的文件,此时将读不到硬盘上资源文件的修改

解决办法Demo.class.getClassLoader().getResource("a.txt").getPath()

通过绝对路径去读硬盘上的文件  避开内存的文件

三、 Servlet缓存

    HttpServlet 的 Service方法中的代码

       // 调用方法
long lastModified = getLastModified(req);
       // 如果为 -1 ,就直接放行,给最新的
            if (lastModified == -1) {
                doGet(req, resp);
}
// 方法返回不是-1

 else {
    // 读取IE发送的头If-Modified-Since
                long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
              // 拿着客户端的时间头和方法的返回值比较
                if (ifModifiedSince < (lastModified / 1000 * 1000)) {
                    // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
                  // 方法的返回值大于ie发送过来的时间头
                  // 重新向浏览器发送了一个时间头
                    maybeSetLastModified(resp, lastModified);
                  // 放行, 发送页面
                    doGet(req, resp);
                } else {
                  // 方法的返回值没有大于ie发送过来的时间头
                  // 发送 304 状态码,让用户去读缓存
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                }
            }

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: