首页 > 其他分享 >Tomcat

Tomcat

时间:2023-09-05 14:57:48浏览次数:31  
标签:请求 Tomcat resp req 接口 Servlet method

参考:

 一:Tomcat核心组件及应用架构详解

Hong EuiSung –@gowoonosori :  요청처리 내부구조

 

Http 请求响应实例

 

 

Servlet 接口

为了解耦 【http服务器代码】和【业务代码】,Java就定义了一个接口,各种业务类都必须实现这个接口,这个接口就叫 Servlet 接口,有时我们也把实现了 Servlet 接口的业务类叫作 Servlet。

Servlet 接口定义了下面五个接口

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}
  • 其中最重要是的 service 方法,具体业务类在这个方法里实现处理逻辑。这个方法有两个参数:ServletRequest 和 ServletResponse。
    • ServletRequest 用来封装请求信息,ServletResponse 用来封装响应信息,因此本质上这两个类是对通信协议的封装。
    • 比如 HTTP 协议中的请求和响应就是对应了 HttpServletRequest 和 HttpServletResponse 这两个类。你可以通过 HttpServletRequest 来获取所有请求相关的信息,包括请求路径、Cookie、HTTP 头、请求参数等。还可以通过 HttpServletRequest 来创建和获取 Session。而 HttpServletResponse 是用来封装 HTTP 响应的。
  • 两个跟生命周期有关的方法 init 和 destroy
    • Servlet 容器在加载 Servlet 类的时候会调用 init 方法,在卸载的时候会调用 destroy 方法。我们可能会在 init 方法里初始化一些资源,并在 destroy 方法里释放这些资源,
    • 比如 Spring MVC 中的 DispatcherServlet,就是在 init 方法里创建了自己的 Spring 容器。
  • 还有 ServletConfig 这个类,ServletConfig 的作用就是封装 Servlet 的初始化参数。
    • 你可以在 web.xml 给 Servlet 配置参数,并在程序里通过 getServletConfig 方法拿到这些参数。

有接口一般就有抽象类,抽象类用来实现接口和封装通用的逻辑。

(接口和抽象类都不能实例化,接口只能有方法的声明不能有实现,抽象类可以有方法的实现。接口用来抽象功能,抽象类用来抽象类型)

因此 Servlet 规范提供了 GenericServlet 抽象类,我们可以通过扩展它来实现 Servlet。虽然 Servlet 规范并不在乎通信协议是什么,但是大多数的 Servlet 都是在 HTTP 环境中处理的,因此 Servet 规范还提供了 HttpServlet 来继承 GenericServlet,并且加入了 HTTP 特性。这样我们通过继承 HttpServlet 类来实现自己的 Servlet,只需要重写两个方法:doGet 和 doPost。

HttpServlet 实现的 Servlet 声明的业务方法接口 service 方法里会调用 doGet 和 doPost

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                .......省略
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }

 

Servlet 容器

当客户请求某个资源时:

  • HTTP 服务器会用一个 ServletRequest 对象把客户的请求信息封装起来,然后调用 Servlet 容器的 service 方法
  • Servlet 容器拿到请求后,根据请求的 URL 和 Servlet 的映射关系找到相应的 Servlet,如果 Servlet 还没有被加载,就用反射机制创建这个 Servlet,并调用 Servlet 的 init 方法来完成初始化,接着调用 Servlet 的 service 方法来处理请求,把 ServletResponse 对象返回给 HTTP 服务器
  • HTTP 服务器会把响应发送给客户端

扩展机制

Servlet 规范提供了两种扩展机制:Filter 和 Listener。

Filter 

允许你对请求和响应做一些统一的定制化处理。过滤器的工作原理是这样的:Web 应用部署完成后,Servlet 容器需要实例化 Filter 并把 Filter 链接成一个 FilterChain。当请求进来时,获取第一个 Filter 并调用 doFilter 方法,doFilter 方法负责调用这个 FilterChain 中的下一个 Filter。

比如你可以根据请求的频率来限制访问,或者根据国家地区的不同来修改响应内容。还有 SpringSecurity 的 SessionRepositoryFilter 就 implements 了 Filter,用来校验请求头中的 session

Listener 

当 Web 应用在 Servlet 容器中运行时,Servlet 容器内部会不断的发生各种事件,如 Web 应用的启动和停止、用户请求到达等。 Servlet 容器提供了一些默认的监听器来监听这些事件,当事件发生时,Servlet 容器会负责调用监听器的方法。当然,你可以定义自己的监听器去监听你感兴趣的事件,将监听器配置在web.xml中。

比如 Spring 就实现了自己的监听器,来监听 ServletContext 的启动事件,目的是当 Servlet 容器启动时,创建并初始化全局的 Spring 容器。

 

Tomcat 与 SpringMVC

在 SpringMVC 中,有一个名为 DispatcherServlet 的 Servlet,它充当 FrontController,并通过将请求委托给其他控制器来处理请求。

执行service(),并在方法中执行 dispatch.doService() -> doDispatch(),doDispatch 负责从 HandlerMapping 中获取handler

 

标签:请求,Tomcat,resp,req,接口,Servlet,method
From: https://www.cnblogs.com/suBlog/p/17655103.html

相关文章

  • Tomcat为什么要打破双亲委派机制
    在某些情况下,Tomcat(ApacheTomcat)需要打破双亲委派机制,主要是为了解决类加载的灵活性和可定制性的需求。Tomcat作为一个Web应用服务器,它允许部署和运行多个独立的Web应用程序,每个应用程序都有自己的类加载器。在传统的双亲委派机制下,所有的Web应用程序共享同一个父类加载器(通常是......
  • 查看Tomcat启动信息
       不久前,在配置Josso的时候,Tomcat在启动的时候,闪一下就关掉窗口了,启动失败。但启动信息没有记录下来。   Tomcat和JBoss不一样,后者可以直接在Log文件中获得启动信息,如果启动失败了,能够分析是什么原因。   通过startup.bat启动Tomcat时,会弹出......
  • 一台机器同时运行多个Tomcat服务解决方案(2017更新)
    作者:fbysss关键字:Tomcat  如何在一台服务器上安装多个Tomcat假设有2个tomcat,分别为/usr/local/tomcat/tomcat-app1/usr/local/tomcat/tomcat-app2以第一个为例:1.修改环境变量sudovi/etc/profile添加export CATALINA_HOME_APP1=/usr/local/......
  • Tomcat5.5的管理模块的几点注意事项
    作者fbysss关键字:Tomcat,adminTomcat5.5默认没有admin模块了.得单独去网站下.下载后,根据相同目录结构拷贝到tomcat下.另外需要注意几个地方:否则点击TomcatAdministration会出现"Tomcat'sadministrationwebapplicationisnolongerinstalledbydefault.Downloadandinst......
  • Eclipse+WTP+Tomcat开发的几点注意事项
    作者fbysss关键字:eclipse,wtp,tomcat       new一个server之后,会自动建立一个目录workspace/Servers/Tomcatv5.5Server@localhost-config,里面的几个文件,来自tomcat的conf目录      一旦服务运行,将自动在workspace/.metadata/.plugins/org.eclipse.wst.serv......
  • tomcat 5日志配置笔记(解决中文乱码)
    作者:fbysss关键字:Tomcat日志环境:linux前言:采用默认的tomcat日志,无法解决中文信息输出乱码的问题。tomcat5中,可以使用log4j或者javalogging配置文件对日志输出进行配置。以下是相关试验记录。如果common/lib下没有common-logging.jar和log4j.jar输出正常的日志。catalina.out记录......
  • Tomcat 项目迁移至weblogic 10笔记
    作者:fbysss关键字:TomcatWeblogicOS:WindowsXPWebAppServer:Tomat5.5WebLogic server10(中文版)IDE:Beaworkshopforweblogicplatform。一.IDE注意事项创建动态web项目,选择是否共享j2ee库,如果共享,则需要域的共享库里面包含项目所需的库,比如beeHivenetUi;不共享,则将所需的库......
  • 彻底删除tomcat-webapps目录下的自带项目
    参考文档:删除Tomcat-webapps目录自带项目-Flyin-Gaga-CSDN博客https://blog.csdn.net/flyingaga/article/details/63691634?utm_source=blogxgwz8删除Tomcat-webapps目录自带项目-Airship的个人页面-OSCHINAhttps://my.oschina.net/airship/blog/30631131.webapps目录......
  • tomcat 安装笔记 20230901
    war位置/usr/local/tomcat8_1/webapps/tomcat位置71.170/usr/local/tomcat8_1/给了点工具包位置/usr/local/tool/启动tomcatcd/usr/local/tomcat8_1/bin/./startup.sh没有权限启动cd/usr/local/tomcat8_1/bin/chmode777*启动失败没有java环境,安装下cd/usr/l......
  • linux centos7 开启tomcat不成功
    在bin文件夹下打开终端,输入./start.sh后报错权限不够解决方法:依旧在终端上输入chmod+x*.sh(网上说输入chmod+xstartup.sh也可以,但我没成功)输入ll可看到*.sh的文件都高亮此时再次输入./startup.sh即可成功 ......