栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

深度好文之Servlet技术详解(六)ServletContext对象&ServletConfig对象

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

深度好文之Servlet技术详解(六)ServletContext对象&ServletConfig对象

目录

一.ServletContext对象介绍

二.ServletContext对象的使用

1.相对路径转绝对路径

2.获取容器的附加信息

 3.获取web.xml文件中的信息 

4.全局容器

三.ServletContext对象生命周期

四.ServletConfig对象


一.ServletContext对象介绍 ServletContext 官方叫 Servlet 上下文。服务器(eg:Tomcat)会为每一个 Web 应用创建一个 ServletContext 对象。这个对象全局唯一,而且 Web 应用 中的所有 Servlet 都共享这个对象。所以叫全局应用程序共享对象。 ServletContext 对象的作用
  • 相对路径转绝对路径
  • 获取容器的附加信息
  • 读取配置信息
  • 全局容器

二.ServletContext对象的使用

1.相对路径转绝对路径 context.getRealPath("path") 该方法可以将一个相对路径转换为绝对路径,在文件上传与下载时,需要用到该方法做路径的转换。

静态资源应该放到web目录下或 web子目录下,相对路径是指相对于项目的根目录而言的,比如本节在web下创建image,将heat.jpg放到image下,则此时heat.jpg的相对路径是

"image/heat.jpg"

 之前已经讲过将项目自动部署到Tomcat的webapps目录下了,这里又新增了image文件夹,部署后如果发现webapps中的项目目录下仍没有image,则将项目目录散删除,然后冲重新部署。

如果不删除,我遇到了如下错误:

以上篇文章的文件下载案例进行稍加改造,

FileDownServlet.java:
package com.first.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

public class FileDownServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

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

        //获取ServletContext对象
        ServletContext servletContext=this.getServletContext();
        //路径转换
        String realPath=servletContext.getRealPath("image/heat.jpg");
        System.out.println("绝对路径:"+realPath);
        //读取下载文件
        File file=new File(realPath);
        //用字节输入流将文件读入
        InputStream is=new FileInputStream(file);
        
        //缓冲区
        byte[] buff =new byte[is.available()];
        //将文件读入buff中
        is.read(buff);

        //在响应中添加附加信息
        resp.addHeader("Content-Disposition", "attachment; filename="
                +new String(file.getName().getBytes("gbk"),"iso-8859-1"));
        //产生响应
        //字节输出流
        OutputStream os=resp.getOutputStream();
        os.write(buff);
        os.flush();
        os.close();
    }
}

输出:

控制台输出绝对路径:

绝对路径:D:Tomcatapache-tomcat-9.0.34webappsajaxDemoimageheat.jpg

2.获取容器的附加信息 servletContext.getServerInfo() 返回 Servlet 容器的名称和版本号 servletContext.getMajorVersion() 返回 Servlet 容器所支持 Servlet 的主版本号。 servletContext.getMinorVersion() 返回 Servlet 容器所支持 Servlet 的副版本号。
GetBaseInfoServlet.java:
package com.first.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class GetBaseInfoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext对象
        ServletContext servletContext=this.getServletContext();
        //获取容器信息
        String servletInfo=servletContext.getServerInfo();
        //获取容器支持Servlet的主版本号
        int majorVersion=servletContext.getMajorVersion();
        //获取容器支持Servlet的副版本号
        int minorVersion=servletContext.getMinorVersion();

        //设置响应编码,消除浏览器显示中文乱码
        resp.setContentType("text/plain;charset=utf-8");
        PrintWriter pw=resp.getWriter();
        pw.println("容器基本信息:"+servletInfo);
        pw.println("容器支持Servlet的版本号:"+majorVersion+"."+minorVersion);
        pw.flush();
        pw.close();
    }
}
web.xml配置:
    
        GetBaseInfoServlet
        com.first.servlet.GetBaseInfoServlet
    
    
        GetBaseInfoServlet
        /getBaseInfo.do
    

输出:

容器基本信息:Apache Tomcat/9.0.34
容器支持Servlet的版本号:4.0

 3.获取web.xml文件中的信息  servletContext.getInitParameter("key") 该方法可以读取 web.xml 文件中标签中的配置信息。 servletContext.getInitParameterNames() 该方法可以读取 web.xml 文件中所有 param-name 标签中的值。

配置web.xml中的键值对:

注意键值对的位置,要放在最上面

 ContextReadInfoServlet.java:

package com.first.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

public class ContextReadInfoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext对象
        ServletContext servletContext=this.getServletContext();
        //获取所有的的值
        Enumeration initParameterNames=servletContext.getInitParameterNames();

        resp.setContentType("text/plain;charset=utf-8");
        PrintWriter pw=resp.getWriter();
        while(initParameterNames.hasMoreElements()){
            String name=initParameterNames.nextElement();
            String value=servletContext.getInitParameter(name);
            pw.println("Name:"+name+" = Value:"+value);
        }
        pw.flush();
        pw.close();
    }
}

在web.xml中配置servlet:

    
        ContextReadInfoServlet
        com.first.servlet.ContextReadInfoServlet
    
    
        ContextReadInfoServlet
        /readInfo.do
    

输出:

Name:key1 = Value:未来
Name:key2 = Value:怎么样

4.全局容器 servletContext.setAttribute("key",ObjectValue) 向全局容器中存放数据。 servletContext.getAttribute("key") 从全局容器中获取数据。 servletContext.removeAttribute("key") 根据 key 删除全局容器中的 value 。

可以把servletContext看做是全局容器对象。

当servlet被实例化以后,tomcat会立即调用一次init来完成一些初始化的动作。所以我们可以在init中向全局容器添加一些信息 。

GlobalContainerServlet.java:
package com.first.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class GlobalContainerServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext对象
        ServletContext servletContext =this.getServletContext();
        //从全局容器中获取数据
        String value1= (String) servletContext.getAttribute("key1");
        String value2= (String) servletContext.getAttribute("key2");

        resp.setContentType("text/plain;charset=utf-8");
        PrintWriter pw=resp.getWriter();
        pw.println(value1);
        pw.println(value2);
        pw.flush();
        pw.close();
    }

    @Override
    public void init() throws ServletException {
        //获取ServletContext对象
        ServletContext servletContext =this.getServletContext();
        //向全局容器中存放数据
        servletContext.setAttribute("key1","一片舟");
        servletContext.setAttribute("key2","流浪");
    }
}

配置web.xml:

    
        GlobalContainerServlet
        com.first.servlet.GlobalContainerServlet
    
    
        GlobalContainerServlet
        /global.do
    

输出:

体现全局性,这个项目的其他servlet也可以访问全局容器

访问http://localhost:8888/ajaxDemo/global.do

再把从全局容器中获取数据的代码复制到其他servlet试试,如下

 访问http://localhost:8888/ajaxDemo/readInfo.do

三.ServletContext对象生命周期 当容器启动时会创建 ServletContext 对象并一直缓存该对象,直到容器关闭后该对象生命周期结束。 ServletContext 对象的生命周期 非常长,所以在使用全局容器时不建议存放业务数据(而是放到数据库当中)。 一般在全局容器放置一些永远不变的配置信息。

四.ServletConfig对象 ServletConfig 对象对应 web.xml 文件中的节点。当 Tomcat 初始化一个 Servlet 时,会将该 Servlet 的配置信息,封装到一个 ServletConfig 对象中。我们可以通过该对象读取节点中的配置信息。 servletConfig.getInitParameter("key") 该方法可以读取 web.xml文件中 标签中 标签中的配置信息。 servletConfig.getInitParameterNames() 该方法可以读取 web.xml文件中当前 标签中所有 标签中的值。 使用上面两个函数时只能在当前servlet中去读取配置信息,因为一个servlet对象对应一个ServletConfig对象,这也是和ServletContext读取web.xml配置信息的区别之一。

配置web.xml:

    
        GetConfigServlet
        com.first.servlet.GetConfigServlet
        
            key1
            嘻嘻
        
        
            key2
            吼吼
        
    
    
        GetConfigServlet
        /config.do
    
GetConfigServlet.java:
package com.first.servlet;

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;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

public class GetConfigServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext对象
        ServletConfig servletConfig=this.getServletConfig();

        //读取web.xml文件中当前标签中所有 标签中的值,即key
        Enumeration initParameterNames=servletConfig.getInitParameterNames();
        resp.setContentType("text/plain;charset=utf-8");
        PrintWriter pw=resp.getWriter();
        while (initParameterNames.hasMoreElements()){
            String name=initParameterNames.nextElement();
            //根据key得到value
            String value=servletConfig.getInitParameter(name);
            pw.println("name:"+name+"value:"+value);
        }
        pw.flush();
        pw.close();
    }
}

输出:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850221.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号