Servlet简介
1.什么是Servlet
Servlet是Server和Applet的缩写,是服务端小程序的意思。使用Java语言编写的服务程序,可以生成动态的web页面,Servlet主要运行在服务器端,由服务器调用执行,是一种按照Servlet标准开发的类。
Servlet本质上也是java类,但要遵循Servlet规范进行编辑,没有main方法,它的创建、使用、销毁。都由Servlet容器进行管理(如Tomact服务器),写自己的类,不用写main方法,别人自动调用。,由服务器统一调用和执行。
Servlet和http协议紧密联系,servlet可以处理所有的http协议相关内容。
提供了Servlet功能的服务器,叫做Servlet容器,常见容器有Tomact,Jetty,Server等。
2.Servlet规范
想要创建的类具有Servlet的效果,我们就要实现Servlet规范,通过继承HttpServlet类来实现规范。这个类需要jar包支持,这个jar包就是放在Tomact里面的。将Tomact集成到项目里面就可以直接用了。如果没有集成Tomact要用的话,需要单独吧Servlet.api的jar包引进来。
3.重写Servlet方法
满足Servlet规范只是让我们的类能够满足接受请求的要求,接受请求后需要对请求进行分析,以及进行业务处理,计算出结果返回。在规范中有一个叫做service的方法,专门用做请求处理的操作,业务代码可以写在该方法中。
4.设置注解
注解就是标签,是为了说明特定请求对应的特定资源。
开发servlet项目,使用@WebServlet将一个继承于javax.http.HttpServlet的类定义为Servlet组件。
package com.study.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 实现Servlet
* 1.创建普通java类
* 2.实现servlet的规范,继承HttpServlet类,继承之后满足能够被访问。
* 3.重写service方法,用来处理请求。
* 4.设置一个注解,指定访问的路径
*/
//@WebServlet("/ser01")
//@WebServlet(name = "servlet01",value = "/ser01")
//@WebServlet(name = "servlet01",value = {"/ser01","/ser02"})
@WebServlet(name = "Servlet001",urlPatterns = "/ser01")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//打印内容在控制台
System.out.println("hello Servlet");
//通过流输出数据到浏览器
resp.getWriter().write("Hello Servlet!");
}
}
5.Servlet生命周期
Servlet没有main方法,所以不能独立运行,它的运行完全是由Servlet引擎来控制和调的,所谓生命周期指的是Servlet容器何时创建servlet实例,何时调用其方法进行请求的处理何时销毁它的实例的整个过程,在第一次访问时Servlet创建方法对象,第二次访问时则是对第一次访问产生对象的调用。
(1)实例和初始化时机
当请求到达容器时,容器查找servlet对象是否存在,如果不存在,则会创建实例并进行初始化。
(2)就绪、调用、服务阶段
有请求到达容器时,容器查找该servlet对象的service方法,处理请求的方法在整个生命周期中可以被多次调用,HttpServlet的service方法,会依据请求方式来调用doget或者doPost方法,但是,这两个do方法默认情况下会抛出异常,需要子类去override。
(3)销毁时机
当容器关闭时(应用程序停止时),会将程序中的Servlet实例化进行销毁。
在Servlet中有三个生命周期方法,不用用户手动调用,而是在特定的时机有容器自动调用,观察这三个方法就可以观察到Servlet的生命周期。
1.init方法,在servlet实例创建后执行(证明该Servlet有实例创建了)。
2.service方法,每次有请求到达某个Servlet方法执行时用来处理请求(证明该servlet进行服务)。
3.destory方法,Servlet实例销毁时执行(证明该Servlet的实例被销毁)。
package com.study.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ser05")
public class Servlet05 extends HttpServlet {
/**
* 就绪或者是服务方法
* 系统方法,服务器自动调用
* 当有请求到达Servlet容器时,就会调用该方法。
* 该方法可以被多次调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet被调用了");
}
/**
* 销毁方法
* 系统方法,服务器自动调用
* 当服务器关闭或者应用程序停止时调用该方法
* 这个方法也只会执行一次
*/
@Override
public void destroy() {
System.out.println("servlet被销毁了");
}
/**
* 初始化方法
* 系统方法发,服务器自动调用。
* 当请求到达Servlet容器时,Servlet容器会判断该Servlet对象是否存在,如果不存在它才会调用,创建实例化对象
* 方法只会执行一次
* @throws ServletException
*/
@Override
public void init() throws ServletException {
System.out.println("Servlet被创建了");
}
}
- Web Client 向 Servlet 容器( Tomcat )发出 Http 请求Servlet 容器接收 Web Client 的请求
- Servlet 容器创建一个 HttpServletRequest 对象,将 Web Client 请求的信息封装到这个对象中
- Servlet 容器创建一个 HttpServletResponse 对象
- Servlet 容器调 HttpServlet 对象 service 方法,把 Request 与 Response 作为参数,传给 HttpServlet
- HttpServlet 调用 HttpServletRequest 对象的有关方法,获取 Http 请求信息
- HttpServlet 调用 HttpServletResponse 对象的有关方法,生成响应数据
- Servlet 容器把 HttpServlet 的响应结果传给 Web Client