什么是Java Servlet?

391

我阅读了很多文章来理解Java Servlet,但是没有成功。

您可以用简单易懂的语言给我介绍一下Java Servlet吗?什么是servlet?有哪些优点?

我不理解服务器端编程语言(PHP、ASP)和Servlet之间的区别。


4
Servlets (http://stackoverflow.com/tags/servlets/info)你可以看一下。我认为这很详细且可靠。 - shohan
1
使用Servlet创建Web服务的简单教程。 - Joby Wilson Mathews
坚持上一个问题:“服务器端编程和Servlet之间的区别是什么”。Servlet是服务器的一部分,它接收例如HTTP请求,然后响应该请求,例如将HTML页面发送回用户。它实际上是控制器,为用户构建最终视图(请参见MVC)。因此,它类似于诸如PHP之类的技术,但这只是来自Java。 - Vaclav Vlcek
1
更新:现在被称为 Jakarta Servlet - Basil Bourque
12个回答

449
一个servlet只是响应特定类型的网络请求的类 - 最常见的是HTTP请求。基本上,servlet通常用于实现Web应用程序 - 但也有各种框架在servlet之上运行(例如Struts),以提供比servlet提供的“这是一个HTTP请求,请写入此HTTP响应”级别更高级别的抽象。
Servlet在处理网络方面运行在一个 servlet容器 中(例如解析HTTP请求,连接处理等)。其中最著名的开源servlet容器之一是 Tomcat

22
Servlets是Java代码片段,由Web服务器在其内部调用。如果您想要类似于PHP或ASP的东西,您需要JSP(一种特殊类型的Servlet)。 - Thorbjørn Ravn Andersen
5
谢谢您的问题,但我仍然无法真正理解Servlet的实际用途。如果您能通过示例来解释应用场景,那将更好。我不明白Servlet的用途,例如Servlet能做什么其他服务器端编程语言不能做的事情。 - hardik
5
@Hardik:并不是说他们能够做出其他方式无法实现的功能。Servlets只是服务器端Java工作常用的技术。Servlets并不是一种编程语言,ASPX也不是。它们都是与另一种编程语言结合使用的平台,通常情况下Servlets会与Java一起使用。 - Jon Skeet
8
正如我在帖子中所写的,Servlet是在Servlet容器内运行的类。 Servlet容器可以同时托管多个Servlet。 - Jon Skeet
6
@Hardik:是的,完全正确。Servlet可以提供HTML来显示表单,并在提交时进行操作。Servlet也可以用于实现Web服务。它们可以用于除HTTP之外的其他协议,但HTTP是Servlet处理的最常见传输协议。 - Jon Skeet
显示剩余13条评论

160

Servlet在本质上是一个Java类,可以处理HTTP请求。

通常,像Tomcat这样的容器会处理读取HTTP请求和响应的内部细节。这样作为服务器端开发人员,您可以专注于如何处理HTTP请求和响应,而不必去处理与网络等有关的代码。容器将处理诸如将整个内容包装在HTTP响应对象中并发送到客户端(例如浏览器)等事项。

现在下一个逻辑问题是谁决定容器应该做什么呢?答案是:至少在Java世界中,它是由规范指导的(请注意,我没有使用“控制”这个词)。例如,Servlet规范(参见资源2)规定了Servlet必须能够做什么。因此,如果您可以为规范编写实现,那么恭喜您,您刚刚创建了一个容器(从技术上讲,像Tomcat这样的容器还实现其他规范,并执行一些棘手的操作,如自定义类加载器等,但您已经明白了该怎么做)。

假设您有一个容器,那么您的Servlet就是Java类,其生命周期将由容器维护,但对传入的HTTP请求的反应将由您决定。您可以通过在预定义方法(如init(),doGet(),doPost()等)中编写您想要执行的操作来实现这一点。请参考资源3。

这里有一个有趣的练习。创建一个简单的Servlet,就像在Resource 3中一样,并在其构造方法(是的,您可以拥有Servlet的构造方法),init(),doGet(),doPost()方法中编写一些System.out.println()语句,然后在Tomcat中运行Servlet。查看控制台日志和Tomcat日志。

资源

  1. 查看HTTP Servlet的外观这里(Tomcat示例)。

  2. Servlet 规范

  3. 一个简单的Servlet 例子

  4. 开始阅读在线/PDF书籍,该网站也提供整本书的下载。如果您刚开始学习Servlets,可能最好是将材料与Servlet API一起阅读。这是一个较慢的学习过程,但对于理解基础知识更有帮助。


16
在Stack Overflow上,不鼓励发布仅带链接的回答,因为链接指向的资源可能在未来无法访问或发生变化。考虑对链接中涉及的内容进行概述,以完善回答。 - user456814
9
@Cupcake,感谢您的建设性反馈。我尝试给答案增加了一些实质内容。感谢您为改善社区所做的努力。 - Ayusman
Servlets如何与Jax-RS和Springboot配合使用?它们是否与这两种技术一起使用? - pixel
1
@pixel 最终它必须使用servlet。如果你查看Jax-RS / springboot的源代码,它在某个时候会扩展标准的Java servlet以提供所有的抽象和功能。 - Ayusman

46

除上述之外,显而易见的是...

对于很多人来说,这是非常明显的,但对于习惯编写只运行一次的应用程序的人来说,一个servlet大部分时间都在闲置状态...等待接收请求,并对其做出响应。因此,servlet有一个生命周期:它被初始化后等待着,响应任何被抛向它的东西,然后销毁。这意味着它必须由其他东西(框架)创建(以及稍后销毁),在自己的线程或进程中运行,并且除非被要求,否则什么也不做。另外,必须通过某种方式实现机制,使得这个“实体”能够“监听”请求。

我建议阅读关于线程、进程和套接字的文章将会使这些更清晰:这与基本的“hello world”应用程序的功能相当不同。

可以认为“服务器”或“servlet”的术语有点过头了。更合理和简单的名称可能是“响应器”。选择“服务器”一词的原因是历史性的:最早的这样的安排是“文件服务器”,多个用户/客户端终端会从中央计算机请求特定文件,然后像书或一盘鱼和薯条一样将该文件“提供”出来。


2
将Servlet视为标准MVC框架中的“控制器”类比是否不正确? - user2490003
1
就个人而言,我无法看出那个比喻的适用性。我也倾向于认为,那些认为我的答案有用(有助于澄清问题)的人可能会被你的建议所困惑。 - mike rodent
我认为这个答案很有用。但是在阅读它之前,我也曾经想过(不考虑这个回答),并且和@user2490003提出的问题相同。Servlet和MVC框架控制器之间的区别是什么?为什么用户2490003的类比不成立? - cellepo
1
一个MVC模式既更加复杂,但又没有那么复杂。它不一定需要等待输入。在定义服务器-客户端设置的基本概念时,我希望强调的是这种简单性。请查看此处的基本MVC图表:https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller。在简单的客户机-服务器设置中,用户仅与客户端交互,而不与两个对象(即视图和控制器)交互。使用MVC还可以有多个视图、多个控制器和多个模型。并且不需要等待输入。 - mike rodent
除此之外,服务器可以为多个用户提供服务,而 MVC 设置没有这样的要求。MVC 设置属于经典计算世界,即独立应用程序。通过服务器,我们迈出了进入交互式计算宇宙的第一步。并不是说这个类比是100%错误的,更多的是90%错误,并且最重要的是,如果这个类比实际上对任何人或任何事情都没有帮助,那么任何类比都是毫无用处的。服务器-客户端安排作为一个想法是如此简单,没有人需要任何形式的类比来理解。 - mike rodent
显示剩余2条评论

30
  • Servlet是什么?
  • Servlet只是一个响应特定类型的网络请求的类——最常见的是HTTP请求。
  • 通常,servlet主要用于实现Web应用程序,但也有各种基于servlet(例如Struts)的框架,提供比servlet更高级别的抽象,而不仅仅局限于“这是一个HTTP请求,请编写到此HTTP响应”的级别。
  • Servlet在servlet容器中运行,该容器处理网络方面的问题(例如解析HTTP请求、连接处理等)。其中,最著名的开源servlet容器之一是Tomcat。
  • 在请求/响应范例中,Web服务器只能向客户端提供静态页面。
  • 为了提供动态页面,我们需要Servlet。
  • Servlet只是一个Java程序。
  • 这个Java程序没有main方法,它只有一些回调方法。
  • Web服务器如何与Servlet通信?通过容器或Servlet引擎。
  • Servlet生命周期存在于Web容器内。
  • Web容器负责在servlet中调用方法。它知道Servlet具有哪些回调方法。
  • 请求流程
    • 客户端发送HTTP请求到Web服务器。
    • Web服务器将该HTTP请求转发到Web容器。
    • 由于Servlet无法理解HTTP(因为它是一个Java程序,只能理解对象),因此Web容器将该请求转换为有效的请求对象。
    • Web容器为每个请求启动一个线程。
    • 所有业务逻辑都在servlet中的doGet()或doPost()回调方法中执行。
    • Servlet构建一个Java响应对象并将其发送到容器。然后将其再次转换为HTTP响应以发送给客户端。
  • 容器如何知道客户端请求的是哪个Servlet?
    • 有一个名为web.xml的文件。
    • 这是Web容器的主文件。
    • 此文件中包含有关servlet的信息-
      • servlets
        • 定义了Servlet的名称和类名。
        • 它还指定了Servlet可以处理的URL。
      • servlet-mapping
        • 将Servlet映射到特定的URL。
  • Servlet名称
  • Servlet类
  • servlet映射- 像 /Login 或 /Notifications这样的路径会在此处映射
    • Servlet名称
    • url-pattern
  • 等等
  • Web应用程序中的每个servlet应该在此文件中有一个条目

  • 所以查找过程是这样的- url-pattern -> servlet-name -> servlet-class
  • 如何“安装”Servlet? * 好吧,servlet对象从库javax.servlet.*继承。可以使用Tomcat和Spring来利用这些对象以适应用例。

    参考- 在1.5x上观看- https://www.youtube.com/watch?v=tkFRGdUgCsE。这个视频有一个很棒的解释。


    1
    欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户了解它的内容和原因,然后引用您链接的页面中最相关的部分,以防目标页面不可用。仅仅提供链接的答案可能会被删除。 - Mogsdad
    1
    请注意,世界已经发生了变化。在2020年,我们使用代码注释来代替基于XML的中央字符串配置文件。 - Thorbjørn Ravn Andersen

    6

    Servlet是用于在Web应用程序中创建动态网页的服务器端技术。实际上,Servlet是一个API,包含一组类和接口,具有某些功能。当我们使用Servlet API时,可以使用Servlet类和接口的预定义功能。

    Servlet的生命周期:

    Web容器维护Servlet实例的生命周期。

    1. Servlet类被加载

    2. 创建Servlet实例

    3. 调用init()方法

    4. 调用service()方法

    5. 调用destroy()方法

    当客户端(浏览器)发出请求时,Web容器会检查Servlet是否正在运行,如果是,则调用service()方法并将响应返回给浏览器。

    当Servlet未运行时,Web容器遵循以下步骤:

    1. 类加载器加载Servlet类

    2. 实例化Servlet

    3. 初始化Servlet

    4. 调用service()方法

    在服务请求后,Web容器等待特定时间,在此期间如果请求到来,则仅调用service()方法,否则将调用destroy()方法。


    5
    Servlets是Java类,当网站用户从服务器请求URL时,它们运行某些功能。这些功能可以完成任务,例如将数据保存到数据库,执行逻辑并返回信息(例如JSON数据),以加载页面所需的信息。
    大多数Java程序使用main()方法在运行时执行代码。Java Servlet包含doGet()和doPost()方法,就像main()方法一样。当用户对映射到该Servlet的URL进行GET或POST请求时,将执行这些函数。因此,用户可以为GET请求加载页面,也可以从POST请求中存储数据。
    当用户发送GET或POST请求时,服务器读取目录中每个servlet类顶部的@WebServlet来决定调用哪个servlet类。例如,假设您有一个ChatBox类,并且在其顶部有以下内容:
    @WebServlet("/chat")
    public class ChatBox extends HttpServlet {
    

    当用户请求 /chat URL 时,你的 ChatBox 类将被执行。

    5

    如果您是初学者,我认为这个教程可以给您关于Servlet是什么...的基本概念。

    以下是来自给定链接的一些有价值的要点。

    Servlet技术用于创建位于服务器端并生成动态Web页面的Web应用程序。

    Servlet可以根据上下文以多种方式描述。

    • Servlet是一种技术,用于创建Web应用程序。
    • Servlet是一个API,提供许多接口和类,包括文档。
    • Servlet是必须实现以创建任何servlet的接口。
    • Servlet是扩展服务器功能并响应传入请求的类。它可以响应任何类型的请求。
    • Servlet是部署在服务器上创建动态Web页面的Web组件。 参考:这里

    1
    这是一个非常好的教程,它从基础概念开始讲解。 - Nikhil Sahu

    3
    Java Servlets是一种服务器端的Java程序模块,用于处理和响应客户端请求并实现Servlet接口。它有助于提高Web服务器的功能性,且开销、维护和支持成本最小化。
    Servlet作为客户端和服务器之间的中介。由于Servlet模块运行在服务器上,因此它们可以接收并响应客户端发出的请求。Servlet的请求和响应对象提供了一种方便的方式来处理HTTP请求并向客户端发送文本数据。
    由于Servlet与Java语言集成,因此它也具备Java的所有特性,例如高可移植性、平台独立性、安全性和Java数据库连接。

    2

    Servlet是一个Java类,用于响应HTTP请求并生成HTTP响应......当我们使用HTML制作页面时,它将成为静态页面,因此为了使其动态,我们使用SERVLET {简单地说,人们可以理解} 使用JSP来克服使用servlet,它在自身中使用代码和HTML标记。


    0
    本文所述,Servlet是扩展Java服务器并访问其功能的标准化方式。
    每个Servlet都可以看作是一个微型服务器(因此得名),它可以访问以Java代码建模的请求和响应,以及其他上下文数据,例如Session。
    有了这些,Servlet的Java代码就可以与需要接口的任何内容进行交互,包括将其移交给JSP页面以生成HTML视图。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接