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