Java教程

JavaWeb--Servlet

本文主要是介绍JavaWeb--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 配置了 "/*", 表示可以匹配任意访问路径

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

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

这篇关于JavaWeb--Servlet的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!