本文翻译自 What are Java servlets? Request handling for Java web applications
Servlet在Java Web应用程序中提供URL映射和请求处理功能
请求处理是Java Web应用程序开发的基础。为了响应来自网络的请求,Java Web应用程序必须首先确定将对请求URL进行响应的代码,然后封送响应。 每个技术栈都有完成请求-响应处理的方式。 在Java中,我们为此目的使用servlet(和Java Servlet API)。将Servlet视为微型服务器,其工作是接受请求并发出响应。
URL 和 endpoint
作为Internet用户,您熟悉URL作为浏览器中的网站地址。
作为开发人员,您可能还知道URL作为Web服务的 endpoint 。 URL(统一资源定位符)是使用文本描述和定位Internet资源的标准方法。
术语endpoint 是指表示Web服务的URL。 术语“endpoint ”和“ URL”通常可互换使用,尽管它们指的是不同的使用域。
正如我在Java Runtime Environment简介中所解释的那样,我们可以将软件视为一系列层次。 软件系统中的每一层都具有其上一层所要求的某些功能。 例如,硬件层位于固件层下面,支持其功能。 同样,需要固件层(PC上的BIOS或Mac上的EFI)来运行操作系统。 图1分层显示了这三个组件。
您也可以将软件系统视为一系列容器,其中较低的层充当较高层的容器。 每一层都充当运行下一功能级别的上下文:硬件包含固件,而固件包含操作系统。
服务器端Java应用程序是用作网络端点,从给定URL接收HTTP请求并以HMTL或JSON之类的互换格式发送回数据的广泛应用程序之一。 服务器端Java由标准化Java服务器和用于与这些服务器交互的技术组成。 Java Servlet API是用于与Java服务器进行交互的标准。
在基于Java的系统中,操作系统(OS)包含JVM,JVM为运行Java应用程序提供了一致的环境。 Java服务器位于JVM的顶部。 就像JVM是OS和Java应用程序之间的中介一样,Java服务器也提供对操作系统的网络和处理功能的一致,简化的访问。 一个Java应用程序在服务器内部运行,使用Java Servlet API访问服务器的功能。
Java Servlet规范为Java服务器和相关组件提供了基础定义。 它定义了服务器在通过HTTP进行网络交互期间将如何发送请求和响应。 所有Java服务器必须与Java Servlet规范兼容。 如今,大多数Java服务器都与Servlet 4.0兼容。
Servlet 4.0
Java Servlet规范的每个版本都带来新功能。 Servlet 4.0包括对HTTP /
2协议及其服务器推送机制的支持。 服务器推送使服务器可以预加载网页所需的资产,而不必等待特定的请求。 Servlet 4.0规范还包含了在运行时发现URL映射的功能,这一功能称为运行时发现。
为了对Servlet规范的工作原理有实际的了解,请考虑您当前正在阅读的文章。 在JavaWorld基础架构的某个地方,本文已格式化并提交发表。 它被分配了一个URL,通过网络路由,并到达了服务器。 服务器将工件(文章)与URL连接起来,并确定当对该URL的GET请求到达时,它将把本文作为HTML发回。
创建Java Web应用程序时,将创建在Java服务器内部运行的软件。 该应用程序利用服务器上下文提供的功能,其中之一是Servlet API。 因此,实现Servlet规范的Java服务器有时称为Servlet容器。
要创建Servlet,您需要实现Servlet接口并将其部署在Servlet容器中。 图3显示了您的应用程序如何依赖servlet。
现在您已经有了概念上的概述,让我们开始编写Java servlet的工作。您需要的第一件事是servlet容器,也称为Java应用程序服务器。 Tomcat和Jetty是两个最受欢迎的servlet容器。 我们将使用Tomcat,因为它是Java上最悠久的应用服务器之一。 Tomcat是免费的,并且包含最少的花哨功能,这对于我们的示例来说很简单。 (顺便说一句,“钟声和口哨声”是一个技术术语。)
如果您还没有Tomcat,请先打开Tomcat下载页面。 在这里,您可以选择Windows安装程序或最适合您计算机的ZIP下载(例如,我正在下载64位Windows zip)。
就是这样:您刚刚将Java服务器层添加到了操作系统中!
在继续之前,让我们确保您可以运行Tomcat。 启动Windows服务,或从命令行运行startup.sh或startup.bat文件。
如果现在打开Web浏览器并转到localhost:8080,则以下屏幕将为您打招呼:
如果在运行Tomcat时遇到任何问题,可以访问Tomcat文档进行故障排除。
现在让我们看一下Java servlet。 方便地,Tomcat包含了一些简单的示例。
单击在Tomcat欢迎页面的“开发人员快速入门”部分中看到的“示例”链接。 到达那里后,单击Servlet示例链接。
现在,您可以通过单击Hello World示例的Execute链接来查看运行中的简单Servlet。 这样会将您的浏览器带到http:// localhost:8080 / examples / servlets / servlet / HelloWorldExample URL,在该URL中您将看到常年程序员的问候。
单击浏览器中的“后退”箭头,然后单击HelloWorld应用程序的源链接。 清单1中显示了源代码。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("");
out.println("");
out.println("Hello World! ");
out.println("");
out.println("");
out.println("Hello World!
");
out.println("");
out.println("");
}
}
这个非常简单的代码清单包含Java Servlet的基本组件。 让我们逐步分析它。
第一行调用标准Java导入。 之后,程序定义一个新类,该类扩展了HttpServlet类。 这很关键,因为Servlet必须实现Servlet接口才能在Servlet容器中运行。
接下来,HelloWorld类定义一个名为doGet()的方法。 这是servlet上的标准方法:它告诉服务器将HTTP GET请求路由到该方法。 其他HTTP方法(如POST)由名称相似的方法(如doPost)处理。
注意,doGet()有两个参数:(HttpServletRequest请求,HttpServletResponse响应)。 这两个对象分别代表请求和响应。 它们提供对您的代码处理请求和发出响应所需的一切的访问。 例如,在HelloWorld.doGet servlet方法中,响应对象用于通知服务器要发出的内容类型标头。 在这种情况下,它是response.setContentType(“ text / html”);。
最后,程序从响应response.getWriter()获取Java Writer对象。 然后,使用Writer创建简单的HTML响应以返回到浏览器。
清单1中的结构和代码流非常直观,但是有一个明显的遗漏。 服务器如何知道将http:// localhost:8080 / examples / servlets / servlet / HelloWorldExample URL与HelloWorld.doGet方法相关联?
您将在应用程序元数据中找到此谜的答案。 每个Java Web应用程序都包含一个称为web.xml的标准元数据文件,该文件告诉服务器如何将URL映射到servlet。
什么是元数据?
元数据是用于从软件本身外部控制软件操作的任何信息。
在Tomcat示例应用程序中,可以在\ apache-tomcat-9.0.11 \ webapps \ examples \ WEB-INF \ web.xml中找到web.xml。 \ WEB-INF \ web.xml是servlet的元数据文件的标准位置。 如果打开此文件,您将看到服务器的配置方式。
清单2中的缩写web.xml包含了我们讨论所需的信息。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<!-- ...CODE REMOVED FOR BREVITY... -->
<servlet>
<servlet-name>HelloWorldExample</servlet-name>
<servlet-class>HelloWorldExample</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldExample</servlet-name>
<url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
</servlet-mapping>
<!-- ...CODE REMOVED FOR BREVITY... -->
</web-app>
清单2显示了一个典型的XML文件头,该头引用了Java Web应用程序描述符的模式。 这之后是两个条目:和。
对的调用通过和字段将逻辑名HelloWorldExample分配给HelloWorldExample类。
对的调用将该逻辑名分配给值,从而将代码与URL关联。
请注意,字段支持通配符,以便处理各种灵活的URL映射。
除了URL映射外,Servlet还提供了其他用于过滤和身份验证的功能。 过滤器用于处理请求,身份验证用于为URL模式分配简单的用户和角色。 JavaServer Pages(JSP)规范提供了以更强大的方式生成HTML的支持。
本文是Java Servlet的概念性概述,包括Java服务器内部的URL请求和响应处理。 了解服务器端Java的这些基本元素将帮助您集成更高级的概念,例如Servlet 4.0中的服务器推送和URL映射的运行时发现。