Servlet笔记01Servlet简介与入门

文章目录[x]
  1. 1:前言
  2. 2:什么是Servlet
  3. 3:Servlet的前世今生
  4. 4:快速入门
  5. 5:执行原理
  6. 6:Servlet生命周期
  7. 6.1:init()方法
  8. 6.2:service()方法
  9. 6.3:destroy()方法
  10. 7:Servlet 3.0

前言

  • 由于下学期学校要进行JavaWeb的学习,故利用空闲时间复习一下相关知识,并撰写博客,方便自己复习以及帮助有需要的人

  • 前置技能:Java,计算机网络,HTML,CSS,JavaScript,MySQL,JDBC,XML,Tomcat

什么是Servlet

  • Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
  • 使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
  • Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势:
    • 性能明显更好。
    • Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
    • Servlet 是独立于平台的,因为它们是用 Java 编写的。
    • 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
    • Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。

Servlet的前世今生

  • 所谓Tomcat其实是Web服务器和Servlet容器的结合体
  • 什么是Web服务器?
    • 比如,我当前在杭州,你能否用自己的电脑访问我桌面上的一张图片?恐怕不行。我们太习惯通过URL访问一个网站、下载一部电影了。一个资源,如果没有URL映射,那么外界几乎很难访问。而Web服务器的作用说穿了就是:将某个主机上的资源映射为一个URL供外界访问。
  • 什么是Servlet容器?
    • Servlet容器,顾名思义里面存放着Servlet对象。我们为什么能通过Web服务器映射的URL访问资源?肯定需要写程序处理请求,主要3个过程:
    • 接收请求
    • 处理请求
    • 响应请求
  • 任何一个应用程序,必然包括这三个步骤。其中接收请求和响应请求是共性功能,且没有差异性。访问淘宝和访问京东,都是接收http://www.xxx.com/brandNo=1,响应给浏览器的都是JSON数据。于是,大家就把接收和响应两个步骤抽取成Web服务器:

  • 处理请求的逻辑是不同的。没关系,抽取出来做成Servlet,交给程序员自己编写。
  • 当然,随着后期互联网发展,出现了三层架构,所以一些逻辑就从Servlet抽取出来,分担到Service和Dao。(JavaWeb开发经典三层架构:代码分层,逻辑清晰,还解耦)

  • 但是Servlet并不擅长往浏览器输出HTML页面,所以出现了JSP。
  • 等Spring家族出现后,Servlet开始退居幕后,取而代之的是方便的SpringMVC。SpringMVC的核心组件DispatcherServlet其实本质就是一个Servlet。但它已经自立门户,在原来HttpServlet的基础上,又封装了一条逻辑。
  • 总之,很多新手程序员框架用久了,甚至觉得SpringMVC就是SpringMVC,和Servlet没半毛钱关系。

快速入门

  • 创建JavaEE项目

    image-20200728211130548

注意:图中“创建Web.xml”选项默认是勾上的,这里勾上和不勾上的影响一会儿再说,这里先默认勾上

  • 新建一个类,实现Servlet接口

    image-20200728213241430

  • 实现接口中的抽象方法

    image-20200728213710918

  • 在web.xml中进行配置

      <!-- 配置Servlet -->
      <servlet>
        <!-- Servlet 注册的名字 -->
        <servlet-name>demo01</servlet-name>
        <!-- Servlet 的全类名 -->
        <servlet-class>cn.youwolf.web.servlet.ServletDemo01</servlet-class>
      </servlet>
      <!-- 映射Servlet -->
      <servlet-mapping>
          <!-- 需要和某一个 servlet 节点的 serlvet-name 子节点的文本节点一致 -->
          <servlet-name>demo01</servlet-name>
         <!-- 映射具体的访问路径: / 代表当前 WEB 应用的根目录. -->
          <url-pattern>/demo01</url-pattern>
      </servlet-mapping>
  • 如果是IDEA,默认会自动打开默认浏览器访问index.jsp页面

    image-20200803165400375

  • 我们访问之前在web.xml中配置好的servlet访问路径

    image-20200803171652108

  • 可以在控制台看到输出的Helllo World

    image-20200803171745835

执行原理

  • 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
  • 查找web.xml文件,是否有对应的标签体内容。
  • 如果有,则在找到对应的全类名
  • tomcat会将字节码文件加载进内存,并且创建其对象
  • 调用其方法

image-20200801223551300

Servlet生命周期

  • Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
    • Servlet 通过调用 init () 方法进行初始化。
    • Servlet 调用 service() 方法来处理客户端的请求。
    • Servlet 通过调用 destroy() 方法终止(结束)。
    • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

init()方法

  • init() 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。

  • Servlet什么时候被创建?

    • 默认情况下,Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时。
    • 也可以指定Servlet的创建时机
    • <servlet>标签下配置
      • 第一次访问时创建:<load-on-startup>的值为负数
      • 在服务器启动时创建:<load-on-startup>的值为0或正整数
  • 当用户调用一个 Servlet 时,就会创建一个Servlet 实例,每一个用户请求都会产生一个新的线程,多个用户访问时,可能会存在线程安全问题,所以尽量不要在servlet中定义成员变量,即使定义了成员变量,也不要对其修改值

  • init()方法的定义如下:

    public void init(ServletConfig servletConfig) throws ServletException {
    
    }

service()方法

  • service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

  • 每次服务器接收到一个 Servlet请求时,服务器会产生一个新的线程并调用服务。每次访问Servlet时,service()方法都会被调用一次.

  • service()方法的定义如下:

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    
    }

destroy()方法

  • destroy()方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy()方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把Cookie列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

  • 只有服务器正常关闭时,才会执行destroy()方法。

  • 在调用 destroy()方法之后,servlet对象被标记为垃圾回收。

  • destroy()方法定义如下:

    public void destroy() {
    
    }

Servlet 3.0

  • Servlet 3.0以后, 支持了很多特性,其中一项就是支持注解配置了(JavaEE6开始支持Servlet 3.0)
  • 这次,我们重新创建一个JavaEE项目
  • 注意,在这里我们选择版本是3.0以上,不勾选创建web.xml

image-20200803162801676

  • 然后新建包,新建类,实现Servlet接口

  • 之后,在类上使用@WebServlet注解

    @WebServlet("资源路径")

    image-20200803164659405

点赞

发表评论

Title - Artist
0:00