写点什么

【Servlet】这一文详细的讲述了 Servlet 的知识,呕心沥血,终于文成。

作者:游坦之
  • 2022-11-27
    山东
  • 本文字数:3424 字

    阅读完需:约 11 分钟

这篇博客真的很详细的讲述了 Servlet,看看不吃亏。如有错误欢迎指正,自古问过则喜。余虽无圣人之质,然愿效圣人之行。强作之者,亦英雄也。

什么是 Servlet?

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。


使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。


Servlet 是 Java 提供的一门动态 Web 资源开发技术


静态 Web 和动态 Web 有什么区别吗?

静态 Web,像 Html+Css+Js 这样的死页面,不会随着用户的改变而改变

而动态 Web,会区分用户的不同而为其展现不同的页面


Servlet 也是 JavaEE 十三项规范之一,所谓的规范也就是接口,所以我们要使用 Servlet,就需要 Servlet 类实现 Servlet 的接口,并在 Web 服务器上运行。Servlet 有五大方法,init、service、destory、getServletInfo、getServletConfig。


下图显示了 Servlet 在 Web 应用程序中的位置。


Servlet 的使用

1、创建一个 Web 项目,并集成 Tomcat

不会的可以看这篇文章:

2、引入 Servlet 的依赖

<dependency>      <groupId>javax.servlet</groupId>      <artifactId>javax.servlet-api</artifactId>      <version>3.1.0</version>      <scope>provided</scope></dependency>
复制代码


一定要加上 <scope>provided</scope>,因为 Tomcat 中是有 Servlet 的 jar 包的,再引入会冲突,反而会报错。这句话的作用是指这个依赖仅仅在测试和编译的情况下,才会被引入。

3、创建一个 Web 启动类

第一个是重写 Servlet 接口

package com.you.web;
import javax.jws.WebService;import javax.servlet.*;import javax.servlet.annotation.WebServlet;import java.io.IOException;
@WebServlet(urlPatterns = "/demo1")public class webServlet01 implements Servlet { @Override public void init(ServletConfig config) throws ServletException { System.out.println("init....."); }
@Override public ServletConfig getServletConfig() { return null; }
@Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("service...."); }
@Override public String getServletInfo() { return null; }
@Override public void destroy() { System.out.println("distory....."); }}
复制代码


启动 Tomcat,访问 demo1 看一下效果


第二个是继承 HttpServlet

package com.you.web;
import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;
@WebServlet(urlPatterns = "/demo2")public class webServlet02 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..."); }}
复制代码


访问 demo2 看一下效果


Servlet 的理解

Servlet 的执行流程

网页中请求的 URL 可以被切割为三部分,如下第一部分 htpp://localhsot:8080 的作用是找到服务器,第二部分 web-demo 的作用是找到 web 项目,第三部分 demo1 的作用则是找到 web 项目中的 Servlet。


Servlet 的生命周期

Servlet 的生命周期可以分为 4 个阶段:加载和实例化、初始化、请求处理、服务终止

加载和实例化阶段

默认情况下,当 Servlet 第一次被访问的时候,由容器创建 Servlet 对象。


当然,我们也不可以不默认。只需要使用 @WebService(urlPattems = "/demo",loadOnStartup = 1)


  • 当 loadOnStartup = 负整数时,这是默认情况,第一次被访问的时候创建 Servlet 对象。

  • 当 loadOnstartup = 0 或者正整数时,服务器启动的时候,就会创建 Servlet 对象,数字越小优先级就越高。


当项目比较大的时候,第一次访问时再创建 Servlet,用户就会等待一段时间,这样用户的体验感就会下降,这时候我们选择在服务器启动的时候创建 Servlet,用户就会有一个更好的体验感!

初始化阶段

在 Servlet 实例化之后,容器调用 Servlet 的**Init()**方法初始化这个对象,完成一些如加载配置文件,创建连接等初始化的工作。该方法只能调用一次。

请求处理

每次请求 Servlet 的时,Servlet 容器都会调用 service()的方法对请求进行处理。也就是每进入 Servlet 的网页,都会调用 Servlet 的 service()方法。

服务终止

当需要释放内存或者容器关闭时,容器就会调用 Servlet 实例的 destory()方法完成资源的释放。在 destory()方法调用之后,容器会释放这个 Servlet 实例,该实例随后会被 Java 的垃圾收集器所回收。


刚才提到 Servlet 有五大方法,init、service、destory、getServletInfo、getServletConfig。


常见问答题

Servlet 由谁创建?Servlet 方法由谁调用?


Servlet 由 Web 服务器创建,Servlet 方法由 Web 服务器调用。


服务器怎么知道 Servlet 中一定有 Service 方法?


因为我们自定义的 Servlet,必须实现 Servlet 接口并且复写其方法,而 Servlet 接口中有 Service 方法。

Servlet 的体系结构


B/S 和 C/S 的区别

C/S 就是指客户端/服务器模式。是计算机软件协同工作的一种模式,通常采取两层结构。服务器负责数据的管理,客户机负责完成与用户的交互任务。

B/S 型模式,即浏览器/服务器结构。它是 C/S 架构的一种改进,可以说属于三层 C/S 架构。主要是利用了不断成熟的 WWW 浏览器技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。

使用 HttpServlet 的原因

对于一个正常的项目来讲,他的请求方式不会是单一的,至少是 Post、Get 两种请求,这两种携带信息的位置并不一致,Post 携带信息的位置在请求体,而 Get 携带信息的位置在请求头,这意味着我必须对二者进行区分,才能正确拿到其携带的信息。

HttpServlet 的工作原理

HttpServlet 的工作原理非常的简单,用四个字概括即为分而治之,对于每一个请求判断是哪一类请求,如果是“Get”请求,就调用 doGet 方法,如果是“Post”请求,就去调用 doPost 方法。这是 do..方法,就是我们要使用的。


首先是调用 Servlet 自带的 service 方法,这里只做了一个操作就是把 ServletRequest 和 ServletResponse 转为 Http....,然后传到 service(Http.... req,Http... resp),然后获取请求方式的名字,并调用相应的方法。


UrlPatten 的配置

一个 Servlet,可以配置多个 urlPatton

Servlet 想要被访问,就必须配置其访问路径。最为便捷的方式是通过注解配置,也就是上面用到的 @WebServlet,其中有很多的属性,不同的属性之间用,隔开。今天我们讲的是 urlPatterns 属性,点来 WebServlet,可以看到这是一个对象,这意味着他可以配置多个属性,这也表明了:一个 Servlet 可以有多个 urlPattern(访问路径),如下


@WebServler(urlPatterns = {"/demo1","/demo2"})
复制代码


这意味着我可以通过 demo1 或者 demo2 访问这个 Servlet。


如果我只需要一个地址的话,则不需要加{},主需要写如下代码即可


@WebServlet(urlPatterns = "/demo1")
复制代码


这样我便可以通过 demo1 访问这个 Servlet 了。

配置规则

  1. 精确匹配 如 @WebServlet(urlPatterns = "/users/demo1"),那么我只能通过"users/demo1"访问这个 Servlet

  2. 目录匹配 如 @WebServlet(urlPatterns = "/users/*"),那么我可以通过"users/任何字符串"访问这个 Servlet

  3. 扩展名匹配 如 WebServlet(urlPatterns = "*.do"),那么我可以通过"任何字符串.do"访问这个 Servlet

  4. 任意匹配,如 WebServlet(urlPatterns = "/*"),那么我可以通过任何途径访问到这个 Servlet,但是注意不要设置成"/",这样会覆盖掉 DefaultServlet,导致静态页面无法加载。

Xml 配置访问路径(不建议使用)

在 Servlet3.0 之前,只支持 web.xml 配置访问路径。


需要在 Web.xml 下配置如下代码


<servlet>    <servlet-name>demo</servlet-name>    <servlet-class>com.you.web.ServletDemo02</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>demo</servlet-name>    <url-pattern>demo5</url-pattern>  </servlet-mapping>
复制代码



用户头像

游坦之

关注

还未添加个人签名 2022-10-14 加入

还未添加个人简介

评论

发布
暂无评论
【Servlet】这一文详细的讲述了Servlet的知识,呕心沥血,终于文成。_javaWeb_游坦之_InfoQ写作社区