Servlet
Servlet
Servlet 是 Java提供的一门动态web资源开发技术
Servlet 是JavaEE 规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
Servlet 快速入门
-
创建 web项目,导入 Servlet依赖坐标
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
-
创建:定义一个类,实现 Servlet接口,并重写接口中所有方法,并在 service方法中输入一句话
public class ServletDemo1 implements Servlet { public void service(){} }
-
配置:在类上使用@WebServlet 注解,配置该 Servlet的访问路径
@WebServlet("/demo1") public class ServletDemo1 implements Servlet {
-
访问:启动 Tomcat,浏览器输入URL 访问该Servlet
http://localhost:8080/web-demo/demo1
Servlet执行流程
Servlet 由谁创建?service()方法由谁调用?
Servlet由web服务器创建,service()方法由web服务器调用。
服务器怎么知道Servlet中一定有service方法?
因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法
Servlet声明周期
Servlet生命周期就是Servlet从创建到销毁的过程。
服务器启动时就加载Servlet
@WebServlet(urlPatterns = "/demo", loadOnStartup = 1)
负整数:第一次被访问时创建Servlet对象
0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高
一个Servlet在Tomcat容器中只会实例化一次,只会产生一个对象,而且常驻内存。要等到服务器关闭才会销毁。
Servlet 方法介绍
初始化方法,在Servlet被创建时执行,只执行一次
void init(ServletConfig config)
提供服务方法, 每次Servlet被访问,都会调用该方法
void service(ServletRequest req, ServletResponse res)
销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
void destroy()
获取ServletConfig对象
ServletConfig getServletConfig()
获取Servlet信息
String getServletInfo()
生命周期演示案例
1.创建一个类实现Servlet接口
2.重写这三个方法:init(),service(),destory()
3.使用注解@WebServlet设置访问地址
@WebServlet("/demo02")
public class ServletDemo02 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init 初始化方法,执行1次");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service 每次请求都执行服务的方法");
}
@Override
public void destroy() {
System.out.println("destroy 服务器关闭执行销毁的方法");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public ServletConfig getServletConfig() {
return null;
}
}
方法 | 作用 | 运行次数 |
---|---|---|
void init(ServletConfig config) | 用户第1次请求的时候,初始化的时候执行 | 1次 |
void service(ServletRequest req, ServletResponse res) | 每次请求都执行 | 多次 |
void destroy() | 服务器关闭的时候执行 | 1次 |
Servlet 体系结构
HttpServlet 原理
HTTP 协议中,GET 和 POST 请求方式的数据格式不一样,将来要想在Servlet中处理请求参数,得在service方法中判断请求方式,并且根据请求方式的不同,分别进行处理:
Servlet urlPattern配置
Servlet 要想被访问,必须配置其访问路径(urlPattern)
1. 一个Servlet,可以配置多个 urlPattern
@WebServlet(urlPatterns={"/demo1","/demo2"})
2. urlPattern 配置规则
① 精确匹配
② 目录匹配
③ 扩展名匹配
④ 任意匹配
urlPattern配置规则:
前缀匹配和后缀匹配不能同时出现在一个地址中,否则会出现异常:
Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> [/*.do] in servlet mapping
因为这种格式是错误的,会导致tomcat加载当前项目失败,整个项目中所有的资源都不能访问。
优先级:前缀匹配高于后缀匹配
匹配原则:最佳匹配原则,哪个最接近就访问哪个
不能出现两个同名name的Servlet,也不能出现两个Servlet访问地址相同的情况
请求URL | Servlet1 | Servlet2 | 访问哪个 |
---|---|---|---|
/abc/a.html | /abc/* | /* | 第1个,因为第1个更接近 |
/abc | /abc/* | /abc | 第2个,精确匹配 |
/abc/a.do | /abc/* | *.do | 第1个,/开头的优先级更高 |
/a.do | /* | *.do | 第1个,/开头的优先级更高 |
/xxx/yyy/a.do | /* | *.do | 第1个,/开头的优先级更高 |
XML 配置方式编写 Servlet
Servlet 从3.0版本后开始支持使用注解配置,3.0版本前只支持 XML 配置文件的配置方式
步骤:
1.编写 Servlet类
2.在 web.xml中配置该Servlet
HTTP协议请求内容
请求数据分为3部分:
请求行:请求数据的第一行。其中GET表示请求方式,/表示请求资源路径,HTTP/1.1表示协议版本
请求头:第二行开始,格式为key:value形式。
请求体: POST请求的最后一部分,存放请求参数
HTTP响应的格式
响应数据分为3部分:
响应行:响应数据的第一行。其中HTTP/1.1表示协议版本,200表示响应状态码,OK表示状态码描述
响应头:第二行开始,格式为key:value形式
响应体: 最后一部分。存放响应数据
Tomcat服务器部署WEB项目
方式1:
直接复制到webapps目录下
方式2:单独的xml文件
在conf/Catalina/localhost下创建一个xml文件,文件名就是访问地址
内容是Context元素,属性docBase是物理地址
idea编写Servlet
1.创建一个类继承于HttpServlet
2.重写doGet或doPost方法
3.使用xml配置或@WebServlet指定访问地址
@WebServlet属性 | 说明 |
---|---|
loadOnStartup | 服务器启动的时候加载servlet |
urlPatterns | 访问地址,可以指定多个,可以使用通配符/* 或 *.扩展名 |
value | 同上,如果只有value则属性名可以省略 |