1.å¦ä½ç解 servlet çåå®ä¾å¤çº¿ç¨
2.Servlet源码和Tomcat源码解析
3.servlet httpservletresponse线ç¨å®å
¨å
å¦ä½ç解 servlet çåå®ä¾å¤çº¿ç¨
ervlet容å¨é»è®¤æ¯éç¨åå®ä¾å¤çº¿ç¨çæ¹å¼å¤çå¤ä¸ªè¯·æ±çï¼
1. å½webæå¡å¨å¯å¨çæ¶åï¼æ客æ·ç«¯åé请æ±å°æå¡å¨æ¶ï¼ï¼Servlet就被å 载并å®ä¾åï¼åªåå¨ä¸ä¸ªServletå®ä¾ï¼ï¼
2. 容å¨åå§åServletã主è¦å°±æ¯è¯»åé ç½®æ件ï¼ä¾å¦tomcatï¼å¯ä»¥éè¿servlet.xmlç<Connector>设置线ç¨æ± ä¸çº¿ç¨æ°ç®ï¼åå§å线ç¨æ± ï¼éè¿web.xmlï¼åå§åæ¯ä¸ªåæ°å¼ççï¼ï¼
3. å½è¯·æ±å°è¾¾æ¶ï¼Servlet容å¨éè¿è°åº¦çº¿ç¨ï¼Dispatchaer Threadï¼è°åº¦å®ç®¡çä¸ç线ç¨æ± ä¸çå¾ æ§è¡ç线ç¨ï¼Worker Threadï¼ç»è¯·æ±è ï¼
4. 线ç¨æ§è¡Servletçserviceæ¹æ³ï¼
5. 请æ±ç»æï¼æ¾å线ç¨æ± ï¼çå°è¢«è°ç¨ï¼
ç±ä»¥ä¸å¯å¾ãã线ç¨ä¸æ¯servletæ¬èº«ãèæ¯tomcatæå¡å¨ä»çº¿ç¨æ± ä¸åé ä¸ä¸ªçº¿ç¨ããç¶åæ§è¡httpservletçdopostæ¹æ³ããæ¬èº«æ¯çº¿ç¨ä¸å®å ¨çã
Servlet源码和Tomcat源码解析
画的码线不好,请将就。码线
我一般用的码线IDEA,很久没用Eclipse了,码线所以刚开始怎么继承不了HttpServlet类,码线然后看了一眼我创建的码线下载模板源码是Maven项目,然后去Maven仓库粘贴了Servlet的码线坐标进来。
maven坐标获取,码线直接百度maven仓库,码线选择第二个。码线
然后搜索Servlet选择第二个。码线
创建一个类,码线不是码线接口,继承下HttpServlet。码线
Servlet接口包括:init()、码线service()、qq短网址源码destroy()和getServletInfo()。其中init()方法负责初始化Servlet对象,容器创建好Servlet对象后会调用此方法进行初始化;service()方法处理客户请求并返回响应,容器接收到客户端要求访问特定的Servlet请求时会调用此方法;destroy()方法负责释放Servlet对象占用的资源;getServletInfo()方法返回一个字符串,包含Servlet的创建者、版本和版权等信息。
ServletConfig接口包含:getServletName()、getServletContext()、getInitParameter(String var1)和getInitParameterNames()。其中getServletName()用于获取Servlet名称,getServletContext()获取Servlet上下文对象,getInitParameter(String var1)获取配置参数,getInitParameterNames()返回所有配置参数的名字集合。
GenericServlet抽象类实现了Servlet接口的同时,也实现了ServletConfig接口和Serializable接口。html源码小程序它提供了一个无参构造方法和一个实现init()方法的构造方法。GenericServlet中的init()方法保存了传递的ServletConfig对象引用,并调用了自身的无参init()方法。它还实现了service()方法,这是Servlet接口中的唯一没有实现的抽象方法,由子类具体实现。
HttpServlet是Servlet的默认实现,它是与具体协议无关的。它继承了GenericServlet,并实现了Servlet接口和ServletConfig接口。HttpServlet提供了一个无参的init()方法、一个无参的destroy()方法、一个实现了getServletConfig()方法的方法、一个返回空字符串的getServletInfo()方法、以及一个实现了service()方法的方配wms源码抽象方法。service()方法的实现交给了子类,以便在基于HTTP协议的Web开发中具体实现。
Tomcat的底层源码解析如下:
Server作为整个Tomcat服务器的代表,包含至少一个Service组件,用于提供特定服务。配置文件中明确展示了如何监听特定端口(如)以启动服务。
Service是逻辑功能层,一个Server可以包含多个Service。Service接收客户端请求,解析请求,完成业务逻辑,然后将处理结果返回给客户端。Service通常提供start方法打开服务Socket连接和监听服务端口,以及stop方法停止服务并释放网络资源。
Connector称为连接器,久些轰炸源码是Service的核心组件之一。一个Service可以有多个Connector,用于接收客户端请求,将请求封装成Request和Response,然后交给Container进行处理。Connector完成请求处理后,将结果返回给客户端。
Container是Service的另一个核心组件,按照层级有Engine、Host、Context、Wrapper四种。一个Service只有一个Engine,它是整个Servlet引擎,负责执行业务逻辑。Engine下可以包含多个Host,一个Tomcat实例可以配置多个虚拟主机,默认情况下在conf/server.xml配置文件中定义了一个名为Catalina的Engine。Engine包含多个Host的设计使得一个服务器实例可以提供多个域名的服务。
Host代表一个站点,可以称为虚拟主机,一个Host可以配置多个Context。在server.xml文件中的默认配置为appBase=webapps,这意味着webapps目录中的war包将自动解压,autoDeploy=true属性指定对加入到appBase目录的war包进行自动部署。
Context代表一个应用程序,即日常开发中的Web程序或一个WEB-INF目录及其下面的web.xml文件。每个运行的Web应用程序最终以Context的形式存在,每个Context都有一个根路径和请求路径。与Host的区别在于,Context代表一个应用,如默认配置下webapps目录下的每个目录都是一个应用,其中ROOT目录存放主应用,其他目录存放子应用,而整个webapps目录是一个站点。
Tomcat的启动流程遵循标准化流程,入口是BootStrap,按照Lifecycle接口定义进行启动。首先调用init()方法逐级初始化,接着调用start()方法启动服务,同时伴随着生命周期状态变更事件的触发。
启动文件分析Startup.bat:
设置CLASSPATH和MAINCLASS为启动类,并指定ACTION为启动。
Bootstrap作为整个启动时的入口,在main方法中使用bootstrap.init()初始化容器相关类加载器,并创建Catalina实例,然后启动Catalina线程。
Catalina Lifecycle接口提供了一种统一管理对象生命周期的接口,通过Lifecycle、LifecycleListener、LifecycleEvent接口,Catalina实现了对Tomcat各种组件、容器统一的启动和停止方式。在Tomcat服务开启过程中,启动的一系列组件、容器都实现了org.apache.catalina.Lifecycle接口,其中的init()、start()和stop()方法实现了统一的启动和停止管理。
加载方法解析server.xml配置文件,加载Server、Service、Connector、Container、Engine、Host、Context、Wrapper一系列容器,加载完成后调用initialize()开启新的Server实例。
使用Digester类解析server.xml文件,通过demon.start()方法调用Catalina的start方法。Catalina实例执行start方法,包括加载server.xml配置、初始化Server的过程以及开启服务、初始化并开启一系列组件、子容器的过程。
StandardServer实例调用initialize()方法初始化Tomcat容器的一系列组件。在容器初始化时,会调用其子容器的initialize()方法,初始化子容器。初始化顺序为StandardServer、StandardService、StandardEngine、Connector。每个容器在初始化自身相关设置的同时,将子容器初始化。
servlet httpservletresponse线ç¨å®å ¨å
Servlet容å¨é»è®¤éç¨åå®ä¾å¤çº¿ç¨çæ¹å¼æ¥å¤ç请æ±ï¼é»è®¤æ¯é线ç¨å®å ¨ç
ä¸. Servlet容å¨å¦ä½åæ¶æ¥å¤çå¤ä¸ªè¯·æ±
å 说æå 个æ¦å¿µï¼
å·¥ä½è 线ç¨Work Thread:æ§è¡ä»£ç çä¸ç»çº¿ç¨
è°åº¦çº¿ç¨Dispatcher Threadï¼æ¯ä¸ªçº¿ç¨é½å ·æåé ç»å®ç线ç¨ä¼å 级,线ç¨æ¯æ ¹æ®ä¼å 级è°åº¦æ§è¡ç
Servletéç¨å¤çº¿ç¨æ¥å¤çå¤ä¸ªè¯·æ±åæ¶è®¿é®ãservletä¾èµäºä¸ä¸ªçº¿ç¨æ± æ¥æå¡è¯·æ±ã线ç¨æ± å®é ä¸æ¯ä¸ç³»åçå·¥ä½è 线ç¨éåãServlet使ç¨ä¸ä¸ªè°åº¦çº¿ç¨æ¥ç®¡çå·¥ä½è 线ç¨.
å½å®¹å¨æ¶å°ä¸ä¸ªServlet请æ±ï¼è°åº¦çº¿ç¨ä»çº¿ç¨æ± ä¸éåºä¸ä¸ªå·¥ä½è 线ç¨,å°è¯·æ±ä¼ éç»è¯¥å·¥ä½è 线ç¨ï¼ç¶åç±è¯¥çº¿ç¨æ¥æ§è¡Servletç serviceæ¹æ³ãå½è¿ä¸ªçº¿ç¨æ£å¨æ§è¡çæ¶å,容å¨æ¶å°å¦å¤ä¸ä¸ªè¯·æ±,è°åº¦çº¿ç¨åæ ·ä»çº¿ç¨æ± ä¸éåºå¦ä¸ä¸ªå·¥ä½è 线ç¨æ¥æå¡æ°ç请æ±,容å¨å¹¶ä¸å ³å¿è¿ä¸ªè¯· æ±æ¯å¦è®¿é®çæ¯åä¸ä¸ªServlet.å½å®¹å¨åæ¶æ¶å°å¯¹åä¸ä¸ªServletçå¤ä¸ªè¯·æ±çæ¶åï¼é£ä¹è¿ä¸ªServletçservice()æ¹æ³å°å¨å¤çº¿ ç¨ä¸å¹¶åæ§è¡ã
Servlet容å¨é»è®¤éç¨åå®ä¾å¤çº¿ç¨çæ¹å¼æ¥å¤ç请æ±ï¼è¿æ ·åå°äº§çServletå®ä¾çå¼éï¼æåäºå¯¹è¯·æ±çååºæ¶é´ï¼å¯¹äºTomcatå¯ä»¥å¨server.xmlä¸éè¿<Connector>å ç´ è®¾ç½®çº¿ç¨æ± ä¸çº¿ç¨çæ°ç®ã