一.WEB服务器
- 是指计算机和运行在它上面的服务器软件的总和
- 能提供网上信息浏览服务,向发出请求的浏览器提供文档。
- 是一种被动程序,只有当浏览器发出的请求时,服务器才会响应。
- 当浏览器(客户端)连到服务器上并发送请求时,服务器将处理该请求并将反馈到浏览器上。服务器使用HTTP(超文本传输协议)与客户机浏览器进行信息交流。
- WEB服务器的内容
①应用层使用HTTP协议
②HTML文档格式
③浏览器统一资源定位器
二.Servlet容器
Servlet容器就是用来装Servlet的,是WEB服务器和Servlet处理请求过程中必不可少的组成部分
三.Servlet生命周期
package com.jd.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void init() throws ServletException {
System.out.println("init");
}
public TestServlet() {
System.out.println("TestServlet");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("service");
super.service(arg0, arg1);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost");
}
@Override
public void destroy() {
System.out.println("destroy");
}
}
①创建对象
默认情况下,Servlet不会随着服务器的启动而创建对象,即不会随着tomcat的启动而启动(不会随着tomcat的启动而创建对象)
第一次发送请求的时候创建对象,之后的请求不再创建对象,对象只创建一次。
- 如果配置了"load-on-startup",则Servlet随着服务器的启动而创建对象(load-on-startup中设置一个非零的值即可)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>sirius</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.jd.servlet.TestServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
</web-app>
②初始化
Servlet对象创建后立即执行init()方法,因为在Servlet生命周期内Servlet对象只创建一次因此init()方法故只执行一次
- 获取初始值
Servlet对象创建后立即执行init方法
在web.xml中定义的代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>sirius</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.jd.servlet.TestServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>Tom</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
</web-app>
在init()方法中定义的代码
public void init() throws ServletException {
String name = getInitParameter("name");
System.out.println("init");
}
③处理请求
任何请求都会先到达service,任何请求都会先由service进行校验(根据请求方式是Get还是Post)决定到底是先调用doGet方法还是doPost方法(到底调用哪个方法由父类中的service方法决定)
④销毁
重新发布项目时(改代码的时候会自动重新发布,在下次发布成功前会先自动销毁上一个);“正常”关闭Tomcat时
四.WEB服务器确定Servlet处理请求过程
①客户端在浏览器输入一个请求的URL,回车后自动向WEB服务器端发送一个HTTP请求
②HTTP请求首先到达Web server
③Web server将请求传到Servlet容器,首先Servlet容器根据发送过来的请求在容器内根据web.xml中对该Servlet请求的描述查找有没有符合该请求的Servlet
④如果查找不到符合该请求的Servlet则Servlet容器直接向浏览器返回查找不到资源数据,则浏览器直接显示404错误页面
⑤如果查找到符合该请求的Servlet则Servlet容器,判断是否是第一次访问
⑥若是第一次访问则将此Servlet装载进虚拟机并实例化即通过调用等待在线程池中的线程调用Servlet中的init()方法并获取初始值,然后再调用Servlet中的service()方法判断使用哪种方法处理该请求,读取数据资源处理完请求后返回响应
⑦若是第二次访问则此时不再创建一个Servlet实例化对象也就调用Servlet中的init()方法,故此时直接通过调用等待在线程池中的线程调用Servlet中的service()方法处理请求
⑧请求结束后Servlet并不会消失而是将其放回线程池中等待被下一次调用
⑨将Servlet返回的响应生成正确的页面结果并返回到正确的地址