21、Java Web 开发:服务器搭建与 HttpClient 使用指南

Java Web 开发:服务器搭建与 HttpClient 使用指南

在当今数字化的时代,Java 在 Web 开发领域一直占据着重要的地位。曾经,Java Applets 和 Java Web Start 技术让 Java 在 Web 世界崭露头角,但由于安全问题,这些技术逐渐退出了历史舞台。不过,随着 Java 11 引入

HttpClient

类,Java 与 Web 之间又建立了新的联系。本文将详细介绍如何搭建 Web 服务器,并使用

HttpClient

类进行 HTTP 连接。

1. Web 基础:浏览器、URL 和 HTML 页面

Web 浏览器(如 Chrome、Edge、Firefox、Safari 等)通过统一资源定位符(URL)从万维网上的远程站点检索信息,这些信息大多以超文本标记语言(HTML)网页的形式呈现。

1.1 URL

URL 是服务器上资源的互联网地址,通常由三部分组成:协议、服务器地址和资源名称(包括路径信息)。在 Java 中,有时会使用更宽泛的术语统一资源标识符(URI)。

-

HTTP 协议

:网页的协议前缀是

http://

,代表“超文本传输协议”,大多数 URL 都以这种方式开头,该部分通常可省略,因为它是浏览器的默认协议。

-

服务器地址

:通常以

www

开头,后面跟着站点名称和“域名”,域名定义了站点的类别,可能包括国家代码。例如,

foundjava.com

中,

foundjava

是服务器站点名称,

com

表示公司。常见的域名还有

edu

(学术机构)和

org

(组织)。如果在本地机器上运行测试服务器,域名则为

localhost

-

路径和资源名称

:URL 的最后一部分可以包括文件的位置(目录)和名称。文件名通常以

html

htm

结尾。如果未指定文件名,服务器通常会返回默认的

index.html

文件。如今,包含文件名的 URL 正逐渐被“简洁 URL”或“slug”所取代,这种 URL 没有文件名,以类似文件夹的形式引用页面,对服务器上的文件更改更具鲁棒性,也更适合搜索引擎。

1.2 HTML

HTML 是用于创建网页的标记语言。所有 HTML 文件都以

标签开头,以

标签结尾。HTML 标签通常使用斜杠和标签名来结束。例如,一个简单的 HTML 文件可能包含页面头部(

)、标题(

</p> <p>)、正文(</p> <p><body></p> <p>)和文本。可以在 Eclipse 中创建 HTML 文件,右键单击文件并选择“Open With”,可以使用 Web 浏览器打开。</p> <p>2. 搭建 Tomcat 服务器</p> <p>Tomcat 是一个开源的 Java 应用服务器,支持 Jakarta EE 规范的 Web 应用组件。它可以生成动态内容,也可以通过内置的 HTTP 服务器提供静态内容。</p> <p>2.1 安装和启动 Tomcat</p> <p>可以从 https://tomcat.apache.org/ 下载 Tomcat 的压缩包,将其解压到计算机的合适位置。以 Windows 为例,假设将其解压到</p> <p>C:\apache-tomcat-10</p> <p>。</p> <p>启动 Tomcat 的步骤如下:</p> <p>1. 打开命令提示符,导航到 Tomcat 安装目录的</p> <p>bin</p> <p>文件夹。</p> <p>2. 输入</p> <p>startup</p> <p>命令启动服务器。首次安装时,如果未设置</p> <p>JAVA_HOME</p> <p>环境变量,启动会失败。可以使用文本编辑器创建一个名为</p> <p>setenv.bat</p> <p>的文件,并将其添加到</p> <p>bin</p> <p>文件夹中,文件内容根据 Java 安装位置进行设置。</p> <p>3. 成功启动后,会出现一个单独的“Tomcat”窗口,显示一些日志消息,不要关闭此窗口,否则会停止服务器。</p> <p>2.2 “localhost” URL 和端口号</p> <p>在本地机器上运行测试服务器时,使用回环地址</p> <p>127.0.0.1</p> <p>,也称为</p> <p>localhost</p> <p>。Tomcat 内置的 HTTP 服务器默认运行在端口 8080,因此可以使用</p> <p>http://localhost:8080</p> <p>连接到本地服务器。打开 Web 浏览器,访问该 URL,应该会看到默认的 Tomcat 服务器主页。</p> <p>停止服务器的方法有两种:一种是直接关闭运行服务器的命令窗口;另一种是运行</p> <p>bin</p> <p>文件夹中的</p> <p>shutdown</p> <p>文件,这种方法可以让 Tomcat 有序地关闭线程。</p> <p>3. 将 Web 应用程序部署到 Tomcat</p> <p>Web 应用程序是 Jakarta 企业版(Jakarta EE)的一部分,部署 Java Web 应用程序需要特定的文件夹和文件结构。</p> <p>3.1 XML 部署描述符</p> <p>web.xml</p> <p>是一个 XML 文件,用于配置 Web 服务器如何部署应用程序中的资源。它必须是格式良好且有效的 XML,应用服务器在部署应用程序时会验证该描述符。可以在 Eclipse 的</p> <p>src</p> <p>文件夹中创建一个文本文件作为 XML 部署描述符。一个有用的元素是</p> <p>welcome-file-list</p> <p>,用于配置客户端连接到 Web 应用程序的 URI 时默认显示的页面。</p> <p>3.2 部署到服务器</p> <p>要将 Web 应用程序部署到 Tomcat,需要创建一个 Web 存档(WAR)文件,并将其部署到服务器的</p> <p>webapps</p> <p>文件夹中。可以使用 Ant 来完成这些操作。</p> <p>以下是一个 Ant 构建文件的示例:</p> <p><project name="WebAppDeployment" default="copy-war" basedir="."></p> <p><property name="deployfolder" value="deploy"/></p> <p><property name="sourcefolder" value="src"/></p> <p><property name="configfolder" value="src"/></p> <p><property name="webapp" value="foundjava.war"/></p> <p><property name="tomcat-deploy" value="C:\apache-tomcat-10\webapps"/></p> <p><target name="prepare"></p> <p><mkdir dir="${deployfolder}"/></p> <p><copy todir="${deployfolder}"></p> <p><fileset dir="${sourcefolder}" includes="welcome.html"/></p> <p></copy></p> <p><mkdir dir="${deployfolder}/WEB-INF"/></p> <p><copy file="${configfolder}/web.xml" todir="${deployfolder}/WEB-INF"/></p> <p></target></p> <p><target name="createwar" depends="prepare"></p> <p><war destfile="${webapp}" webxml="${deployfolder}/WEB-INF/web.xml"></p> <p><fileset dir="${deployfolder}"/></p> <p></war></p> <p></target></p> <p><target name="copy-war" depends="createwar"></p> <p><copy file="${webapp}" todir="${tomcat-deploy}"/></p> <p></target></p> <p></project></p> <p>运行 Ant 批处理文件,使用默认目标</p> <p>copy-war</p> <p>,可以看到 WAR 文件被创建并部署到服务器。部署成功后,Web 应用程序将以 WAR 文件的名称命名,例如</p> <p>foundjava</p> <p>。可以使用</p> <p>http://localhost:8080/foundjava</p> <p>访问该应用程序。</p> <p>4. HttpClient 类</p> <p>有了运行的 Web 服务器后,就可以使用</p> <p>java.net.http.HttpClient</p> <p>类让 Java 程序与服务器建立 HTTP 连接。</p> <p>HttpClient</p> <p>类在 Java 11 中引入,具有复杂的配置选项和方法,本文仅介绍其基本用法。</p> <p>以下是一个使用</p> <p>HttpClient</p> <p>进行异步连接的示例:</p> <p>import java.net.URI;</p> <p>import java.net.http.HttpClient;</p> <p>import java.net.http.HttpRequest;</p> <p>import java.net.http.HttpResponse;</p> <p>import java.util.concurrent.CompletableFuture;</p> <p>public class HttpSourceReader {</p> <p>public static String getHttpString(URI uri) {</p> <p>HttpClient client = HttpClient.newHttpClient();</p> <p>HttpRequest request = HttpRequest.newBuilder()</p> <p>.uri(uri)</p> <p>.build();</p> <p>CompletableFuture<String> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString())</p> <p>.thenApply(HttpResponse::body);</p> <p>return future.join();</p> <p>}</p> <p>}</p> <p>可以使用以下类来测试:</p> <p>import java.net.URI;</p> <p>import java.net.URISyntaxException;</p> <p>public class TestHttpSourceReader {</p> <p>public static void main(String[] args) {</p> <p>try {</p> <p>URI uri = new URI("http://localhost:8080/foundjava");</p> <p>String response = HttpSourceReader.getHttpString(uri);</p> <p>System.out.println(response);</p> <p>} catch (URISyntaxException e) {</p> <p>e.printStackTrace();</p> <p>}</p> <p>}</p> <p>}</p> <p>5. 读取 HTML 到 Swing HTMLEditorKit</p> <p>如果读取的是 HTML 文件,可以使用</p> <p>HTMLEditorKit</p> <p>将其显示在客户端应用程序中。以下是一个示例:</p> <p>import javax.swing.*;</p> <p>import javax.swing.text.html.HTMLEditorKit;</p> <p>import java.io.IOException;</p> <p>import java.net.URI;</p> <p>import java.net.URISyntaxException;</p> <p>public class HtmlViewer {</p> <p>public static void main(String[] args) {</p> <p>try {</p> <p>JFrame frame = new JFrame("HTML Viewer");</p> <p>frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</p> <p>JEditorPane editorPane = new JEditorPane();</p> <p>editorPane.setEditable(false);</p> <p>HTMLEditorKit kit = new HTMLEditorKit();</p> <p>editorPane.setEditorKit(kit);</p> <p>URI uri = new URI("http://localhost:8080/foundjava");</p> <p>String html = HttpSourceReader.getHttpString(uri);</p> <p>editorPane.setText(html);</p> <p>JScrollPane scrollPane = new JScrollPane(editorPane);</p> <p>frame.getContentPane().add(scrollPane);</p> <p>frame.setSize(800, 600);</p> <p>frame.setVisible(true);</p> <p>} catch (URISyntaxException | IOException e) {</p> <p>e.printStackTrace();</p> <p>}</p> <p>}</p> <p>}</p> <p>6. 读取 JSON Web 服务</p> <p>Web 不仅可以托管网页,还可以作为许多其他服务的平台,其中一种常见的服务是 RESTful Web 服务,通常使用 JavaScript 对象表示法(JSON)来实现。</p> <p>OpenWeather 服务</p> <p>:以 OpenWeather 服务为例,它通过多个不同的 API 提供免费的天气数据。要使用其 API,需要先创建一个账户获取 API 密钥。例如,查询伦敦天气的 API 调用如下:</p> <p>https://api.openweathermap.org/data/2.5/weather?q=London&units=metric&appid=YOUR_API_KEY</p> <p>处理 JSON Web 服务</p> <p>:目前 Java 没有标准的 JSON 解析库,可以使用第三方工具 JSON.simple。首先,从 https://cliftonlabs.github.io/json-simple/ 下载</p> <p>json.simple.jar</p> <p>文件,并将其添加到项目的模块路径中。</p> <p>以下是一个处理 OpenWeather 服务返回的 JSON 数据的示例:</p> <p>import org.json.simple.JSONArray;</p> <p>import org.json.simple.JSONObject;</p> <p>import org.json.simple.parser.JSONParser;</p> <p>import org.json.simple.parser.ParseException;</p> <p>import java.io.IOException;</p> <p>import java.net.URI;</p> <p>import java.net.URISyntaxException;</p> <p>public class WeatherDataParser {</p> <p>public static void main(String[] args) {</p> <p>try {</p> <p>URI uri = new URI("https://api.openweathermap.org/data/2.5/weather?q=London&units=metric&appid=YOUR_API_KEY");</p> <p>String jsonData = HttpSourceReader.getHttpString(uri);</p> <p>JSONParser parser = new JSONParser();</p> <p>JSONObject jsonObject = (JSONObject) parser.parse(jsonData);</p> <p>String cityName = (String) jsonObject.get("name");</p> <p>System.out.println("City: " + cityName);</p> <p>JSONArray weatherArray = (JSONArray) jsonObject.get("weather");</p> <p>for (Object obj : weatherArray) {</p> <p>JSONObject weatherObj = (JSONObject) obj;</p> <p>String description = (String) weatherObj.get("description");</p> <p>System.out.println("Weather: " + description);</p> <p>}</p> <p>JSONObject mainObj = (JSONObject) jsonObject.get("main");</p> <p>double temperature = (double) mainObj.get("temp");</p> <p>System.out.println("Temperature: " + temperature + " °C");</p> <p>} catch (URISyntaxException | IOException | ParseException e) {</p> <p>e.printStackTrace();</p> <p>}</p> <p>}</p> <p>}</p> <p>通过以上步骤,我们可以搭建一个 Web 服务器,部署 Web 应用程序,并使用</p> <p>HttpClient</p> <p>类与服务器进行 HTTP 连接,处理 HTML 和 JSON 数据。这些技术为 Java Web 开发提供了强大的支持。</p> <p>总结</p> <p>本文详细介绍了使用 Tomcat Jakarta EE 应用服务器设置 Web 服务器的过程,包括安装、启动和部署 Web 应用程序。同时,还介绍了 Java</p> <p>HttpClient</p> <p>类的使用,以及如何处理 HTML 和 JSON 数据。通过这些知识,开发者可以更好地进行 Java Web 开发。</p> <p>流程图</p> <p>graph TD;</p> <p>A[开始] --> B[了解 Web 基础];</p> <p>B --> C[搭建 Tomcat 服务器];</p> <p>C --> D[部署 Web 应用程序];</p> <p>D --> E[使用 HttpClient 连接服务器];</p> <p>E --> F[处理 HTML 或 JSON 数据];</p> <p>F --> G[结束];</p> <p>表格</p> <p>操作步骤</p> <p>描述</p> <p>1</p> <p>了解 Web 浏览器、URL 和 HTML 页面的基本概念</p> <p>2</p> <p>从 https://tomcat.apache.org/ 下载 Tomcat 压缩包并解压</p> <p>3</p> <p>设置</p> <p>JAVA_HOME</p> <p>环境变量,启动 Tomcat 服务器</p> <p>4</p> <p>创建 HTML 文件和</p> <p>web.xml</p> <p>部署描述符</p> <p>5</p> <p>使用 Ant 创建 WAR 文件并部署到 Tomcat</p> <p>6</p> <p>使用</p> <p>HttpClient</p> <p>类进行 HTTP 连接</p> <p>7</p> <p>处理 HTML 或 JSON 数据</p> <p>Java Web 开发:服务器搭建与 HttpClient 使用指南</p> <p>7. 实战示例:创建 Swing 框架显示天气数据</p> <p>在前面的内容中,我们已经了解了如何使用</p> <p>HttpSourceReader</p> <p>从 OpenWeather 服务读取 JSON 天气数据,以及如何解析这些数据。现在,我们将创建一个 Swing 框架,用于显示选定的天气数据。</p> <p>以下是实现该功能的 Java 代码:</p> <p>import javax.swing.*;</p> <p>import org.json.simple.JSONArray;</p> <p>import org.json.simple.JSONObject;</p> <p>import org.json.simple.parser.JSONParser;</p> <p>import org.json.simple.parser.ParseException;</p> <p>import java.awt.*;</p> <p>import java.io.IOException;</p> <p>import java.net.URI;</p> <p>import java.net.URISyntaxException;</p> <p>public class WeatherDisplayFrame extends JFrame {</p> <p>public WeatherDisplayFrame() {</p> <p>setTitle("Weather Display");</p> <p>setSize(300, 200);</p> <p>setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</p> <p>setLayout(new FlowLayout());</p> <p>try {</p> <p>URI uri = new URI("https://api.openweathermap.org/data/2.5/weather?q=London&units=metric&appid=YOUR_API_KEY");</p> <p>String jsonData = HttpSourceReader.getHttpString(uri);</p> <p>JSONParser parser = new JSONParser();</p> <p>JSONObject jsonObject = (JSONObject) parser.parse(jsonData);</p> <p>String cityName = (String) jsonObject.get("name");</p> <p>JLabel cityLabel = new JLabel("City: " + cityName);</p> <p>add(cityLabel);</p> <p>JSONArray weatherArray = (JSONArray) jsonObject.get("weather");</p> <p>for (Object obj : weatherArray) {</p> <p>JSONObject weatherObj = (JSONObject) obj;</p> <p>String description = (String) weatherObj.get("description");</p> <p>JLabel weatherLabel = new JLabel("Weather: " + description);</p> <p>add(weatherLabel);</p> <p>}</p> <p>JSONObject mainObj = (JSONObject) jsonObject.get("main");</p> <p>double temperature = (double) mainObj.get("temp");</p> <p>JLabel tempLabel = new JLabel("Temperature: " + temperature + " °C");</p> <p>add(tempLabel);</p> <p>} catch (URISyntaxException | IOException | ParseException e) {</p> <p>e.printStackTrace();</p> <p>}</p> <p>}</p> <p>public static void main(String[] args) {</p> <p>SwingUtilities.invokeLater(() -> {</p> <p>WeatherDisplayFrame frame = new WeatherDisplayFrame();</p> <p>frame.setVisible(true);</p> <p>});</p> <p>}</p> <p>}</p> <p>在上述代码中,我们创建了一个</p> <p>WeatherDisplayFrame</p> <p>类,继承自</p> <p>JFrame</p> <p>。在构造函数中,我们首先设置了窗口的标题、大小和关闭操作。然后,我们使用</p> <p>HttpSourceReader</p> <p>从 OpenWeather 服务读取 JSON 天气数据,并解析这些数据。最后,我们将解析后的数据显示在 Swing 框架中。</p> <p>8. 常见问题及解决方案</p> <p>在进行 Java Web 开发过程中,可能会遇到一些常见问题,以下是一些问题及对应的解决方案:</p> <p>问题描述</p> <p>解决方案</p> <p>Tomcat 启动失败,提示</p> <p>JAVA_HOME</p> <p>未设置</p> <p>使用文本编辑器创建</p> <p>setenv.bat</p> <p>文件,添加到 Tomcat 的</p> <p>bin</p> <p>文件夹中,并设置</p> <p>JAVA_HOME</p> <p>环境变量指向 Java 安装目录</p> <p>Ant 构建文件运行时出错</p> <p>检查构建文件中的属性设置是否正确,确保文件路径和文件名与实际情况一致</p> <p>HttpClient</p> <p>连接失败</p> <p>检查服务器地址和端口号是否正确,确保服务器正在运行</p> <p>JSON 解析出错</p> <p>检查 JSON 数据格式是否正确,确保</p> <p>json.simple.jar</p> <p>文件已正确添加到项目的模块路径中</p> <p>9. 最佳实践建议</p> <p>为了提高 Java Web 开发的效率和质量,以下是一些最佳实践建议:</p> <p>-</p> <p>代码结构清晰</p> <p>:将不同功能的代码封装成独立的类和方法,提高代码的可读性和可维护性。例如,将</p> <p>HttpClient</p> <p>的使用封装在</p> <p>HttpSourceReader</p> <p>类中,方便复用。</p> <p>-</p> <p>异常处理</p> <p>:在代码中合理处理异常,避免程序因异常而崩溃。例如,在使用</p> <p>HttpClient</p> <p>进行连接和读取数据时,捕获并处理可能出现的</p> <p>IOException</p> <p>和</p> <p>URISyntaxException</p> <p>。</p> <p>-</p> <p>资源管理</p> <p>:及时释放不再使用的资源,避免资源泄漏。例如,在使用</p> <p>JFrame</p> <p>等 Swing 组件时,确保在窗口关闭时正确释放资源。</p> <p>-</p> <p>配置管理</p> <p>:将配置信息(如服务器地址、API 密钥等)集中管理,方便修改和维护。可以使用属性文件或环境变量来存储配置信息。</p> <p>10. 拓展学习资源</p> <p>如果你想进一步深入学习 Java Web 开发,可以参考以下资源:</p> <p>-</p> <p>官方文档</p> <p>:Java 官方文档提供了详细的 API 文档和教程,是学习 Java 的重要资源。</p> <p>-</p> <p>在线课程</p> <p>:Coursera、Udemy 等平台上有许多关于 Java Web 开发的在线课程,可以系统地学习相关知识。</p> <p>-</p> <p>开源项目</p> <p>:在 GitHub 上搜索 Java Web 开发相关的开源项目,学习他人的代码和设计思路。</p> <p>-</p> <p>技术博客</p> <p>:关注一些知名的技术博客,如 InfoQ、开源中国等,了解最新的技术动态和实践经验。</p> <p>流程图</p> <p>graph TD;</p> <p>A[创建 Swing 框架] --> B[读取 JSON 天气数据];</p> <p>B --> C[解析 JSON 数据];</p> <p>C --> D[显示天气数据];</p> <p>D --> E[结束];</p> <p>总结</p> <p>本文全面介绍了 Java Web 开发的相关知识,包括 Web 基础、Tomcat 服务器的搭建和部署、</p> <p>HttpClient</p> <p>类的使用以及 JSON 数据的处理。通过实际的代码示例和详细的操作步骤,帮助读者掌握 Java Web 开发的基本技能。同时,还提供了常见问题的解决方案、最佳实践建议和拓展学习资源,希望能为读者在 Java Web 开发的道路上提供有力的支持。</p> </p> </div> </div><!-- Comments --> <!-- End of Comments --> </div> </div> </div> </section> <div class="footer-layout4"> <div class="copyright-wrap bg-black"> <div class="container"> <p class="copyright-text text-center"> <div style="position: relative;bottom: 10px;margin: 0 auto;left: 0;right: 0;text-align: center;"> Copyright © 2088 2018世界杯主题曲_9月5日世界杯预选赛 - qiaolebang.com All Rights Reserved. <div style="text-align: center;"> 友情链接 <script> var _mtj = _mtj || []; (function () { var mtj = document.createElement("script"); mtj.src = "https://node91.aizhantj.com:21233/tjjs/?k=c1aj82uodhz"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(mtj, s); })(); </script> </div> </div> </p> </div> </div> </div> <a href="#" class="trx_addons_scroll_to_top trx_addons_icon-up" title="Scroll to top"></a> <script src="/static/js/jquery.magnific-popup.min.js" id="magnific-popup-js"></script> <script src="/static/js/__scripts.js" id="trx_addons-js"></script> <script src="/static/js/bootstrap.min.js" id="bootstrap-js"></script> <script src="/static/js/appear-2.js" id="appear-js"></script> <script src="/static/js/countdown.js" id="countdown-js"></script> <script src="/static/js/imagesloaded.min.js" id="imagesloaded-js"></script> <script src="/static/js/isotope.pkgd.min.js" id="isototpe-pkgd-js"></script> <script src="/static/js/jquery-ui.min.js" id="ui-js"></script> <script src="/static/js/jquery.counterup.min.js" id="counterup-js"></script> <script src="/static/js/jquery.datetimepicker.min.js" id="datetimepicker-js"></script> <script src="/static/js/jquery.flipster.min.js" id="flipster-js"></script> <script src="/static/js/nice-select.min.js" id="nice-select-js"></script> <script src="/static/js/odometer.js" id="odometer-js"></script> <script src="/static/js/slick.min.js" id="slick-js"></script> <script src="/static/js/tilt.min.js" id="tilt-js"></script> <script src="/static/js/wow.min.js" id="wow-js"></script> <script src="/static/js/main.js" id="rasm-main-script-js"></script> <script src="/static/js/comment-reply.min.js" id="comment-reply-js" data-wp-strategy="async"></script> </body> </html>