JWeb之ServletContext

服务器启动的时候,为每个WEB应用创建一个单独的ServletContext对象

我们可以使用这个对象存取数据,用这个对象存取的数据可以在整个WEB应用中获得

ServletContext被称之为"Servlet上下文"

其意为"知上知下贯穿全文"!

一.获取ServletContext的四种方式

依赖类途径
ServletConfiggetServletContext()
GenericServletgetServletContext()
SessiongetServletContext()
RequestgetServletContext()

下面通过代码演示四种方式

package controller;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Author weihuanwen
 * @Date 2019/7/25 10:16
 * @Version 1.0
 */
@WebServlet(urlPatterns = "/gscs")
public class GetSCServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
            获取ServletContext对象,输出地址作为验证
         */
        //①GenericServlet获取ServletContext(
        ServletContext servletContext = getServletContext();
        System.out.println("GenericServlet ::: "+servletContext);
        //②通过session获取servletContext
        servletContext = req.getSession().getServletContext();
        System.out.println("Session ::: "+servletContext);
        //③通过request获取ServletContext
        servletContext = req.getServletContext();
        System.out.println("Request ::: "+servletContext);
    }

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

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        ServletContext servletContext = servletConfig.getServletContext();
        System.out.println("ServletConfig ::: "+servletContext);
        /*
            这里一定要调用父类init(ServletConfig config)
            这样doGet和doPost中才能获取到servletContext
            否则在获取时抛出:
                java.lang.NullPointerException
         */
        super.init(servletConfig);
    }
}

测试请求路径:http://localhost:8080/scr/gscs
控制台输出如下:

ServletConfig ::: org.apache.catalina.core.ApplicationContextFacade@190e2e16
GenericServlet ::: org.apache.catalina.core.ApplicationContextFacade@190e2e16
Session ::: org.apache.catalina.core.ApplicationContextFacade@190e2e16
Request ::: org.apache.catalina.core.ApplicationContextFacade@190e2e16

观察得知四种方式获得的ServletContext都是同一个(地址相同)

二.多个Servlet间的数据共享

1.servlet的几种常用方法介绍:

方法名描述
setAttribute(String var1, Object var2)向上下文中设置属性值
Object getAttribute(String var1)获取上下文中属性值
removeAttribute(String var1)删除上下文中属性值

2.代码演示几种常用方法以及多个servlet间的数据共享

①第一个servlet代码如下:

package controller;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Author weihuanwen
 * @Date 2019/7/25 10:16
 * @Version 1.0
 */
@WebServlet(urlPatterns = "/scsf")
public class SCServletFir extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext(
        ServletContext servletContext = getServletContext();
        System.out.println("SCServletFir获取到Servlet上下文....");
        servletContext.setAttribute("name","unknown");
        System.out.println("SCServletFir向上下文中存入数据: {'name':'unknown'}");
        String name = (String)servletContext.getAttribute("name");
        System.out.println("SCServletFir从上下文中获取name属性值 ::: "+name);
        servletContext.removeAttribute("name");
        System.out.println("SCServletFir将上下文中name属性删除!");
        name = (String)servletContext.getAttribute("name");
        System.out.println("SCServletFir从上下文中获取name属性值 ::: "+name);
        servletContext.setAttribute("name","Howie");
        System.out.println("SCServletFir向上下文中存入数据: {'name':'Howie'}");
    }

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

②第二个servlet代码如下:

package controller;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Author weihuanwen
 * @Date 2019/7/25 10:16
 * @Version 1.0
 */
@WebServlet(urlPatterns = "/scss")
public class SCServletSec extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext(
        ServletContext servletContext = getServletContext();
        System.out.println("SCServletSec获取到Servlet上下文....");
        String name = (String)servletContext.getAttribute("name");
        System.out.println("SCServletSec从上下文中获取name属性值 ::: "+name);
    }

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

③测试:

请求路径:http://localhost:8080/scr/scsf

控制台输出:

SCServletFir获取到Servlet上下文....
SCServletFir向上下文中存入数据: {'name':'unknown'}
SCServletFir从上下文中获取name属性值 ::: unknown
SCServletFir将上下文中name属性删除!
SCServletFir从上下文中获取name属性值 ::: null
SCServletFir向上下文中存入数据: {'name':'Howie'}

请求路径:http://localhost:8080/scr/scss

控制台输出:

SCServletSec获取到Servlet上下文....
SCServletSec从上下文中获取name属性值 ::: Howie

三.ServletContext读取Web资源

1.servlet的几种常用方法介绍:

方法名描述

Set getResourcePaths(String path)

获取资源目录中子目录和文件的路径名称

String getRealPath(String path)

 返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)

 如果Servlet容器不能将虚拟路径转换为文件系统的真实路径,则返回null

URL getResource(String path)

返回映射到某个资源文件的URL对象

InputStream getResourceAsStream(String path)

返回映射到某个资源文件的InputStream输入流对象(使用相对路径)

2.代码演示几种常用方法:

测试前准备:

①Set getResourcePaths(String path) 

package controller;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Set;

/**
 * @Author weihuanwen
 * @Date 2019/7/25 10:16
 * @Version 1.0
 */
@WebServlet(urlPatterns = "/scgws")
public class SCGetWebServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext
        ServletContext servletContext = getServletContext();
        //获取资源目录中子目录和文件的路径名称
        Set<String> resourcePaths = servletContext.getResourcePaths("/resources");
        //遍历输出
        for (String resourcePath : resourcePaths) {
            System.out.println(resourcePath);
        }
    }

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

测试请求路径:http://localhost:8080/scr/scgws

控制台输出:

/resources/3.mp3
/resources/2.jpg
/resources/4.mp4
/resources/1.txt

②String getRealPath(String path)

package controller;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Set;

/**
 * @Author weihuanwen
 * @Date 2019/7/25 10:16
 * @Version 1.0
 */
@WebServlet(urlPatterns = "/scgws")
public class SCGetWebServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext
        ServletContext servletContext = getServletContext();
        //获取文件完整路径
        String realPath = servletContext.getRealPath("/resource/1.txt");
        System.out.println(realPath);
    }

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

测试请求路径:http://localhost:8080/scr/scgws

控制台输出:

D:\apache-tomcat-8.5.32\webapps\ServletContextReview\resource\1.txt

③URL getResource(String path)

package controller;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URL;
import java.util.Set;

/**
 * @Author weihuanwen
 * @Date 2019/7/25 10:16
 * @Version 1.0
 */
@WebServlet(urlPatterns = "/scgws")
public class SCGetWebServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext
        ServletContext servletContext = getServletContext();
        URL url = servletContext.getResource("/resources/2.jpg");
        System.out.println(url);
    }

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

测试请求路径:http://localhost:8080/scr/scgws

控制台输出:

file:/D:/apache-tomcat-8.5.32/webapps/ServletContextReview/resources/2.jpg

④InputStream getResourceAsStream(String path)

package controller;

import utils.FileUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.util.Set;

/**
 * @Author weihuanwen
 * @Date 2019/7/25 10:16
 * @Version 1.0
 */
@WebServlet(urlPatterns = "/scgws")
public class SCGetWebServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应体编码格式
        resp.setContentType("text/html;charset=UTF-8");
        //输文本格式的响应正文前需要先获取字符输出流
        PrintWriter pw = resp.getWriter();
        //获取Servlet上下文引用
        ServletContext servletContext = getServletContext();
        //文件的相对路径
        String relativePath = "/text/noodle.txt";
        //获取文件的绝对路径-->用于获取文件编码格式
        String realPath = servletContext.getRealPath(relativePath);
        //获取目标文件输入流
        InputStream is = servletContext.getResourceAsStream(relativePath);
        //创建字符输入流读取文件内容
        InputStreamReader isr = new InputStreamReader(is,FileUtils.getCharset(realPath));
        BufferedReader br = new BufferedReader(isr);
        String lineStr = "";
        while ((lineStr = br.readLine())!=null){
            System.out.println(lineStr);
            pw.write(lineStr);
            pw.println("<br/>");
        }
        isr.close();
    }

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

测试请求路径:http://localhost:8080/scr/scgws

前端响应界面展示:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值