WEB服务器如何确定哪个Servlet处理请求

一.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返回的响应生成正确的页面结果并返回到正确的地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值