65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Jetty 服务静态 Web 内容

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2018 年 1 月 2 日

MIT

8分钟阅读

viewsIcon

30437

我将介绍两种使用 Jetty 作为 Web 服务器为最终用户提供静态内容的方法。这可用于开发中的测试。

引言

在本文中,我只想讨论使用 Jetty(J2EE Web 服务器)来为用户提供/分发静态 Web 内容的两种不同方法。静态 Web 内容是指网页文件(*.html)、JavaScript 文件(*.js)、非文本 Web 资源(如文本文件(*.txt)、图像文件(*.jpg、*.gif、*.png 等))。这是一个简单的技术问题,通常情况下,可以在 Web 浏览器中打开这些文件。如果这不能满足需求,还可以使用 HTTP Web 服务器,如 Apache Http Web Server 或 Nginx。或者,也可以使用 Python、Ruby on Rail 或 Node JS 来启动一个轻量级的 Web 服务器。

那么,使用 Jetty Web 服务器来简单地分发静态 Web 内容的意义何在?意义在于方便。我做了很多与 JavaScript 相关的工作,需要一个简单的 Web 服务器,允许最终用户打开一个网页,并测试 UI 交互。对我来说,花时间研究不熟悉的方法就是浪费时间。所以我进行了一些研究,发现有两种不同的方法可以使用 Jetty 启动 Web 服务器。事实证明这两种方法都很容易。我非常激动。

方法 #1

此方法需要 Jetty 9.3.x 及以上版本。您需要做的就是将一个 XML 文件放在 webapps 目录中,然后启动 Jetty Web 服务器。此 XML 文件将指示 Jetty Web 服务器指向一个目录,其中包含静态 Web 内容,并为请求它们的最终用户提供服务。

这是一个示例 XML 文件。我称之为junk.xml。您可以随意命名。名称无关紧要。您可以拥有任意数量的此类 XML 文件,每个文件都可以指向包含静态 Web 内容的文件夹。当 Jetty Web 服务器启动时,它将找到这些文件并创建虚拟 Web 应用程序,按需提供任何静态 Web 内容。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.server.handler.ContextHandler">
  <Set name="contextPath">/monkey</Set>
  <Set name="handler">
    <New class="org.eclipse.jetty.server.handler.ResourceHandler">
      <Set name="resourceBase">c:/DevJunk/monkey</Set>
      <Set name="directoriesListed">false</Set>
    </New>
  </Set>
</Configure>

此 XML 文件的内容如下:

  • contextPath:这是 Web 应用程序的上下文。例如:https://:8080/monkey,其中“monkey”是此处指定的名称。
  • handler:这指定了请求处理器。对于提供静态 Web 内容,此处使用的处理器称为:org.eclipse.jetty.server.handler.ResourceHandler
  • 处理器需要有一个基础目录来查找所有静态 Web 内容,这就是“resourceBase”在此处使用的原因。它将 C:\DevJunk\monkey 指定为基础文件夹。
  • 下一个(“directoriesListed”)指定在处理器解释的 URL 路径为目录时是否列出目录内容。出于安全原因,我通常将其设置为 false。但这里仅用于测试,所以设置成什么值无关紧要。要测试此功能,您可以浏览 https://:8080/monkey/,如果将其设置为 true,您将看到目录的内容。

以下是测试上述配置的方法:

  1. 假设您下载了 Jetty Web 服务器(Jetty 9.3.x 及以上版本),它是一个 zip 压缩包。解压缩并将其放在任意位置。
  2. 在此文件夹中,找到 webapps 文件夹。将 XML 文件放入此文件夹(webapps)。
  3. 然后创建文件夹结构 C:\DevJunk\monkey,并在 C:\DevJunk\monkey 中放入一个名为 junk5.txt 的文本文件。
  4. 在 Jetty Web 服务器的根文件夹中,使用此命令启动 Jetty Server。
  5. 使用 Web 浏览器导航到 https://:8080/monkey/junk5.txt。如果您在 junk5.txt 文件中放入了一些文本内容,您可以在 Web 浏览器中看到内容。

启动 Jetty Web 服务器的命令是:

java -jar start.jar

可以看到,这很容易做到。创建一个配置文件,设置静态 Web 内容文件夹和文件,然后启动 Web 服务器。它就可以进行测试和玩耍了。但是,这仅在您拥有 Java 1.8 和 Jetty 9.3.x 及以上版本时才有效。如果您没有 Java 1.8,只有一个较低版本呢?在下一节中,我将提供一个很好的替代方案。

方法 #2

如果您没有 Java 1.8,而是较低版本的 Java,并且您只有较低版本的 Jetty,或者其他基于 J2EE 的 Web 服务器。您想提供静态 Web 内容。前一种方法对您不起作用。但仍然有一个替代方案。它不需要任何 Java 编码,也不需要使用任何 IDE。您所需要做的就是创建一个文件夹结构,放入 web.xml,并将静态内容放入文件夹结构内的特定位置。

以下是完成此操作的步骤:

  1. 假设您下载了 Jetty Web 服务器(任何版本的 Jetty 都可以),它是一个 zip 压缩包。解压缩并将其放在任意位置。
  2. 假设您将 Jetty Web 服务器放在 C:\Jetty\。在此文件夹中,找到子文件夹 webapps。在其中,创建一个您喜欢的任何名称的子文件夹。为了演示,我将此子文件夹称为“monkey”。所以我有 C:\Jetty\webapps\monkey
  3. 在此 webapps 的子文件夹中(又称“monkey”),再创建一个名为 WEB-INF 的子文件夹。
  4. 在此 WEB-INF 文件夹中,放入一个名为 web.xml 的文件。

在继续之前,我想展示 web.xml 的内容。

<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_3_1.xsd"
         version="3.1">
   <servlet-mapping>
      <servlet-name>default</servlet-name>
      <url-pattern>/*</url-pattern>
   </servlet-mapping>
</web-app>

到目前为止,我已经创建了一个非常简单的 Web 应用程序。该 Web 应用程序称为“monkey”,它只是文件夹名称。对于 J2EE Web 服务器,当它启动并找到 Web 部署文件夹(在 Jetty 中是 webapps)中的目录时,它会查找一个名为 WEB-INF 的子文件夹,并在其中找到 web.xml。此 web.xml 将定义如何路由和处理 HTTP 请求。上述 web.xml 配置将接收任何 URL 前缀为 https://:8080/monkey 的 HTTP 请求。这并非由 web.xml 配置,默认情况下,文件夹名称“monkey”决定了子 URL 路径,也称为上下文。

您可能会问,这里没有 Java 代码,它如何处理 HTTP 请求?任何 J2EE 容器,如 Jetty 或 Tomcat 等,都有一个 DefaultHandler,可以通过 HTTP 请求向用户提供静态 Web 内容。这正是此 web.xml 指定的内容。在此 web.xml 中,“servlet-mapping”部分。元素“servlet-name”设置为 default。这告诉 J2EE Web 服务器,对于“monkey”这个应用程序,DefaultHandler 将用于处理 HTTP 请求。下一个元素指定了它将匹配的 URL 子路径,以便将 HTTP 请求路由到此 Web 应用程序。URL 模式设置为“/*”,意味着“monkey”名称下的任何请求(即 https://:8080/monkey/*)都将被路由到这个名为 monkey 的 Web 应用程序。

那么,静态内容放在哪里?在此“monkey” Web 应用程序的基础目录(即 c:\Jetty\webapps\monkey)中,我会放一个名为 junk.txt 的文本文件。然后启动 Jetty Web 服务器,并使用 Web 浏览器导航到 https://:8080/monkey/junk.txt。如果我一切都做对了,我会在 Web 浏览器中看到显示的文本内容。您也可以试试。

再补充一点,如果您的静态 Web 内容以复杂的文件夹结构组织,当您将它们放在此 Web 应用程序的基础目录中时,请求 URL 将使用相同的文件夹结构来指定要提取的静态 Web 文件。例如,您有一个 HTML 文件存储在 c:\Jetty\webapps\monkey\testwebpages\sales\order\test.html。要请求显示此文件,您可以使用此 URL:https://:8080/monkey/testwebpages/sales/order/test.html。试试就明白了。提供静态 Web 内容只需要这些。

关于这一点最后的说明,此方法可用于任何基于 J2EE 的 Web 服务器。您只需要找到 Web 应用程序部署的文件夹,这相当于 Jetty 中的 webapps。

关注点

总结一下。我创建本教程的目的是展示使用 Jetty Web 服务器提供静态 Web 内容的简便性。这将是测试 JavaScript 驱动的网页的绝佳方式。对于许多现代 Web 应用程序框架,仅使用 HTML 和 JavaScript 即可创建 Web 应用程序。其中大多数框架使用 AJAX 实现各种功能。如果没有 Web 服务器来托管此类应用程序,Web 浏览器有时将无法执行任何基于 AJAX 的功能。您可以通过使用 Chrome 浏览器轻松看到这一点。

对于熟悉 J2EE Web 服务器的任何人来说,与其使用不熟悉的技术,不如使用第二种方法,像真实的网站一样运行静态 Web 内容。我更喜欢 Jetty Web 服务器,因为它小巧,而且最新版本也支持第一种方法,这使配置更简单一些。但无论如何,都可以轻松地将静态 Web 内容作为本地测试的手段。希望这对有需要的人有所帮助。

历史

2017 年 12 月 23 日 - 初稿。

© . All rights reserved.