ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JavaWeb--Servlet

2022-04-17 21:01:07  阅读:158  来源: 互联网

标签:web 调用 JavaWeb -- Servlet urlPatterns servlet 请求


JavaWeb--Servlet

为了实现动态和前端用户交流的服务器程序,定制了servlet服务器程序规范(类似JDBC接口)

Tomcat等java程序遵守servlet接口规范,它可以直接调用servlet实现类,我们可以编写实现servlet子类,嫁接到不同的服务器容器使用(指Tomcat类的web服务器程序)

浏览器请求Servlet流程UML

浏览器请求静态资源的流程分析

浏览器调用Servlet流程分析

生命周期

  • init() 初始化阶段

    • Servlet 容器(比如: Tomcat)加载 Servlet,加载完成后,Servlet 容器会创建一个 Servlet 实例 并调用 init()方法,init()方法只会调用一次, Servlet 容器在下面的情况装载 Servlet:

      • Servlet 容器(Tomcat)启动时自动装载某些servlet,实现这个需要在 web.xml 文件中添加

        <load-on-startup>1</load-on-startup> 1 表示装载的顺序

      • 在Servlet 容器启动后,浏览器首次向 Servlet 发送请求

      • Servlet 重新装载时(比如 tomcat 进行 redeploy【redeploy 会销毁所有的 Servlet 实例】), 浏览器再向 Servlet 发送请求的第 1 次

  • service()处理浏览器请求阶段

    • 每收到一个 http 请求,服务器就会产生一个新的线程去处理[线程]
    • 创建一个用于封装 HTTP 请求消息的 ServletRequest 对象和一个代表HTTP响应消息的ServletResponse对象
    • 然后调用 Servlet 的 service()方法并将请求和响应对象作为参数传递进去
  • destroy()终止阶段

    • 当 web 应用被终止,或者 Servlet 容器终止运行,或者 Servlet 类重新装载时,会调用destroy()方法,比如重启 tomcat ,或者 redeploy web 应用

HttpServlet

在实际项目中,都是使用继HttpServlet类开发Servlet程序

它主要实现了对Http使用Servlet的流程代码基本封装,使用时只要重写doGet、doPost等方法即可快速实现服务

注意事项与细节

  • Servlet 是一个供其他 Java 程序(Servlet 引擎)调用的 Java 类,不能独立运行

  • 针对浏览器的多次 Servlet 请求,通常情况下,服务器只会创建一个 Servlet 实例对象, 也就是说 Servlet 实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web 容器退出/或者 redeploy 该 web 应用,servlet 实例对象才会销毁 【示意图】

  • 在 Servlet 的整个生命周期内,init 方法只被调用一次。而对每次请求都导致 Servlet 引

    擎调用一次 servlet 的 service 方法。

  • 对于每次访问请求,Servlet 引擎都会创建一个新的 HttpServletRequest 请求对象和一个

    新的 HttpServletResponse 响应对象,然后将这两个对象作为参数传递给它调用的 Servlet

    的 service()方法,service 方法再根据请求方式分别调用 doXXX 方法

  • 如果在<servlet>元素中配置了一个<load-on-startup>元素,那么 WEB 应用程序在启动时, 就会装载并创建 Servlet 的实例对象、以及调用 Servlet 实例对象的 init()方法, (定时发送邮件的服务/自动启动->完成任务)

注解方式

通过使用注解可以不需要使用xml来配置servlet相关参数,即可让servlet类被web服务容器实例化使用

@WebServlet(urlPatterns = {"/ok1", "/ok2"}) 
  • urlPatterns

    • 匹配

      • 精确匹配urlPatterns = "/ok/zs"
      • 目录匹配urlPatterns = "/ok/*"
      • 扩展名匹配urlPatterns = "*.action" | urlPatterns = "*.do"
      • 任意匹配urlPatterns = "/" | urlPatterns = "/*"
    • 注意

      • 当 Servlet 配置了 "/", 会覆盖 tomcat 的 DefaultServlet, 当其他的 utl-pattern 都匹配不上时 ,都 会 走 这 个 Servlet, 这 样 可 以 拦 截 到 其 它 静 态 资 源 , 比 如 D:\hspedu_javaweb_temp\hspedu_servlet\web\hi.html

        The default servlet for all web applications, that serves static resources. (这个DefaultServlet是处理静态资源的,一旦拦截,静态资源不能处理)

      • 当 Servelt 配置了 "/*", 表示可以匹配任意访问路径

      • 建议不要使用 / 和 /*, 建议尽量使用精确匹配

    • 优先级遵守: 精确路径 > 目录路径 > 扩展名路径 > /* > /

标签:web,调用,JavaWeb,--,Servlet,urlPatterns,servlet,请求
来源: https://www.cnblogs.com/shaozelong/p/16157331.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有