http://zetcode.com/articles/javaservletreadwebpage/

Java Servlet 读取网页教程向您展示了如何使用 Servlet 在 Java Web 应用中读取网页。

Java Servlet

Servlet 是响应网络请求的 Java 类。 Java servlet 用于构建 Web 应用。 它们在 servlet 容器(例如 Tomcat 或 Jetty)中运行。 现代 Java Web 开发使用的框架是在 Servlet 之上构建的,包括 Spring 和 Vaadin。

Apache Commons Validator 是用于验证数据的 Java 库。 我们使用此库来验证正确的 URL 值。

Java Servlet 读取网页示例

在下面的示例中,我们读取带有InputStream的网页,并向客户端显示该页面的 HTML 代码。 网页的名称是从 HTML 表单的input标签发送的。

  1. $ tree
  2. .
  3. ├── nb-configuration.xml
  4. ├── pom.xml
  5. └── src
  6. ├── main
  7. ├── java
  8. └── com
  9. └── zetcode
  10. ├── service
  11. └── WebPageReader.java
  12. └── web
  13. └── ReadWebpage.java
  14. └── webapp
  15. ├── index.html
  16. ├── META-INF
  17. └── context.xml
  18. └── WEB-INF
  19. └── test
  20. └── java

这是项目结构。

  1. <dependencies>
  2. <dependency>
  3. <groupId>javax.servlet</groupId>
  4. <artifactId>javax.servlet-api</artifactId>
  5. <version>3.1.0</version>
  6. <scope>provided</scope>
  7. </dependency>
  8. <dependency>
  9. <groupId>commons-validator</groupId>
  10. <artifactId>commons-validator</artifactId>
  11. <version>1.6</version>
  12. </dependency>
  13. </dependencies>

我们需要这两个 Maven 依赖项。 javax.servlet-api工件用于 servlet。 commons-validator依赖项用于数据验证。

context.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Context path="/JavaServletReadWebpage"/>

在 Tomcat context.xml文件中,我们定义了上下文路径。 它是 Web 应用的名称。

ReadWebPage.java

  1. package com.zetcode.web;
  2. import com.zetcode.service.WebPageReader;
  3. import java.io.IOException;
  4. import java.nio.charset.StandardCharsets;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.ServletOutputStream;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. @WebServlet(name = "ReadWebPage", urlPatterns = {"/ReadWebPage"})
  12. public class ReadWebpage extends HttpServlet {
  13. @Override
  14. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  15. throws ServletException, IOException {
  16. response.setContentType("text/plain;charset=UTF-8");
  17. String page = request.getParameter("webpage");
  18. String content = new WebPageReader().setWebPageName(page).getWebPageContent();
  19. ServletOutputStream os = response.getOutputStream();
  20. os.write(content.getBytes(StandardCharsets.UTF_8));
  21. }
  22. }

ReadWebPage Servlet 读取给定网页的内容,并将文本发送给客户端。

  1. response.setContentType("text/plain;charset=UTF-8");

响应为纯文本,文本编码为 UTF-8。

  1. String page = request.getParameter("webpage");

我们使用getParameter()从请求参数获取网页的名称。

  1. String content = new WebPageReader().setWebPageName(page).getWebPageContent();

WebPageReader用于获取网页的内容。

  1. ServletOutputStream os = response.getOutputStream();
  2. os.write(content.getBytes(StandardCharsets.UTF_8));

我们通过ServletOutputStream将数据发送给客户端。

WebPageReader.java

  1. package com.zetcode.service;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.net.URL;
  7. import java.nio.charset.StandardCharsets;
  8. import java.util.logging.Level;
  9. import java.util.logging.Logger;
  10. import java.util.stream.Collectors;
  11. import org.apache.commons.validator.routines.UrlValidator;
  12. public class WebPageReader {
  13. private String webpage;
  14. private String content;
  15. public WebPageReader setWebPageName(String name) {
  16. webpage = name;
  17. return this;
  18. }
  19. public String getWebPageContent() {
  20. try {
  21. boolean valid = validateUrl(webpage);
  22. if (!valid) {
  23. content = "Invalid URL; use http(s)://www.example.com format";
  24. return content;
  25. }
  26. URL url = new URL(webpage);
  27. try (InputStream is = url.openStream();
  28. BufferedReader br = new BufferedReader(
  29. new InputStreamReader(is, StandardCharsets.UTF_8))) {
  30. content = br.lines().collect(
  31. Collectors.joining(System.lineSeparator()));
  32. }
  33. } catch (IOException ex) {
  34. content = String.format("Cannot read webpage %s", ex);
  35. Logger.getLogger(WebPageReader.class.getName()).log(Level.SEVERE, null, ex);
  36. }
  37. return content;
  38. }
  39. private boolean validateUrl(String webpage) {
  40. UrlValidator urlValidator = new UrlValidator();
  41. return urlValidator.isValid(webpage);
  42. }
  43. }

WebPageReader读取网页的内容。

  1. private boolean validateUrl(String webpage) {
  2. UrlValidator urlValidator = new UrlValidator();
  3. return urlValidator.isValid(webpage);
  4. }

在阅读网页之前,我们使用 Apache Commons Validator 库中的UrlValidator验证 URL。

  1. URL url = new URL(webpage);
  2. try (InputStream is = url.openStream();
  3. BufferedReader br = new BufferedReader(
  4. new InputStreamReader(is, StandardCharsets.UTF_8))) {
  5. content = br.lines().collect(
  6. Collectors.joining(System.lineSeparator()));
  7. }

通过InputStream读取网页。 数据被加载到String中。 或者,我们可以使用 JSoup 库。

index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Home page</title>
  5. <meta charset="UTF-8">
  6. </head>
  7. <body>
  8. <form action="ReadWebPage">
  9. <label for="page">Enter a web page name:</label>
  10. <input type="text" id="page" name="webpage">
  11. <button type="submit">Submit</button>
  12. </form>
  13. </body>
  14. </html>

主页包含表单,该表单将要阅读的网页发送到应用。 请注意,必须以完整的http(s)://www.example.com格式输入网页。

Java Servlet 读取网页 - 图1

图:Java 阅读网页

在屏幕截图中,我们可以看到一个简单网页的内容。

在本教程中,我们创建了一个 Java Servlet 应用,该应用读取所选网页的内容,并将 HTML 以纯文本格式发送回客户端。

您可能也对以下相关教程感兴趣: Java 阅读网页Java Servlet 上传文件Java Log4j 教程Java Servlet RESTful 客户端Java RequestDispatcher从 Java servlet 提供纯文本Java servlet 图像教程Java 教程