Web服务器如何确定哪个servlet处理请求

  • Post author:
  • Post category:其他




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



1.Servlet中的方法



1. init()方法

在Servlet的生命周期中,

仅执行一次

init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init();



2. service()方法

它是Servlet的核心,每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。



3. destroy()方法

仅执行一次,在服务器端停止且卸载Servlet时执行该方法,有点类似于C++的delete方法。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。



2.Servlet生命周期

Servlet生命周期分为四个阶段:



1 创建对象

默认情况下,servlet不会随着服务器的启动而创建对象,在第一次请求的时候创建,之后再次请求请求也不再创建对象。如果在配置了load-on-startup为1,那么servlet随着服务器的启动而创建对象。



2 初始化

Servlet对象创建后,立即执行init() 方法,因为在servlet内,servlet对象只创建了一次,只有一个,所以init() 方法只执行一次。



3 处理请求

所有请求首先到达service方法,然后service方法根据请求方式(post或get),进而判断调用doGet方法还是doPost方法。再次访问发送请求时,只有service方法执行。



4 销毁

重新发布项目或正常关闭tomcat时销毁。



3 代码详解

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("构造方法");
	}
	@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方法");
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost");
	}
	
	@Override
	public void destroy() {
		System.out.println("destory");
	}

}

发送请求的网页:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<a href = "./TestServlet">链接</a>
</body>
</html>

xml文件中未配置load-on-startup为1

运行Tomcat服务器,

在这里插入图片描述

访问jsp网页

在这里插入图片描述

点击发送请求,页面跳转后,关闭tomcat服务器。eclipse控制台输出:

在这里插入图片描述

过程分析:发送请求后,servlet创建对象,执行构造方法和init()方法,所有请求经service方法处理(要运行service方法)后,由service确定使用doGet或doPost方法,最后执行destory()方法。



3如何获取值



1 设置值

在web.xml文件中的标签中添加属性名称和属性值。



– 单个servlet中的值

新建一个

<init-param>

</init-param>

`标签,注意此标签

必须在 < load-on-startup >标签行之前

此标签中的子标签< param-name >中写属性名

<param-name>属性名</param-name>

子标签< param-value>中写属性值

<param-value>属性值</param-value>

总体如下:

<servlet>
    <description></description>
    <display-name>TestServlet</display-name>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.jd.servlet.TestServlet</servlet-class>
    
    <init-param>
		<param-name>name</param-name>
		<param-value>Candy</param-value>
	</init-param>
    
  <load-on-startup>1</load-on-startup>
  </servlet>


– 多个servlet中的值

新建一个

<context-param>

</context-param>

`标签,此标签放在< web-app>中。

此标签中的子标签< param-name >中写属性名

<param-name>属性名</param-name>

子标签< param-value>中写属性值

<param-value>属性值</param-value>

总体如下:

  <context-param>
  	<param-name>age</param-name>
  	<param-value>20</param-value>
  </context-param>


2 获取值

使用getInitParameter()方法获取当前servlet中的值,取得的是 < servlet> < init-param>配置的参数;

使用getServletContext().getInitParameter()获取能在多个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");
		String name = getInitParameter("name");
		System.out.println(name);
		String age = getServletContext().getInitParameter("age");//可以全局使用
		System.out.println(age);
	}

运行tomcat,发送请求后,控制台输出

在这里插入图片描述



3. Web服务器确定servlet处理请求过程

  1. Web服务器的Web Server接收到HTTP请求
  2. Web服务器将请求转发给servlet容器
  3. servlet容器根据请求的URL去调用客户端要访问的Servlet
  4. 在调用之前,servlet容器会根据web.xml中对Servlet的描述去查找要访问的Servlet
  • 若找到,将此Servlet装载进虚拟机并调用servlet的init()方法对servlet进行初始化(该方法只会在servlet第一次被载入时调用),然后调用Servlet实例中的service()方法处理请求,即读取请求中的数据,创建一个响应。servlet会被保留在容器的地址空间中,继续处理其他的HTTP请求。
  • 若没有找到,直接返回一个404的错误代码到客户端,表示访问的资源不存在。




:

当第二次去访问同一个Servlet时,若容器判断到该Servlet已经被装载并实例化,那么容器就不会再去创建一个新的Servlet实例,直接调用原来那个Servlet实例中的service()方法来处理请求。

如果在Spring MVC中的web.xml中添加如下代码,就可以交给Web服务器默认Servlet处理。

  <mvc:default-servlet-handler/>
  <mvc:annotation-driven></mvc:annotation-driven>
  1. Web服务器将动态生成的结果返回到正确的地址。

在这里插入图片描述



版权声明:本文为qq_41763734原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。