秒懂servletContext对象

servletContext对象

ServletContext对象,官方称为servlet上下文;服务器会为每一个web应用创建一个servletContext对象,它具有全局唯一性,web应用中的所有servlet都共享这个对象,所以也称之为全局应用程序共享对象;


作用


1.相对路径转为绝对路径;
2.获取容器的附加信息;
3.读取配置信息;
4.全局容器;

相对路径转为绝对路径

servletContext.getRealPath(“path”);
该方法可以将相对路径转为绝对路径,在文件的上传与下载的时候需要用到该方法进行路劲的转换;

案例:通过服务器下载图片到本机;

package com.bjsxt.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.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 *
 * 文件下载
 * */
public class DownFileServlet 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 {
//       当前没有这个方法,但是父类有,调用父类的方法!在GenericServlet类中
//        获取servletContext对象
        ServletContext servletContext = this.getServletContext();
//        路径转换
        String realPath = servletContext.getRealPath("image/我妻善逸.jpg");
        System.out.println(realPath);
        //        读文件
//        File file = new File("D:\\我妻善逸.jpg");
        File file = new File(realPath);
        FileInputStream fis = new FileInputStream(file);
        byte[] buff = new byte[fis.available()];
        fis.read(buff);
//        在响应中添加附加信息
//          正常情况下
//      resp.addHeader("Content-Disposition","attachment;filename="+file.getName());
//      图片为中文名字的时候(本来应该用gbk的但是本机为日文系统所以用Shift_JIS)
        resp.addHeader("Content-Disposition","attachment;filename="+
                new String(file.getName().getBytes("Shift_JIS"),"iso-8859-1"));
        OutputStream os = resp.getOutputStream();
        os.write(buff);
        os.flush();
        os.close();
    }
}

Xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
 <servlet>
        <servlet-name>downFileServlet</servlet-name>
        <servlet-class>com.bjsxt.servlet.DownFileServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>downFileServlet</servlet-name>
        <url-pattern>/down.do</url-pattern>
    </servlet-mapping>
</web-app>

获取容器的附加信息(基本信息)

1.获取servlet容器的名称以及版本号
ServletContext.getBaseInfo();(返回string类型)
2.获取容器所支持servlet的主版本号;
servletContext.getMajoyVersion();(返回int类型)
3.获取容器所支持servlet的副版本号;
servletContext.getMinorVersion();(返回int类型)
案例:查看当前servlet容器的版本号、名称,以及其所支持的servlet的版本号;

package com.bjsxt.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 {
//        设置响应的编码类型
        resp.setContentType("text/html;charset=utf-8");
        //        获取ServletContext对象
        ServletContext servletContext = this.getServletContext();
//        获取servlet容器的名称和版本号
        String serverInfo = servletContext.getServerInfo();
//        获取servlet容器所支持的servlet的主版本号;
        int majorVersion = servletContext.getMajorVersion();
//        获取servlet容器所支持的servlet的副版本号;
        int minorVersion = servletContext.getMinorVersion();
//        输出(响应)给客户端浏览器 (利用字符输出流进行拼接)
        PrintWriter out = resp.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>");
        out.println("<HTML>");
        out.println("<HEAD><TITLE> ITBZ </TITLE></HEAD>");
        out.println("<BODY>");
        out.println("servlet容器的名称以及版本:"+serverInfo+"<br/>");
        out.println("容器所支持的servlet的版本号:"+majorVersion+"\t"+minorVersion+"<br/>");
        out.println("</BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }
}

Xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
 <servlet>
        <servlet-name>getBaseInfoServlet</servlet-name>
        <servlet-class>com.bjsxt.servlet.GetBaseInfoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getBaseInfoServlet</servlet-name>
        <url-pattern>/getBaseInfo.do</url-pattern>
    </servlet-mapping>
</web-app>

获取配置信息

<context-param>
<param-name>key</param-name>
<param-value>value</param-value>
</context-param>

1.获取xml文件中的context-param标签的配置信息;
ServeltContext.getInitParameter(“key”);
2.获取xml文件中所有param-name的值;
ServletContext.getInitParameterNames();(返回一个枚举类型);
案例:获取web.xml中context-param标签下所有param-name的值以及其配置信息;

package com.bjsxt.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;

/**
 * ServletContext对象读取web.xml文件中的信息;
 * */
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();
//        获取所有的param-name的值
        Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
        PrintWriter out = resp.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>");
        out.println("<HTML>");
        out.println("<HEAD><TITLE> ITBZ </TITLE></HEAD>");
        out.println("<BODY>");
        while(initParameterNames.hasMoreElements()){
            String name = initParameterNames.nextElement();
            out.println("Name:"+name+"Value:"+servletContext.getInitParameter(name));
//            通过param—name的值获取其配置信息
        }
        out.println("</BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();


    }
}

Xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <context-param>
        <param-name>key1</param-name>
        <param-value>value1</param-value>
    </context-param>
    <context-param>
        <param-name>key2</param-name>
        <param-value>value2</param-value>
    </context-param>
    <servlet>
        <servlet-name>contextReadInfoServlet</servlet-name>
        <servlet-class>com.bjsxt.servlet.ContextReadInfoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>contextReadInfoServlet</servlet-name>
        <url-pattern>/context.do</url-pattern>
    </servlet-mapping>
</web-app>

全局容器

可以向ServletContext对象中缓冲一些数据,缓冲数据是,存储数据结构为key:value;

向ServletContext对象中缓冲数据后,其对应的web应用中的所有servlet都可以通过ServletContext对象获取该数据;

1.向ServletContext对象中存储数据;
ServletContext.setAttribute(“key”,ObjectValue);
2.从全局容器中获取数据;
servletContext.getAttribute(“key”);
3.根据key从全局容器中删除数据;
servletContext.removeAttribute(“key”);
案例:向ServletContext对象中存储数据,并在客户端浏览器上响应;

package com.bjsxt.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();
//        向全局容器中存放数据;
        servletContext.setAttribute("key1","value1");
        servletContext.setAttribute("key2","value2");
        PrintWriter out = resp.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>");
        out.println("<HTML>");
        out.println("<HEAD><TITLE> ITBZ </TITLE></HEAD>");
        out.println("<BODY>");
//        从全局容器中获取信息,获得的是object类型,需要进行强制类型转换(添加数据的时候,加入的是object类型);
        String value1 = (String)servletContext.getAttribute("key1");
        String value2 = (String)servletContext.getAttribute("key2");
        out.println("value1:"+value1+"<br/>");
        out.println("value2:"+value2+"<br/>");
        out.println("</BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }
}

Xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
 <servlet>
    <servlet-name>globalContainerServlet</servlet-name>
    <servlet-class>com.bjsxt.servlet.GlobalContainerServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>globalContainerServlet</servlet-name>
    <url-pattern>/global.do</url-pattern>
</servlet-mapping>
</web-app>

ServletContext对象的生命周期


Servlet容器启动,创建ServletContext对象,servlet容器关闭,ServletContext对象的生命周期结束;
这样看来ServletContext对象的生命周期非常长,所以不建议存放一些(经常改动的数据例如:业务数据);(可以存储一些几乎不改动的信息例如:配置信息;)

感谢您的观看;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值