前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java-ServletContxt对象及使用

Java-ServletContxt对象及使用

作者头像
白衣少年
发布2022-12-26 13:36:25
2910
发布2022-12-26 13:36:25
举报

什么是ServletContext

Web容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext对象,这个对象代表当前Web应用。并且它被所有客户端共享(比如你在淘宝登陆了,那你的登陆信息会被带到很多页面,就是跳到其他页面发现也是登陆上的)。

ServletContext的应用

  1. 共享数据 多个Servlet通过ServletContext对象实现数据共享
    • 添加属性:setAttribute(String name, Object obj);
    • 得到值:getAttribute(String name),这个方法返回Object
    • 删除属性:removeAttribute(String name)

测试:

首先创建一个放置数据的类

代码语言:javascript
复制
package com.cheng.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 HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username = "万里顾一程";//数据
        context.setAttribute("username", "万里顾一程");//将一个数据保存在ServletContext中,username=万里顾一程
    }

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

注册Servlet

代码语言:javascript
复制
  hello
  com.cheng.servlet.HelloServlet

  
  hello
  /hello

然后创建一个接收数据的类

代码语言:javascript
复制
package com.cheng.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;

public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String attribute = (String) context.getAttribute("username");//返回值,并类型强转为String
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("名字="+attribute);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

注册Servlet

代码语言:javascript
复制
  hello1
  com.cheng.servlet.GetServlet

  
  hello1
  /hello1

启动Tomcat开始测试:

  1. 启动 HelloServlet 放置数据到ServletContext中
  2. 启动 GetServlet 从ServletContext中获得数据
名字=??.png
名字=??.png

获取配置的初始化参数

web.xml 里配置的初始化参数可以用getInitParameter()方法获取

代码语言:javascript
复制
  url
  jdbc:mysql://localhost:3306/mybatis

写一个实现类

代码语言:javascript
复制
package com.cheng.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;

public class ServletDemon03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        resp.getWriter().print(url);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

注册Servlet

代码语言:javascript
复制
  hello3
  com.cheng.servlet.ServletDemon03


  hello3
  /hello3

运行Tomcat,查看结果

获取数据.png
获取数据.png

请求转发

  1. RequestDispatcher 代表请求的派发者。
  2. Forward是指内部转发。当一个Servlet处理请求的时候,它可以决定自己不继续处理,而是转发给另一个Servlet处理。 例如,我们已经编写了一个能处理 /hello3ServletDemon03 ,继续编写一个能处理 /hello4ServletDemon04ServletDemon04 在收到浏览器的请求后,它并不自己发送响应,而是把请求和响应都转发给路径为 /hello3ServletDemon03 ,后续请求的处理实际上是由 ServletDemon03 完成的。这种处理方式称为转发( Forward ) 流程图如下所示:
请求转发.png
请求转发.png

编些一个实现请求转发的实现类

代码语言:javascript
复制
package com.cheng.servlet;

import javax.servlet.RequestDispatcher;
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;



/**
 * @User len
 * @Classname com.cheng.servlet.ServletDemon04
 * @Project javaweb-01-servlet
 * @Description TODO
 * @Author wpcheng
 * @Create 2021-02-06-18:36
 * @Version 1.0
 */
public class ServletDemon04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        //RequestDispatcher 代表请求的派发者, 只能使用绝对路径
        RequestDispatcher dispatcher = context.getRequestDispatcher("/hello3");//请求的是地址为/hello3的资源,因此该请求是由路径为/hello3的servlet实现的
        dispatcher.forward(req,resp);//内部转发
    }

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

注册路径为/hello4的servlet

代码语言:javascript
复制
  hello4
  com.cheng.servlet.ServletDemon04

  
  hello4
  /hello4

注册路径为/hello3的servlet

代码语言:javascript
复制
  hello3
  com.cheng.servlet.ServletDemon03


  hello3
  /hello3

启动Tomcat查看转发结果

查看结果.png
查看结果.png
==注:转发是在Web服务器内部完成的,对浏览器来说,它只发出了一个HTTP请求,浏览器的地址栏路径仍然是/hello4,浏览器并不知道该请求在Web服务器内部实际上做了一次转发。==

读取资源文件

类路径:即发布到Tomcat服务器后的ClassPath路径,在classes目录下 Properties可以用来保存属性集(类似Map, 以键值的形式保存数据,不同的是Properties都是String类型的)。这个类的优势是可以从流中获得属性集,或者把属性集报错到流中。 获取配置文件的信息

代码语言:javascript
复制
username=root
password=123456

实现类

代码语言:javascript
复制
package com.cheng.servlet;

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.InputStream;
import java.util.Properties;

public class ServletDemon05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // “ / ”代表了当前工程的根目录
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/jdbc.properties");
        Properties prop = new Properties();
        prop.load(is);//下载文件流
        String user = prop.getProperty("username");//通过键获取属性
        String pwd = prop.getProperty("password");
        resp.getWriter().println(user);
        resp.getWriter().println(pwd);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

注册servlet

代码语言:javascript
复制
    hello5
    com.cheng.servlet.ServletDemon05


    hello5
    /hello5

实现

实现.png
实现.png
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是ServletContext
  • ServletContext的应用
  • 测试:
    • 首先创建一个放置数据的类
      • 注册Servlet
        • 然后创建一个接收数据的类
          • 注册Servlet
            • 启动Tomcat开始测试:
            • 获取配置的初始化参数
              • 写一个实现类
                • 注册Servlet
                • 运行Tomcat,查看结果
                • 请求转发
                  • 编些一个实现请求转发的实现类
                    • 注册路径为/hello4的servlet
                      • 注册路径为/hello3的servlet
                        • 启动Tomcat查看转发结果
                        • 读取资源文件
                          • 实现类
                            • 注册servlet
                              • 实现
                              相关产品与服务
                              容器服务
                              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档