Servlet_Context(上下文对象)

Servlet_Context

什么是ServletContext

概念:每个Web项目对应了一个上下文对象,上下文对象与项目(模块)是一对一的关系。

创建的时机:在Tomcat启动的时候,由Tomcat创建,我们可以在Servlet中去使用。

ServletContext是一个接口,由Tomcat实现它的类

主要作用:

  1. 读取全局的配置参数

  2. 读取web目录下的资源

  3. 得到web目录下资源的真实地址

得到上下文域的方法

ServletConfig接口中方法描述
ServletConetext getServeltContext();继承于父类,可以直接使用这个方法得到上下文对象

ServletContext:读取全局的配置参数

<?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_3_1.xsd"
         version="3.1">
    <context-param>
        <param-name>username</param-name>
        <param-value>wsl</param-value>
    </context-param>
    <context-param>
        <param-name>age</param-name>
        <param-value>18</param-value>
    </context-param>
</web-app>
package com.itheima03;

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.Enumeration;

@WebServlet("/demo01")
public class Demo01Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取上下文对象`
        ServletContext application = getServletContext();
        //读取全局参数值,username就是在web.xml文件中参数名
        String username = application.getInitParameter("username");
        System.out.println("姓名"+username);
        //读取所有的信息
        Enumeration<String> names = application.getInitParameterNames();
        while(names.hasMoreElements()){//判断是否有下一个元素
            //如果有下一个元素就获取
            String s = names.nextElement();
            String parameter = application.getInitParameter(s);
            System.out.println("参数名:"+s+" 值:"+parameter);
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

效果图

在这里插入图片描述

小结

方法功能
String getInitParameter(String name)通过参数名获取全局的参数值
Enumeration getInitParameterNames()获取所有全局参数名

ServletContext:获取当前工程的资源

需求:

在WEB-INF目录下有一张图片,要显示出来

流程:

用户访问Servlet -> 通过输入流读取文件 -> 写到浏览器上显示

好处:可以控制用户的访问,没有盗链的风险

效果
package com.itheima.servlet;

import org.apache.commons.io.IOUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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.io.InputStream;

@WebServlet("/demo03")
public class Demo03Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到一个输出流
        ServletOutputStream outputStream = response.getOutputStream();
        //得到上下文对象
        ServletContext application = getServletContext();
        InputStream inputStream = application.getResourceAsStream("/WEB-INF/VCG211126173663.jpg");
        //创建一个IOUtils
        IOUtils.copy(inputStream,outputStream);
        outputStream.close();
        inputStream.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

在这里插入图片描述

ServletContext:获取资源在服务器的真实地址

需求

读取web目录下资源,部署到服务器上真实地址,这个地址是变化的。

代码

package com.itheima.servlet;

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.io.PrintWriter;

@WebServlet("/demo04")
public class Demo04Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        ServletContext application = getServletContext();
        String path = application.getRealPath("/WEB-INF/VCG211126173663.jpg");
        out.print("图片的真实路径是:"+path);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
    }
}

效果

在这里插入图片描述

上下文域的操作方法

ServletContext方法作用
Object getAttribute(“键”)获取上下文域中值
void setAttribute(“键”, Object 值)添加或修改上下文域值
void removeAttribute(“键”)删除上下文域中指定的键和值
案例

得到当前是第几个登录的用户

分析
  1. 上下文域的操作方法
  2. 得到第几个登录用户的分析
代码
package com.itheima.servlet;

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.io.PrintWriter;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    //重写舒适化方法
    @Override
    public void init() throws ServletException {
        getServletContext().setAttribute("sum",0);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        ServletContext application = getServletContext();
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //得到用户登录的信息
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username+password);
        //判断用户名和密码是否正确
        if(username.equals("张三")&&password.equals("123")){
            //如果登录成功重新设置上下文域中的内容
            int sum = (int)application.getAttribute("sum");
            application.setAttribute("sum",++sum);
            //再告诉用户是第几个登录的
            out.print("您是第:"+ sum +"个登录");
        }else {
            out.print("登录失败");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

效果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值