首页 > 其他分享 >ServletContext接口详解

ServletContext接口详解

时间:2023-05-22 13:37:56浏览次数:41  
标签:name 对象 接口 详解 ServletContext Servlet public String

1. ServletContext是什么?  14

 *  ServletContext是接口,是Servlet规范中的一员。

2. ServletContext是谁实现的?14

 *  Tomcat服务器(WEB服务器)实现了ServletContext接口。

 *  public class org.apache.catalina.core.ApplicationContextFacade implements ServletContext {}

3. ServletContext对象是谁创建的?在什么时候创建的?14

 *  ServletContext对象在WEB服务器启动的时候创建。

 *  ServletContext对象是WEB服务器创建的。

*  对于一个webapp来说,ServletContext对象只有一个。

 *  ServletContext对象在服务器关闭的时候销毁。

 4. ServletContext怎么理解?  14

 *  context是什么意思?

 *      Servlet对象的环境对象。(Servlet对象的上下文对象。)

 *  ServletContext对象其实对应的就是整个web.xml文件。

 *  50个学生,每个学生都是一个Servlet,这50个学生都在同一个教室当中。那么这个教室就相当于ServletContext对象。

 *  放在ServletContext对象当中的数据,所有Servlet一定是共享的。

 *  比如:一个教室中的空调是所有学生共享的,一个教室中的语文老师是所有学生共享的。

 *  Tomcat是一个容器,一个容器当中可以放多个webapp,一个webapp对应一个ServletContext对象。

4.1 Servlet小总结   15

一个Servlet对象对应一个ServletConfig。100个Servlet对象则对应100个ServletConfig对象。

- 只要在同一个webapp当中,只要在同一个应用当中,所有的Servlet对象都是共享同一个ServletContext对象的。

- ServletContext对象在服务器启动阶段创建,在服务器关闭的时候销毁。这就是ServletContext对象的生命周期。ServletContext对象是应用级对象。

- Tomcat服务器中有一个webapps,这个webapps下可以存放webapp,可以存放多个webapp,假设有100个webapp,那么就有100个ServletContext对象。但是,总之,一个应用,一个webapp肯定是只有一个ServletContext对象。

- ServletContext被称为Servlet上下文对象。(Servlet对象的四周环境对象。)

- 一个ServletContext对象通常对应的是一个web.xml文件。

4.2 ServletContext对应显示生活中的什么例子呢?15

  - 一个教室里有多个学生,那么每一个学生就是一个Servlet,这些学生都在同一个教室当中,那么我们可以把这个教室叫做ServletContext对象。那么也就是说放在这个ServletContext对象(环境)当中的数据,在同一个教室当中,物品都是共享的。比如:教室中有一个空调,所有的学生都可以操作。可见,空调是共享的。因为空调放在教室当中。教室就是ServletContext对象。

- ServletContext是一个接口,Tomcat服务器对ServletContext接口进行了实现。

- ServletContext对象的创建也是Tomcat服务器来完成的。启动webapp的时候创建的。

5.  ServletContext接口中有哪些常用的方法?15

5.1 getInitParameter(String name)和 getInitParameterNames()

    public String getInitParameter(String name); // 通过初始化参数的name获取value

 getInitParameterNames(); // 获取所有的初始化参数的name


   <context-param>
        <param-name>pageSize</param-name>
        <param-value>10</param-value>
    </context-param>
    <context-param>
        <param-name>startIndex</param-name>
        <param-value>0</param-value>
    </context-param>



5.2 getContextPath()获取应用的根路径  15

获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径

在java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。

 public String getContextPath();

 String contextPath = application.getContextPath();

5.3  getRealPath(String path)获取文件的绝对路径  15

 获取文件的绝对路径(真实路径)

    public String getRealPath(String path);

5.4 log()记录日志   15

通过ServletContext对象也是可以记录日志的

    public void log(String message);

    public void log(String message, Throwable t);

 这些日志信息记录到哪里了?

 localhost.2021-11-05.log


Tomcat服务器的logs目录下都有哪些日志文件?

catalina.2021-11-05.log 服务器端的java程序运行的控制台信息。

localhost.2021-11-05.log ServletContext对象的log方法记录的日志信息存储到这个文件中。

localhost_access_log.2021-11-05.txt 访问日志

5.5 ServletContext对象还有另一个名字:应用域  16

ServletContext对象还有另一个名字:应用域(后面还有其他域,例如:请求域、会话域)

如果所有的用户共享一份数据,并且这个数据很少的被修改,并且这个数据量很少,可以将这些数据放到ServletContext这个应用域中


 为什么是所有用户共享的数据? 不是共享的没有意义。因为ServletContext这个对象只有一个。只有共享的数据放进去才有意义。


为什么数据量要小? 因为数据量比较大的话,太占用堆内存,并且这个对象的生命周期比较长,服务器关闭的时候,这个对象才会被销毁。大数据量会影响服务器的性能。占用内存较小的数据量可以考虑放进去。


为什么这些共享数据很少的修改,或者说几乎不修改?

所有用户共享的数据,如果涉及到修改操作,必然会存在线程并发所带来的安全问题。所以放在ServletContext对象中的数据一般都是只读的。


数据量小、所有用户共享、又不修改,这样的数据放到ServletContext这个应用域当中,会大大提升效率。因为应用域相当于一个缓存,放到缓存中的数据,下次在用的时候,不需要从数据库中再次获取,大大提升执行效率。


    // 存(怎么向ServletContext应用域中存数据)

    public void setAttribute(String name, Object value); // map.put(k, v)

    // 取(怎么从ServletContext应用域中取数据)

    public Object getAttribute(String name); // Object v = map.get(k)

    // 删(怎么删除ServletContext应用域中的数据)

    public void removeAttribute(String name); // map.remove(k)

代码在com.bjpowernode.javaweb.servlet

AServlet

package com.bjpowernode.javaweb.servlet;

import jakarta.servlet.*;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

//ServletContext接口详解   14-15
public class AServlet extends GenericServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        //获取ServletContext对象
        ServletContext application = this.getServletContext();
        //输出结果
        //ServletContext对象是:org.apache.catalina.core.ApplicationContextFacade@59363a65
        out.print("ServletContext对象是:"+application);

        out.print("
");

        //获取上下文的初始化参数   15
        Enumeration initParameterNames = application.getInitParameterNames();
        //遍历
        while(initParameterNames.hasMoreElements()){//判断是否有更多元素
            String name = initParameterNames.nextElement();//取元素
            String value = application.getInitParameter(name);
            out.print(name+" = "+value+"
");
        }

        //获取context path(获取应用的上下文的根)   15
        String contextPath = application.getContextPath();
        out.print(contextPath+"
");//   /servlet04

        //获取index.html文件的绝对路径  15
        // 后面的这个路径,加了一个“/”,这个“/”代表的是web的根
        //String realPath = application.getRealPath("/index.html");//可以
        String realPath = application.getRealPath("index.html");//不加"/"也可以
        //E:\java学习\javaWeb\course\course8\out\artifacts\course8_war_exploded\index.html
        out.print(realPath);

        out.print("
");

        //获取common目录下的common.html文件的绝对路径  15
        String realPath1 = application.getRealPath("/common/common.html");
        //E:\java学习\javaWeb\course\course8\out\artifacts\course8_war_exploded\common\common.html
        out.print(realPath1+"
");

        //记录日志log()   15
        // 这个日志会自动记录到哪里呢?
        // CATALINA_HOME/logs目录下。
        //application.log("大家好,我是动力节点杜老师,欢迎大家和我一起学习Servlet规范!");
        application.log("你好中国");

        //log还可记录异常日志
        int age = 17; // 17岁
        // 当年龄小于18岁的时候,表示非法,记录日志
        if(age < 18) {
            application.log("对不起,您未成年,请绕行!"
                    , new RuntimeException("小屁孩,快走开,不适合你!"));
        }


        //ServletContext对象还有另一个名字:应用域   16
        //如果所有的用户共享一份数据,并且这个数据很少的被修改,
        // 并且这个数据量很少,可以将这些数据放到ServletContext这个应用域中
        //准备数据
        User user = new User("jack","123");
        //向ServletContext应用域当中存储数据(存储User对象)
        application.setAttribute("userObj",user);
        //取出来
        Object userObj = application.getAttribute("userObj");
        //打印到浏览器
        out.print(userObj+"
");//User{name='jack', password='123'}


    }
}

BServlet

package com.bjpowernode.javaweb.servlet;

import jakarta.servlet.*;

import java.io.IOException;
import java.io.PrintWriter;

//ServletContext接口详解   14
public class BServlet extends GenericServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        //获取ServletContext对象
        ServletContext application = this.getServletContext();
        //输出结果
        //ServletContext对象是:org.apache.catalina.core.ApplicationContextFacade@59363a65
        out.print("ServletContext对象是:"+application);

        out.print("
");

        //ServletContext对象还有另一个名字:应用域   16
        //取出AServlet存的User对象共享资源来    16
        Object userObj = application.getAttribute("userObj");
        //打印到浏览器
        out.print(userObj+"
");//User{name='jack', password='123'}

    }
}

User类,验证应用域的

package com.bjpowernode.javaweb.servlet;

public class User {
    private String name;
    private String password;

    public User() {
    }

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

配置文件web.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">


<!--    上下文的初始化参数,一下的这些配置信息,可以通过ServletContext对象来获取-->
    <context-param>
        <param-name>pagesize</param-name>
        <param-value>10</param-value>
    </context-param>
    <context-param>
        <param-name>startIndex</param-name>
        <param-value>0</param-value>
    </context-param>

<!--    这是AServlet的web配置信息-->
    <servlet>
        <servlet-name>aservelt</servlet-name>
        <servlet-class>com.bjpowernode.javaweb.servlet.AServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>aservelt</servlet-name>
        <url-pattern>/a</url-pattern>
    </servlet-mapping>

<!--    这是BServlet的web配置信息-->
    <servlet>
        <servlet-name>bservelt</servlet-name>
        <servlet-class>com.bjpowernode.javaweb.servlet.BServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>bservelt</servlet-name>
        <url-pattern>/b</url-pattern>
    </servlet-mapping>

</web-app>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>common html</title>
</head>
<body>
<h1>common data</h1>
</body>
</html>

common.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>common html</title>
</head>
<body>
<h1>common data</h1>
</body>
</html>

6. 重点  16

注意:以后我们编写Servlet类的时候,实际上是不会去直接继承GenericServlet类的,因为我们是B/S结构的系统,这种系统是基于HTTP超文本传输协议的,在Servlet规范当中,提供了一个类叫做HttpServlet,它是专门为HTTP协议准备的一个Servlet类。我们编写的Servlet类要继承HttpServlet。(HttpServlet是HTTP协议专用的。)使用HttpServlet处理HTTP协议更便捷。但是你需要直到它的继承结构:

jakarta.servlet.Servlet(接口)【爷爷】

    jakarta.servlet.GenericServlet implements Servlet(抽象类)【儿子】

     jakarta.servlet.http.HttpServlet extends GenericServlet(抽象类)【孙子】


    我们以后编写的Servlet要继承HttpServlet类。

标签:name,对象,接口,详解,ServletContext,Servlet,public,String
From: https://blog.51cto.com/u_15784725/6323335

相关文章

  • Java使用HttpClient以multipart/form-data向接口上传文件
    前言对接某公司的接口,涉及到资质上传等业务。需要对接他们的上传附件接口。JDK1.8httpclient4.x封装httpclient方法publicstaticStringpostFileMultiPart(Stringurl,Map<String,ContentBody>reqParam)throwsIOException{ CloseableHttpClienthttpclient=HttpCl......
  • 基于 Socket 接口实现自定义协议通信
    访问【WRITE-BUG数字空间】_[内附完整源码和文档]根据自定义的协议规范,使用Socket编程接口编写基本的网络应用软件。掌握C语言形式的Socket编程接口用法,能够正确发送和接收网络数据包开发一个客户端,实现人机交互界面和与服务器的通信开发一个服务端,实现并发处理多个客户端......
  • 计算机组成原理:系统总线与总线接口实验
    实验名称:3.系统总线与总线接口实验实验目的理解总线的概念及其特性。掌握控制总线的功能和应用。理解总线的功能和和典型工作流程。掌握在总线上协调ALU和外设交换数据的方法。实验设备PC机一台,TDX-CMX实验系统一套。实验预习1、阅读实验指导书,然后回答问题。本实......
  • 学习笔记-Java8新特性-第六节-接口中的默认方法与静态方法
    接口中的默认方法与静态方法默认方法在接口中可以使用default修饰方法,为方法提供默认实现publicinterfaceMyInterface{defaultvoidgetName(){System.out.println("DEFAULT");}}一般情况下,继承了接口的子类,可以不提供接口的实现类优先......
  • Android ContentProvider详解
    一.Android四大组件Android四大组件是Activity,Service,ContentProvider,BroadcastReceiver。Activity作为程序界面,直接与用户交互Service运行在后台,没有界面,完成特定的功能ContentProvider维护应用数据,方便应用本身或其它应用访问BroadcastReceiver提供异步广播消息接收机制,......
  • JAVA中的接口详解
    JAVA中的接口详解接口中成员的特点成员变量:只能是常量默认修饰符:public,static,final构造方法:没有成员方法:只能是抽象方法默认修饰符:public,abstract 接口和类的关系类和类的关系:继承关系,只能是单继承,不能多继承,但可以多层继承类和接口的关系:实现关系,可单实现,也可多实......
  • mysql联合索引详解
    所有的MySQL列类型能被索引。在相关的列上的使用索引是改进SELECT操作性能的最好方法。一、前缀索引对于CHAR和VARCHAR列,你可以索引列的前缀。这更快并且比索引整个列需要较少的磁盘空间。在CREATETABLE语句中索引列前缀的语法看起来像这样:KEYindex_name(col_name(length))下面......
  • DataFrameGroupBy.agg详解
    DataFrameGroupBy.agg(arg, *args, **kwargs)[source]Aggregateusingcallable,string,dict,orlistofstring/callablesParameters:funcFunctiontouseforaggregatingthedata.Ifafunction,musteitherworkwhenpassedaDataFrameorwhenpassedto......
  • knife4j配置swagger接口测试
    导入依赖1<dependency>2<groupId>com.github.xiaoymin</groupId>3<artifactId>knife4j-spring-boot-starter</artifactId>4<version>3.0.3</version>5......
  • 2023/5/21每日随笔 调用chatgpt接口实现项目的基本需要
    首先,对于我要求的工作,gpt完美胜任,那么问题来了,怎么调用chatgpt,是可以免费调用的,但需要keyword,也就得进入chatgpt官网,就得用外网,但是要它的api应用到android上,外网手段就不可取了,于是,准备冲别人搭建的平台上调用,很幸运的是,在B站上还真的找到资源,up主也很好,教我一步一实现,搭建了以......