目录
一.Serclet概述
一个 Servlet 总是继承自 HttpServlet ,然后覆写 doGet() 或 doPost() 方法。注意 到 doGet() 方法传入了 HttpServletRequest 和 HttpServletResponse 两个对象,分别 代表 HTTP 请求和响应。我们使用 Servlet API 时,并不直接与底层 TCP 交互,也 不需要解析 HTTP 协议,因为 HttpServletRequest 和 HttpServletResponse 就已经封 装好了请求和响应。
以发送响应为例,我们只需要设置正确的响应类型,然后获取 PrintWriter ,写入响应即可。 而这样的一个项目最终会打包成一个 *.war 文件,运行这个文件,需要使用支持 Servlet API 的Web容器(Web服务器)。 因此,我们首先要找一个支持Servlet API的Web服务器。
常用的服务器有:
Tomcat:由Apache开发的开源免费服务器;
Jetty:由Eclipse开发的开源免费服务器;
GlassFish:一个开源的全功能JavaEE服务器。( 还有一些收费的商用服务器,如Oracle的WebLogic,IBM的WebSphere。) 无论使用哪个服务器,只要它支持 Servlet API ,我们的 war 包都可以在上面 运行。这里我们选择使用最广泛的开源免费的 Tomcat 服务器。
在浏览器输入 http://localhost:8080/项目名称/hello.do ,即可看到 HelloServle t 的输出。
为什么路径是 "/项目名称" 而不是 / ?
因为一个 Web 服务器允许同时运行多个 Web App 。因此,第一级目录 /项目名称 表示Web App的名字,后面的 /hello.do 才是 我们在 HelloServlet 中映射的路径。
实际上,类似 Tomcat 这样的服务器也是 Java 编写的,启动 Tomcat 服务器实 际上是启动 Java 虚拟机,执行 Tomcat 的 main() 方法,然后由 Tomcat 负责加载 我们的 *.war 文件,并创建一个 HelloServlet 实例,最后以多线程的模式来处理 HTTP 请求。如果 Tomcat 服务器收到的请求路径是 /项目名称/hello.do ,就转发到 Hel loServlet 并传入 HttpServletRequest 和 HttpServletResponse 两个对象.
二.Servlet生命周期。
在通过一个 URL 路径发起对一个 Servlet 请求的过程中,其本质是在调用执行 Servlet 实例的 doXXX() 方法。该 Servlet 实例创建和使用的过程,被称为Servlet 的生命周期。整个生命周期包括:实例化、初始化、服务、销毁。
1、 实例化:
根据 Servlet 请求的路径(例如: home.do ),查找该 Servlet 的实 例。如果实例不存在,则通过调用构造方法,完成 Servlet 实例的创建。
2、 初始化:
通过该 Servlet 的实例,调用 init() 方法,执行初始化的逻辑。
3 、服务:
通过该 Servlet 的实例,调用 service() 方法,如果子类没有重写该方 法,则调用HttpServlet父类的 service() 方法,在父类的该方法中进行请求方式 的判断,如果是 GET 请求,则调用 doGet() 方法;如果是 POST 请求,则调用 doPost() 方法;
如果子类重写 doXXX() 方法,则调用子类重写后的 doXXX() 方法; 如果子类没有重写 doXXX() 方法,则调用父类的 doXXX() 方法,在父类的方法实 现中,返回一个 405 状态码的错误页面。
405状态码:代表请求的方式服务器不提供支持
4、销毁:
服务器关闭或重启时,会销毁所有的Servlet实例,会调用Servlet实例的 des troy() 方法。
package com.rui.web.servlet;
import java.io.IOException;
import java.util.HashSet;
import java.util.LinkedHashSet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/home.do")
public class HomeServlet extends HttpServlet{
//1,实例化
//构造方法
public HomeServlet() {
System.out.println("1.HomeServlet实例被创建");
}
//2,初始化
//重写HttpServlet父类的init()方法
//通过实例自动调用init()方法
@Override
public void init() throws ServletException {
System.out.println("2.HomeServlet实例初始化");
}
//3.服务
//通过实例调用HttpServlet父类的Service()方法
//service()方法中,会根据请求方式(get或post)的不同
//调用子类重写的doGet()或者doPost()方法
//如果子类没有重写,则响应405
//根据请求方式的不同,需要调用不同的请求方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HomeServlet被Get请求到!"+this.hashCode());
String method=req.getMethod();
System.out.println("请求方式"+method);
}
//4.销毁
@Override
public void destroy() {
System.out.println("4.HomeServlet实例被销毁");
}
// @Override
// protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("HomeServlet被POST请求到");
// }
}
运行结果: