一、Servlet概念
1、Servlet是运行在 Java 服务器端的程序,用于接收和响应来自客户端基于 HTTP 协议的请求。
2、Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。SUN公司提供
3、核心方法:service(),任何客户端的请求都会经过该方法
二、Servlet快速入门
1、创建一个web项目
2、定义一个类实现Servlet接口
package com;import javax.servlet.*;
import java.io.IOException;
//tomcat下lib目录下的 servlet-api.jar引入项目中
/*** @author 86136*/
public class MyWeb01 implements Servlet {@Override//创建public void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("女孩");}@Overridepublic String getServletInfo() {return null;}@Override//销毁public void destroy() {}
}
3、在web.xml中配置Servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><!--com.MyWeb01类的别名 test01--><servlet-name>test01</servlet-name><!--com.MyWeb01 是类的全路径--><servlet-class>com.MyWeb01</servlet-class></servlet><servlet-mapping><!--MyWeb01类与请求的映射关系引用上面的别名--><servlet-name>test01</servlet-name><!--url-pattern是我们的路径请求--><url-pattern>/aa</url-pattern></servlet-mapping>
</web-app>
4、点击运行
5、通过浏览器测试
在浏览器访问:http://localhost:8080/aa
三、Servlet执行原理
-
当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
-
查找web.xml文件,是否有对应的<url-pattern>标签体内容。
-
如果有,则在找到对应的<servlet-class>全类名
-
tomcat会将字节码文件加载进内存,并且创建其对象
-
调用其service方法
我们通过浏览器发送请求,请求首先到达Tomcat服务器,由服务器解析请求URL,然后在部署的应用列表中找到我们的应用。接下来,在我们的应用中找应用里的web.xml配置文件,在web.xml中找到Servlet的配置,找到后执行service方法,最后由Servlet响应客户浏览器。整个过程如下图所示:
一句话总结执行过程:
浏览器——>Tomcat服务器——>我们的应用——>应用中的web.xml——>Servlet类——>响应浏览器
四、Servlet体系结构
在刚才的入门案例中,我们定义了自己的Servlet,实现的方式都是选择实现Servlet,在Servlet的API介绍中,它提出了我们除了实现Servlet还可以继承GenericServlet和继承HttpServlet,通过查阅servlet的类视图,我们看到Servlet下有一个抽象类GenericServlet,抽象类GenericServlet还有一个子类HttpServlet。同时,在service方法中还有参数ServletRequest和ServletResponse,
五、Servlet实现方式
实现Servlet功能的三种方式:
1、上面用过的:实现Servlet接口,接口中的方法必须全部实现
使用此种方式,表示接口中的所有方法在需求方面都有重写的必要。此种方式支持最大程度的自定义
2、继承GenericServlet,service方法必须重写,其他方可根据需求,选择性重写
使用此种方式,表示只在接收和响应客户端请求这方面有重写的需求,而其他方法可根据实际需求选择性重写,使我们的开发Servlet变得简单。但是,此种方式是和HTTP协议无关的
package com;import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;/*** @author 86136*/
public class MyWeb02 extends GenericServlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("我喜欢你");}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>test02</servlet-name><servlet-class>com.MyWeb02</servlet-class></servlet><servlet-mapping><servlet-name>test02</servlet-name><url-pattern>/bb</url-pattern></servlet-mapping>
</web-app>
3、继承HttpServlet,它是javax.servlet.http包下的一个抽象类,是GenericServlet的子类。如果我们选择继承HttpServlet时,只需要重写doGet和doPost方法,不要覆盖service方法。
使用此种方式,表示我们的请求和响应需要和HTTP协议相关。也就是说,我们是通过HTTP协议来访问的。那么每次请求和响应都符合HTTP协议的规范。请求的方式就是HTTP协议所支持的方式(目前我们只知道GET和POST)
package com;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author 86136*/
public class MyWeb03 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("我喜欢你苏沐橙");}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>test03</servlet-name><servlet-class>com.MyWeb03</servlet-class></servlet><servlet-mapping><servlet-name>test03</servlet-name><url-pattern>/cc</url-pattern></servlet-mapping>
</web-app>
六、 Servlet的生命周期
1、Servlet的创建,存活及死亡
1、创建:执行init方法,只执行一次
2、存活:提供服务,执行service方法,执行多次
3、销毁:执行destroy方法,只执行一次
2 、Servlet什么时候被创建
1、默认情况下,第一次被访问时,Servlet被创建
2、可以手动配置执行Servlet的创建时机, 在web.xml的在<servlet>标签下配置
1、 <load-on-startup>的值为负数时, 第一次被访问时创建
2、<load-on-startup>的值为0或正整数时, 在服务器启动时创建
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><!--com.MyWeb01类的别名 test01--><servlet-name>test01</servlet-name><!--com.MyWeb01 是类的全路径--><servlet-class>com.MyWeb01</servlet-class><!--在服务器启动时创建--><load-on-startup>1</load-on-startup></servlet> </web-app>
七、 Servlet的线程安全问题
Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
1、多个用户同时访问时,可能存在线程安全问题
2、解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对其修改值
八、Servlet3.0注释开发(重点)
1、注解开发的优势
简单便捷,不需要再操作繁琐的web.xml配置
//基于注解配置Servlet @WebServlet("/index") public class MyWeb04 extends HttpServlet {}
2、取代了web.xml中的配置
九、映射的相关配置
1、Servlet的映射方式
1、具体名称的方式。访问的资源路径必须和映射配置完全相同。==(常用)==
// 只有/test01请求能匹配 http://localhost:8080/test01
@WebServlet("/test01")
2、/ 开头 + 通配符的方式。只要符合目录结构即可,不用考虑结尾是什么
// *代表所有,任意
//只要请求符合这个目录结构/com/, 后面无论是什么都能匹配到这个@WebServlet("/com/*")
// http://localhost:8080/com/haha http://localhost:8080/com/jjj http://localhost:8080/com
//极端一点, 匹配所有, 任何请求都能匹配到这个
@WebServlet("/*")
3、通配符 + 固定格式结尾的方式。只要符合固定结尾格式即可,不用考虑前面的路径。
http://localhost:8080/mm.do
@WebServlet("*.do")
2、Servlet的多路径映射
我们可以给一个 Servlet 配置多个访问映射,从而可以让不同的请求路径来访问相同的Servlet
// @WebServlet里面可以写多个路径, 使用{}包裹,用逗号分隔
@WebServlet({"/vip","/vvip","/vvvip"}