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

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值