1 web容器
web容器是部署在web服务器上的应用程序,客户端可以在WEB浏览器(IE、FireFox等)输入一个请求URL,浏览器解析URL并向服务器发起HTTP请求,web容器作为web服务器上的应用程序负责处理Http请求,并将处理结果返回到客户端浏览器上。
1.1 什么是URL
URL(Uniform Resource Locator)统一资源定位符。即URL可以用来标识一个资源。
1.2 URL结构
protocol://host:port/path?query#fragment
- 协议为(protocol):http
- 主机为(host):www.runoob.com
- 端口号为(port): 80 ,以上URL实例并未指定端口,因为 HTTP 协议默认的端口号为 80。
- 文件路径为(path):/index.html
- 请求参数(query):language=cn
- 定位位置(fragment)
1.3 URL 实例
http://www.runoob.com/index.html?language=cn#j2se
2 web容器的历史
2.1 Http服务器时代
早期的Web应用服务器将服务端的资源制作成html静态页面,发布于互联网上提供给客户访问,其本质是一个HTTP 服务器(比如 Apache,Nginx)
2.1.1 处理过程
客户端在WEB浏览器(IE、FireFox等)输入一个请求URL,浏览器负责解析URL,并向web服务器发起HTTP请求,web容器作为web服务器上的应用程序负责处理Http请求,web容器首先会解析请求URL,获取客户端想从web服务器访问静态文件路径,通过文件资源路径从系统中读取文件数据并返回给客户端浏览器。
image2.1.2 缺陷
对于同一个URL请求,返回都是web服务器文件系统中同一个资源。
2.2 Http服务器 + Sevlet容器
Sun 公司推出了 Servlet 技术 。Servlet简单理解为运行在web容器中的Java
小程序,和其他java程序不同是我们编写Servlet没有main方法,不能独立运行,因此必须把它部署到 Servlet 容器中,由容器来实例化并调用Servlet。
这样web容器具有“业务逻辑”,同一个请求可以通过程序处理后返回不同的结果。
2.2.1 处理过程
客户端在WEB浏览器(IE、FireFox等)输入一个请求URL,浏览器负责解析URL,并向web服务器发起HTTP请求,web容器作为web服务器上的应用程序负责处理Http请求
-
1 通过解析Http请求的URL判断请求是否是静态资源(.htm或者是.htm),如果是静态资源则解析请求URL,获取客户端想从web服务器访问静态文件路径,通过文件资源路径就可以从系统中读取文件数据并返回给客户端浏览器。
-
2 通过解析Http请求的URL判断请求是否是动态资源(.jsp、.asp/.aspx、.php),如果是动态资源则解析请求URL交给指定serlvet程序处理
3 Servlet容器
3.1 什么是Servlet容器
前面说到servlet是一个程序用来处理URL请求,我们可以编写多个Servlet类来处理多个请求,那web容器又是如何实现不同处理请求到不同servet?
最直接的做法是在 HTTP 服务器代码里写一大堆 if else 逻辑判断:如果是 A 请求就调 X 类的 M1 方法,
如果是 B 请求就调 Y 类的 M2 方法。HTTP 服务器的代码跟业务逻辑耦合在一起了,如果新加一个业务
方法还要改 HTTP 服务器的代码
为了将业务处理和Http服务器解耦,于是web容器中定义了一个servelt容器,它用来加载和管理servet实现的业务类。对于动态请求HTTP,Http服务器不直接跟业务类打交道,而是把请求交给 Servlet 容器去处理,Servlet 容器会将请求转发到具体的 Servlet,如果这个 Servlet 还没创建,就加载并实例化这个 Servlet,然后调用这个 Servlet.service方法处理.
tomcat请求设计.jpgServlet容器工作流程
当客户请求某个资源时,HTTP 服务器会用一个 ServletRequest 对象把客户的请求信息封装起来,然后调用 Servlet 容器的 service 方法,Servlet 容器拿到请求后,根据请求的 URL 和 Servlet 的映射关系,找到相应的 Servlet,如果 Servlet 还没有被加载,就用反射机制创建这个 Servlet,并调用 Servlet 的 init 方法来完成初始化,接着调用 Servlet 的 service 方法来处理请求,把 ServletResponse 对象返回给 HTTP 服务器,HTTP 服务器会把响应发送给客户端
servelt容器工作流程.jpg4 servlet规范
4.1 servelt 接口
每一个servet都需要实现了一个servelt接口,servlet接口中定义了servlt运行,初始化,销毁等接口函数.
public interface Servlet {
void init(ServletConfig config) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;
String getServletInfo();
void destroy();
}
servlet接口本质上就是servet规范中定义的接口之一。servelt规范的存在为了让servlet容器更好的管理Servlet,同时让servelt容器和servelt实现解耦。servelt 规范统一了不同web容器对selvet容器的实现。保证同一个servlet可以在不同的web容器中运行。
5 web应用
按照servlet规范我们可以将多个servelt打包一个war包,而这个war包就表示一个web应用程序,war名称就是应用程序的名称
5.1 web应用程序的结构
| - MyWebApp
| - WEB-INF/web.xml -- 配置文件,用来配置 Servlet 等
| - WEB-INF/lib/ -- 存放 Web 应用所需各种 JAR 包
| - WEB-INF/classes/ -- 存放你的应用类,比如 Servlet 类
| - META-INF/ -- 目录存放工程的一些信息
web.xml
我们通常会将servelt对应请求url配置在web.xml中
网友评论