欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-03 11:20:40
...

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服务器,
Web服务器如何确定哪个servlet处理请求

访问jsp网页
Web服务器如何确定哪个servlet处理请求
点击发送请求,页面跳转后,关闭tomcat服务器。eclipse控制台输出:
Web服务器如何确定哪个servlet处理请求

过程分析:发送请求后,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,发送请求后,控制台输出
Web服务器如何确定哪个servlet处理请求

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服务器将动态生成的结果返回到正确的地址。

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