Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(1)

简介: Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解

一、 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,重写doGetdoPost方法:
@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():获取请求方式:GET
  • String getContextPath():获取虚拟目录(项目访问路径):/request-demo
  • String Buffer getRequestURL():获取URL(统一资源定位符):http:/localhost:8080/request–demo/req1
  • String getRequestURI():获取URI(统一资源标识符):/request-demo/req1
  • String 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

相关文章
|
4天前
|
Java
servlet生命周期面试题
servlet生命周期面试题
|
4天前
|
Java 应用服务中间件 开发工具
基于Servlet的3.1以上注解方式完成上传功能。
基于Servlet的3.1以上注解方式完成上传功能。
6 0
|
4天前
|
Java Apache
基于servlet完成文件上传功能
基于servlet完成文件上传功能
16 0
|
4天前
|
SQL 数据可视化 数据库
基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能
基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能
6 0
|
1月前
|
存储 Java 应用服务中间件
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(2)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
28 2
|
1月前
|
Java
排课系统【JSP+Servlet+JavaBean】(Java课设)
排课系统【JSP+Servlet+JavaBean】(Java课设)
39 5
|
2天前
|
自然语言处理 前端开发 Java
Servlet与JSP:Java Web开发的基石技术详解
【6月更文挑战第23天】Java Web的Servlet与JSP是动态网页的核心。Servlet是服务器端的Java应用,处理HTTP请求并响应;JSP则是结合HTML与Java代码的页面,用于动态内容生成。Servlet通过生命周期方法如`init()`、`service()`和`destroy()`工作,而JSP在执行时编译成Servlet。两者在MVC架构中分工,Servlet处理逻辑,JSP展示数据。尽管有Spring MVC等框架,Servlet和JSP仍是理解Web开发基础的关键。
|
2天前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
|
2天前
|
缓存 小程序 前端开发
Java服务器端技术探秘:Servlet与JSP的核心原理
【6月更文挑战第23天】Java Web开发中的Servlet和JSP详解:Servlet是服务器端的Java小程序,处理HTTP请求并响应。生命周期含初始化、服务和销毁。创建Servlet示例代码展示了`doGet()`方法的覆盖。JSP则侧重视图,动态HTML生成,通过JSP脚本元素、声明和表达式嵌入Java代码。Servlet常作为控制器,JSP处理视图,遵循MVC模式。优化策略涉及缓存、分页和安全措施。这些技术是Java服务器端开发的基础。
|
2天前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
【6月更文挑战第23天】Java Web开发中,Servlet和JSP是构建动态Web应用的基础。Servlet处理逻辑,JSP专注展示。示例展示了Servlet如何通过`request.setAttribute`传递数据给JSP渲染。JSP自定义标签提升页面功能,如创建`WelcomeTag`显示欢迎消息。Servlet过滤器,如`CacheControlFilter`,用于预处理数据或调整响应头。这些集成和扩展技术增强了应用效率、安全性和可维护性,是Java服务器端开发的关键。