Servlet

 servlet规范中接口:

核心接口(接口)         javax.servlet.Servlet

配置信息接口(接口)  javax.servlet.ServletConfig Servlet

上下文接口(接口)     javax.servlet.ServletContext Servlet

请求接口(接口)        javax.servlet.ServletRequest Servlet

响应接口(接口)        javax.servlet.ServletResponse Servlet

异常(类)                 javax.servlet.ServletException Servlet

Servlet类(抽象类)   javax.servlet.GenericServlet 

核心接口:Servlet

Servlet对象的维护:Servlet对象的生命周期是由Tomcat服务器(WEB Server)负责的。

Servlet对象的创建,对象上方法的调用,对象最终的销毁,Javaweb程序员是无权干预的。

Tomcat服务器通常我们又称为:WEB容器。

我们自己new的Servlet对象是不受WEB容器管理的。(new的Servlet对象不在容器当中)

WEB创建的Servlet对象,这些Servlet对象都会被放到一个集合当中(HashMap),只有放到这个HashMap集合中的Servlet才能够被WEB容器管理,自己new的Servlet对象不会被WEB容器管理。

web容器底层应该有一个HashMap这样的集合,在这个集合当中存储了Servlet对象和请求路径之间的关系

init 方法:

对象初始化操作,而且初始化操作只需要执行一次;例如:初始化数据库连接池,初始化线程池....

service方法:

service方法是一定要实现的,因为service方法是处理用户请求的核心方法。这个方法使用最多

destroy方法

进行资源的关闭。马上对象要被销毁了,destroy方法执行的时候Servlet对象还在,没有被销毁。

destroy方法执行结束之后,Servlet对象的内存才会被Tomcat释放。

服务器在销毁Servlet对象内存之前,Tomcat服务器会自动调用Servlet对象的destroy方法。

import javax.servlet.*;
import java.io.IOException;

public class Student implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {}

    @Override
    public ServletConfig getServletConfig() {return null;}

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}

    @Override
    public String getServletInfo() {return null;}

    @Override
    public void destroy() {}
}

抽象类GenericServlet实现了Servlet、ServletConfig接口

GenericServlet抽象类只能被继承;因为里面有一个抽象方法service:

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
}

编写一个Servlet类直接实现Servlet接口有什么缺点:我们只需要service方法,其他方法大部分情况下是不需要使用的。代码很丑陋。

适配器设计模式Adapter

GenericServlet类,这个类是一个抽象类,其中有一个抽象方法service。

GenericServlet实现Servlet接口。

GenericServlet是一个适配器。

Servlet类继承GenericServlet,重写service方法即可。

将常用的方法私有化,写为abstruct抽象方法,适配的类变为抽象类

接口:ServletConfig信息配置对象

public interface ServletConfig {

ServletConfig:是Servlet对象的信息配置对象

ServletConfig对象中封装了<servlet></servlet>标签中的配置信息。(web.xml文件中servlet的配置信息)

一个Servlet对应一个ServletConfig对象。

Servlet对象是Tomcat服务器创建,并且ServletConfig对象也是Tomcat服务器创建。并且默认情况下,他们都是在用户发送第一次请求的时候创建。

Tomcat服务器调用Servlet对象的init方法的时候需要传一个ServletConfig对象的参数给init方法。

ServletConfig接口的实现类是Tomcat服务器给实现的。(Tomcat服务器说的就是WEB服务器。)

ServletConfig接口有哪些常用的方法:

public String getInitParameter(String name); // 通过初始化参数的name获取value
public Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的name
public ServletContext getServletContext(); // 获取ServletContext对象
public String getServletName(); // 获取Servlet的name

以上方法在Servlet类当中,都可以使用this去调用。因为GenericServlet实现了ServletConfig接口。

接口:ServletContext应用域;上下文对象

public interface ServletContext {)

一个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文件。

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

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

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

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

ServletContext接口中有哪些常用的方法:

public String getInitParameter(String name); // 通过初始化参数的name获取value
public Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的name
<!--以上两个方法是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>
<!--注意:以上的配置信息属于应用级的配置信息,一般一个项目中共享的配置信息会放到以上的标签当中。-->
<!--如果你的配置信息只是想给某一个servlet作为参考,那么你配置到servlet标签当中即可,使用ServletConfig对象来获取。-->
// 获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径
// 在java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。
public String getContextPath();
//String contextPath = application.getContextPath();
// 获取文件的绝对路径(真实路径)
public String getRealPath(String path);
// 通过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 访问日志
// 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) 多线程数据安全: 数据有修改 数据共享 多人访问同一块数据

 

posted @ 2022-06-05 16:50  280887072  阅读(26)  评论(0编辑  收藏  举报