javaweb入门(一)——servlet-03-servletContext对象

一.Servlet类的学习

创建一个新的子项目,在子项目中新建一个"HelloServlet"类,并且配置对应的映射。
代码如下:
HelloServlt.java

package com.kuang.servlet;

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 HelloServlet extends HttpServlet {
    
    

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.print("Hello");
        resp.getWriter().print("Hello,Servlet");
    }

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

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"
         metadata-complete="true">
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

项目结构如下:
在这里插入图片描述

对HelloServlet中继承方法解析

之后我们便可以在HelloServlet类中使用this.XXX来查看HelloServlet都继承了那些方法,以及这些方法的用处。
在这里插入图片描述
在这里插入图片描述
首先我们可以先确定do…()的方法,这些方法都是Servlet.service中根据请求方法来选择运行的方法,具体有以下几个:

// 这些都是service方法中根据req请求方法而选择运行的方法
        this.doPost();
        this.doGet();
        this.doDelete();
        this.doHead();
        this.doOptions();
        this.doPut();
        this.doTrace();

这些方法我们会在之后的学习中使用到。以后使用到时可以详细的学习。
之后我们可以来看看get开头的方法。这些方法我们可以根据名字轻松的看出来它们获取的信息。这些方法如下:

		this.getInitParameter();
        this.getLastModified();
        this.getServletConfig();
        this.getServletInfo();
        this.getServletName();
        this.getInitParameterNames();
        this.getServletContext();
        this.getClass();

this.getInitParameter() 方法

其中我们需要了解this.getInitParameter()方法。根据方法名我们不能看出它是获取servlet初始化参数的方法,那么servlet初始化参数是什么?它又是怎么设置的呢?
我们在web.xml中的<servlet>标签中,我们发现它有一个<init-paramter>,我们可以在这个标签中设置初始化参数名称以及

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
<!--    设置此servlet的初始化参数-->
    <init-param>
<!--      初始化参数名称-->
      <param-name>MyName</param-name>
<!--      初始化参数的值-->
      <param-value>BugMaker2000</param-value>
    </init-param>
  </servlet>

如上我们设置了一个名称是"MyName",值是"BugMaker2000"的初始化参数。
现在我们在HelloServlet中进行测试。
HelloServlet中添加如下代码:

resp.getWriter().println("MyName : " + this.getInitParameter("MyName"));

之后我们访问’…/hello’,结果如下:
在这里插入图片描述
初始化参数被成功获取。

其余的方法有:

        this.clone();
        this.equals();
        this.hashCode();
        this.toString();
        this.destroy();
        this.init();
        this.log();
        ...

这些方法我们可以根据字面意思快速了解其含义,在此就不一一赘述。感兴趣的小伙伴可以自己去阅读源码。

ServletContext对象

在刚刚我们对this.XX方法的分析中,我们不难发现其中有一个this.getServletContext()的方法。
看到本章节的标题,想必大家也能猜到,这个ServletContext便是本章的主角。
那么我们不禁想问:什么是ServletContext?它有什么作用?

什么是ServletContext?

ServletContext是一个全局的储存信息的空间,服务器开始就存在,服务器关闭才释放。

推荐阅读本篇博客:ServletContext详解

我们可以做一个总结ServletContext是一个可以被所有客户端访问、被所有servlet共享的一个公共空间web容器启动时,会为每个web应用创建一个ServletContext
重点是共享数据以及与web应用在web容器中存在时间相同
每个web应用有且仅有一个ServletContext.

ServletContext的作用

由于ServletContext作为一个共享的空间,所以servlet之间可以通过ServletContext通讯。
使用ServletContext的案例有:公共聊天室。

ServletContext使用案例

在本案例中,我们会对ServletContext共享数据功能做出一个基本的使用。
测试方法:

  1. 创建一个SetServletContext类,此类的作用是向ServletContext中放入一条数据。
  2. 创建一个GetServletContext类,此类的作用是向ServletContext中获取SerServlet放入的数据。
  3. 配置两个类的映射
  4. 启动服务器测试。

1.创建SetServletContext类。

package com.kuang.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 SetServletContext extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
//        向ServletContext中放入一条数据
        
        String message = "我的名字是BugMaker2000";
        ServletContext servletContext = this.getServletContext();
        servletContext.setAttribute("Message",message);

    }

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

2.创建GetServletContext类。

package com.kuang.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 GetServletContext extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
//        获取servletContext中的数据
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
//        这两句话可以用 resp.setContentType("text/html;charset=utf-8"); 代替
        ServletContext servletContext = this.getServletContext();
        PrintWriter writer = resp.getWriter();
        writer.print("信息 : " + servletContext.getAttribute("Message"));
    }

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

3.设置两个Servlet的映射。

  <servlet>
    <servlet-name>setServletContext</servlet-name>
    <servlet-class>com.kuang.servlet.SetServletContext</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>setServletContext</servlet-name>
    <url-pattern>/setServletContext</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>getServletContext</servlet-name>
    <servlet-class>com.kuang.servlet.GetServletContext</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>getServletContext</servlet-name>
    <url-pattern>/getServletContext</url-pattern>
  </servlet-mapping>

4.测试结果:
我们先访问’/setServletContext’
在这里插入图片描述
此时ServletContext中已经被插入了我们设置好的数据。
之后我们再访问’/getServletContext’:
在这里插入图片描述
我们可以看到数据别成功获取并且输出。

小知识:
在GetServletContext中,我们添加了两行代码:

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");

这两行的代码的作用是:设置响应输出的内容类型以及设置响应的编码格式。如果我们响应中输出的内容带有中文,那么resp.setCharacterEncoding("utf-8");此行代码必不可缺,否则页面输出的中文将会是乱码。resp.setContentType("text/html");这行代码的作用是设置响应输出的文本内容的类型,此处设置的参数为text/html是的页面响应输出的内容中可以带有HTML格式,并且可以被页面识别。
此外,这两行代码可以用一行代码代替:

resp.setContentType("text/html;charset=utf-8"); 

本章完结。