一、 Servlet执行流程
- Servlet由Tomcat服务器创建,,web项目发布到Tomcat服务器后,Tomcat服务器会自动调用web项目中的service()方法,但是在调用service()方法之前,会先创建一个Servlet对象,这个Servlet对象也是由Tomcat服务器创建的,Servlet执行流程就是由浏览器向Servlet发送请求,根据url路径找到要执行的方法,也就是service()方法,这个service()方法也是Tomcat调用的,这个service()方法一被调用,就会返回对应的响应给客户端浏览器。
二、Servlet生命周期
- 对象的生命周期指一个对象从被创建到被销毁的整个过程
- Servleti运行在Servlet:容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
- 1.加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
- 2.初始化:在Servlet实例化之后,容器将调用Servlet的
init()
方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作,该方法只调用一次 - 3.请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的
service()
方法对请求进行处理。 - 4.服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的
destroy()
方法完成资源的释放,在destroy()
方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收
@WebServlet("/demo") public class ServletDemo implements Servlet { /** * 初始化方法 * 1.调用时机:默认情况下,Servlet被第一次访问时调用 * 2.调用次数:1次 * @param servletConfig * @throws ServletException */ @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init..."); } @Override public ServletConfig getServletConfig() { return null; } /** * 提供服务 * 1.调用时机:每次Servlet被访问时调用 * 2.调用次数:多次 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("hello service~"); } @Override public String getServletInfo() { return null; } /** * 销毁方法 * 1.调用时机:内存释放或服务器关闭时 * 2.调用次数:1次 */ @Override public void destroy() { System.out.println("destroy..."); } }
三、 Servlet方法介绍
- 初始化方法,在Servleti被创建时执行,只执行一次
void init(ServletConfig servletConfig)
- 提供服务方法,每次Servleti被访问,都会调用该方法
void service(ServletRequest servletRequest, ServletResponse servletResponse)
- 销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
void destroy()
- 获取ServletConfig对象
ServletConfig getServletConfig()
- 获取Servlet信息
String getServletInfo()
@WebServlet("/demo") public class ServletDemo implements Servlet { private ServletConfig servletConfig; /** * 初始化方法 * 1.调用时机:默认情况下,Servlet被第一次访问时调用 * 2.调用次数:1次 * @param servletConfig * @throws ServletException */ @Override public void init(ServletConfig servletConfig) throws ServletException { this.servletConfig = servletConfig; System.out.println("init..."); } @Override public ServletConfig getServletConfig() { return this.servletConfig; } /** * 提供服务 * 1.调用时机:每次Servlet被访问时调用 * 2.调用次数:多次 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("hello service~"); } @Override public String getServletInfo() { return ""; } /** * 销毁方法 * 1.调用时机:内存释放或服务器关闭时 * 2.调用次数:1次 */ @Override public void destroy() { System.out.println("destroy..."); } }
四、 Servlet体系结构
- 我们将来开发B/S架构的web项目,都是针对HTTP协议所以我们自定义Servlet,会继承HttpServlet
- 自定义Servlet,重写
doGet
和doPost
方法:
@WebServlet("/demo1") public class ServletDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("get..."); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post..."); } }
- 默认执行
doGet
方法:
- 执行
doPost
方法:
- 创建一个html文件,定义一个表单,设置url路径,方法为post请求,发送post请求:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>doPost</title> </head> <body> <form action="/BBS/demo1" method="post"> <input name="username"> <input type="submit"> </form> </body> </html>
五、 urlPattern配置
- Servlet要想被访问,必须配置其访间路径(urlPattern)
- 一个Servlet,可以配置多个urlPattern
String[] urlPatterns() default {};
@WebServlet(urlPatterns = {"/demo1","/demo2"})
- urlPattern配置规则
- 精确匹配
- 配置路径:
@WebServlet(urlPatterns = "/user/select")
- 访问路径:
http://localhost:8080/BBS/user/select
- 目录匹配
- 配置路径:
@WebServlet(urlPatterns = "/user/*")
- 访问路径:
http://localhost:8080/BBS/user/aaa
(aaa可以使任意字符)
- 扩展名匹配
- 配置路径:
@WebServlet(urlPatterns = "*.do")
注意:此处没有/
,这里的*表示任意以.do
的路径均可 - 访问路径:
http://localhost:8080/BBS/demo1.do
- 任意匹配
- 配置路径:
@WebServlet(urlPatterns = "/")
或@WebServlet(urlPatterns = "/*")
后者优先级更高 - 访问路径:
http://localhost:8080/BBS/
/
后可为任意内容
/
和/*
的区别:
- 当我们的项目中的Servlet配置了
"/”
,会覆盖掉tomcat中的DefaultServlet,当其他的url-patterni都匹配不上时都会走这个Servlet - 当我们的项目中配置了
“*”
,意味着匹配任意访问路径
- 优先级:
- 精确路径 > 目录路径 > 扩展名路径 > /* > /
六、 XML配置Servlet(老版本)
- 1.编写Servlet类
- 2.在web.xml中配置该Servlet类
<web-app> <display-name>Archetype Created Web Application</display-name> <!--Servlet全类名--> <servlet> <servlet-name>demo2</servlet-name> <servlet-class>test.ServletDemo2</servlet-class> </servlet> <!--Servlet访问路径--> <servlet-mapping> <servlet-name>demo2</servlet-name> <url-pattern>/demo2</url-pattern> </servlet-mapping> </web-app>
七、Request
- Request:获取请求数据
- Response:设置响应数据
7.1 Request继承体系
- Tomcati需要解析请求数据,封装为request对象并且创建request对象传递到service方法中
- 使用request对象,查阅JavaEE API文档的HttpServletRequest接口
7.2 Request获取请求数据
- 请求行:
GET /request-demo/req1?username=zhangsan HTTP/1.1
String getMethod()
:获取请求方式:GETString getContextPath()
:获取虚拟目录(项目访问路径):/request-demoString Buffer getRequestURL()
:获取URL(统一资源定位符):http:/localhost:8080/request–demo/req1String getRequestURI()
:获取URI(统一资源标识符):/request-demo/req1String getQueryString()
:获取请求参数(GET方式):username=zhangsan&password=123
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //String getMethod() String method = req.getMethod(); System.out.println(method); //String getContextPath() String contextPath = req.getContextPath(); System.out.println(contextPath); //String Buffer getRequestURL() StringBuffer requestURL = req.getRequestURL(); System.out.println(requestURL.toString()); //String getRequestURI() String requestURI = req.getRequestURI(); System.out.println(requestURI); //String getQueryString() String queryString = req.getQueryString(); System.out.println(queryString); }
- 请求头:
User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
String getHeader((String name);
根据请求头名称,获取值
//user-agent:浏览器版本信息 String agent = req.getHeader("user-agent"); System.out.println(agent);
- 请求体:
username=superbaby&password=123
ServletInputStream getInputStream();
获取字节输入流BufferedReader getReader();
获取字符输入流
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.获取字符输入流 BufferedReader reader = req.getReader(); //2.读取数据 String s = reader.readLine(); System.out.println(s); }
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(2)https://developer.aliyun.com/article/1518155