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处理请求过程
- Web服务器的Web Server接收到HTTP请求
- Web服务器将请求转发给servlet容器
- servlet容器根据请求的URL去调用客户端要访问的Servlet
- 在调用之前,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>
- Web服务器将动态生成的结果返回到正确的地址。