目录
2.服务器怎么知道Servlet中一定有Service方法?
一.Servlet 概述
- Servlet 是 Java 提供的一门动态的Web资源开发技术
- Servlet 是 JavaEE 规范之一,其实就是一个接口,将来我们需要定义 Servlet类 实现 Servlet接口,并由Web服务器(Tomcat....)运行 Servlet
二.Servlet 快速入门
- 创建 Web项目,导入 Servlet 依赖坐标
<dependency> <gourpId>javax.servlet</groupId> <artifactId>javax.servlet-api</groupId> <version>3.1.0</version> <scope>provided</scope> <!-- 一定要加这个,否则会报错,因为Tomcat服务器内已经装了这个,不加会冲突--> </dependency>
- 定义一个类,实现 Servlet 接口,并重写接口中所有方法,并在 Service 方法中输出一句话
public class ServletDemo1 implements Servlet{ public void service(){ System.out.println("Hello Servlet From Hogwarts !!! "); } }
- 配置:在类上使用 @WebServlet 注解,配置该 Servlet 的访问路径
@WebServlet("/demo1") //记住一定要加 / 否则运行会报错 public class ServletDemo1 implements Servlet{ public void service(){ System.out.println("Hello Servlet From Hogwarts !!! "); } }
三.Servlet 执行流程
1.Servlet由谁创建?Servlet方法由谁调用?
- Servlet 由 Web服务器 创建
- Servlet方法 由 Web服务器 调用
2.服务器怎么知道Servlet中一定有Service方法?
- 因为我们定义的 Servlet 必须 实现 Servlet 接口 并 复写方法,而 Servlet接口 中有 Service方法
四.Servlet 生命周期
- 对象的生命周期 指一个对象的从 被创建 到 被销毁 的整个过程
- Servlet 运行在 Servlet容器(Web服务器)中,其 生命周期 由容器管理,分为 4 个阶段
- 加载和实例化:默认情况下,当 Servlet 第一次被访问时,由容器创建 Servlet对象
- 初始化:在 Servlet 实例化 之后,容器调用 Serlvet 的 init()方法 初始化这个对象,完成一些如加载配置文件,创建连接等初始工作。该方法只调用一次。
- 请求处理:每次 请求 Servlet 时,Servlet容器 都会调用 Servlet的service()方法对请求进行处理
- 服务终止:当需要 释放内存 或 容器关闭 时,容器就会调用 Servlet实例的destory()方法 完成资源的释放。在destory()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾回收器 回收
加载与实例化的非默认情况:
@WebServlet(urlPatterns="/demo",loadOnStartup = 1) //负整数(默认):第一次访问时创建Servlet对象 //0或正整数:服务器启动时创建Servlet对象,数字越小,优先级越大
五.Servlet 方法介绍
- 初始化方法:在 Servlet 被创建时执行,只会执行一次
void init(ServletConfig config);
- 提供服务的方法:每次 Servlet 被访问,都会调用该方法
void service(ServletRequest req,ServletResponse resp);
- 销毁方法:当 Servlet 被销毁时,调用该方法。在 内存释放、服务器关闭 时销毁Servlet,不包括非正常状态,例如Kill
void destory();
- 获取 ServletConfig 对象
ServletConfig getServletConfig();
六.Servlet的体系结构
GenericServlet 中的 service方法 是抽象方法
未来我们开发 B/S架构 的Web项目,都是针对Http协议的,所以我们自定义的Servlet会继承HttpServlet
HttpServlet的原理:
获取请求方式,并根据不同的请求方式,调用不同的doXXX方法
接下来我们看到的HttpServlet具体的使用:
- 继承HttpServlet
- 重写doGet和doPost方法
public class ServletDemo extends HttpServlet{ @Override protected void doGet(HttpServletRequest req,HttpServletResponse resp){ //TODO: Get请求方式处理逻辑 } @Override protected void doPost(HttpServletRequest req,HttpServletResponse resp){ //TODO: Post请求方式处理逻辑 } }
七.Servlet urlPatterns配置
- Servlet 要想被访问,必须配置其访问路径(urlPatterns)
- 一个Servlet,可以配置多个访问路径
@WebServlet(urlPatterns = {"/demo1","/demo2"}) //记住 / 不能丢嗷
下面介绍本章的重点urlPatterns的配置规则
- 精确匹配:
@WebServlet("/user/select") //配置路径 localhost:8080/web-demo/user/select //访问路径
- 目录匹配:
@WebServlet("/user/*") //配置路径 localhost:8080/web-demo/user/aaa //访问路径,可以有很多很多个 localhost:8080/web-demo/user/bb
- 扩展名匹配:
@WebServlet("*.zip") //配置路径 localhost:8080/web-demo/aaa.zip //访问路径,可以有很多很多个 localhost:8080/web-demo/bbb.zip
- 任意匹配:
@WebServlet("/") 或者 @WebServlet("/*") //配置路径 localhost:8080/web-demo/hehe //访问路径,可以有很多很多个 localhost:8080/web-demo/haha
/ 和 /* 的区别:
- 当一个Servlet配置了“/”,会覆盖掉Tomcat中的DefaultServlet(默认的网页),此时其他的访问路径若都匹配不上时就会走这个Servlet
- 当一个Servlet配置了“/*”,意为着它可以匹配任意的访问路径
- 一般不建议使用这个