我是靠谱客的博主 俊秀缘分,最近开发中收集的这篇文章主要介绍ServletContext,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

package com.dymolu.javaweb.servlet;
import jakarta.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
public class Aservlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//获取响应
servletResponse.setContentType("text/html");
PrintWriter out = servletResponse.getWriter();

ServletContext 

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

获取servletontext对象

// 获取ServletContext环境对象
ServletContext application = this.getServletContext();
//页面输出
out.print("ServletContext环境对象是:" + application);
//输出结果是
//ServletContext对象是:org.apache.catalina.core.ApplicationContextFacade@413bcb3f

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

1. ServletContext是什么?

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

2. ServletContext是谁实现的?

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

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

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

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

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

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

4. ServletContext怎么理解?

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

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

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

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

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

获取所有的初始化参数的name
public Enumeration<String> getInitParameterNames(); 
通过初始化参数的name获取value
public String getInitParameter(String 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>
<!--上下文的初始化参数,以上的这些配置信息(属于全局配置,基本上不会有变动),可以通过ServletContext对象来获取-->
<!--注意:以上的配置信息属于应用级的配置信息,一般一个项目中共享的公共的配置信息会放到以上的标签当中。-->
<!--<servlet>的初始化参数属于局部配置-->
<!--如果你的配置信息只是想给某一个servlet作为参考,那么你配置到servlet标签当中即可,使用ServletConfig对象来获取。-->
// 获取上下文的初始化参数<context-param> </context-param>
Enumeration<String> initParameterNames = application.getInitParameterNames();
//遍历集合
while (initParameterNames.hasMoreElements()){
String name = initParameterNames.nextElement();//获得name
String value = application.getInitParameter(name);//根据name获取value
out.print(name + "=" + value + "<br>"); //输出结果
//startIndex=0
//pageSize=10
}

6.ServletContext对象的其他方法

6.1.获取应用的根路径(非常重要)

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

public String getContextPath();
//获取应用上下文的根路径
String contextPath = application.getContextPath();
out.print("应用上下文的根路径=" +contextPath + "<br>");
//应用上下文的根路径=/servlet04
// 获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径
// 在java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。

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

public String getRealPath(String path);
// 获取文件的绝对路径
//后面的这个路径,加了一个“/”,这个“/”代表的是web的根
// 你不加“/”,默认也是从根下开始找。
String realPath = application.getRealPath("text.html");
out.print(realPath);
//C:UsersAdministratorIdeaProjectsdymoluoutartifactsservlet04_war_explodedtext.html

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

这个日志会自动记录到 /logs目录下。

public void log(String message);
public void log(String message, Throwable t);
application.log("今天的学习很开心!");
int age = 17; // 17岁
// 当年龄小于18岁的时候,表示非法,记录日志和异常
if(age < 18) {
application.log("对不起,您未成年,请绕行!", new RuntimeException("小屁孩,快走开,不适合你!"));
}

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

catalina.2022-04-03.log  服务器端的java程序运行的控制台信息。

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

localhost_access_log.2022-04-03.txt    访问日志

7.ServletContext对象还有另一个名字:应用域

数据量小、所有用户共享、又不经常或从不修改,这样的数据放到ServletContext这个应用域当中,会大大提升效率。

因为应用域相当于一个缓存,放到缓存中的数据,下次在用的时候,不需要从数据库中再次获取,大大提升执行效率。

8.对ServletContext应用域中的数据进行操作

存(向ServletContext应用域中存数据)
方法类似 map.put(k, v)
public void setAttribute(String name, Object value);
取(从ServletContext应用域中取数据)
方法类似 Object v = map.get(k)
public Object getAttribute(String name);
删(删除ServletContext应用域中的数据)
方法类似 map.remove(k)
public void removeAttribute(String name); 
//准备数据
//单独创建一个类
public class User {
private String name;
private String password;
--------下面构造方法等代码省略--------
---------Aservlet---------
//new一个对象
User user = new User("jack", "123");
// 向ServletContext应用域当中存储数据
application.setAttribute("userObj", user);
// 取出来
Object userObj = application.getAttribute("userObj");
//删除
application.removeAttribute("userObj");

9.注意:

以后我们编写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类。

最后

以上就是俊秀缘分为你收集整理的ServletContext的全部内容,希望文章能够帮你解决ServletContext所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部