Java Servlet 读取网页
最后修改于 2020 年 7 月 13 日
Java Servlet 读取网页教程展示了如何在 Java Web 应用程序中使用 Servlet 读取网页。
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
标签发送。
$ tree . ├── nb-configuration.xml ├── pom.xml └── src ├── main │ ├── java │ │ └── com │ │ └── zetcode │ │ ├── service │ │ │ └── WebPageReader.java │ │ └── web │ │ └── ReadWebpage.java │ └── webapp │ ├── index.html │ ├── META-INF │ │ └── context.xml │ └── WEB-INF └── test └── java
这是项目结构。
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>commons-validator</groupId> <artifactId>commons-validator</artifactId> <version>1.6</version> </dependency> </dependencies>
我们需要这两个 Maven 依赖。javax.servlet-api
工件用于 Servlet。commons-validator
依赖用于数据验证。
<?xml version="1.0" encoding="UTF-8"?> <Context path="/JavaServletReadWebpage"/>
在 Tomcat 的 context.xml
文件中,我们定义了上下文路径。它是 Web 应用程序的名称。
package com.zetcode.web; import com.zetcode.service.WebPageReader; import java.io.IOException; import java.nio.charset.StandardCharsets; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(name = "ReadWebPage", urlPatterns = {"/ReadWebPage"}) public class ReadWebpage extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain;charset=UTF-8"); String page = request.getParameter("webpage"); String content = new WebPageReader().setWebPageName(page).getWebPageContent(); ServletOutputStream os = response.getOutputStream(); os.write(content.getBytes(StandardCharsets.UTF_8)); } }
ReadWebPage
Servlet 读取给定网页的内容并将文本发送给客户端。
response.setContentType("text/plain;charset=UTF-8");
响应是纯文本,文本编码是 UTF-8。
String page = request.getParameter("webpage");
我们使用 getParameter
从请求参数中获取网页的名称。
String content = new WebPageReader().setWebPageName(page).getWebPageContent();
WebPageReader
用于获取网页内容。
ServletOutputStream os = response.getOutputStream(); os.write(content.getBytes(StandardCharsets.UTF_8));
我们通过 ServletOutputStream
将数据发送给客户端。
package com.zetcode.service; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; import org.apache.commons.validator.routines.UrlValidator; public class WebPageReader { private String webpage; private String content; public WebPageReader setWebPageName(String name) { webpage = name; return this; } public String getWebPageContent() { try { boolean valid = validateUrl(webpage); if (!valid) { content = "Invalid URL; use http(s)://www.example.com format"; return content; } URL url = new URL(webpage); try (InputStream is = url.openStream(); BufferedReader br = new BufferedReader( new InputStreamReader(is, StandardCharsets.UTF_8))) { content = br.lines().collect( Collectors.joining(System.lineSeparator())); } } catch (IOException ex) { content = String.format("Cannot read webpage %s", ex); Logger.getLogger(WebPageReader.class.getName()).log(Level.SEVERE, null, ex); } return content; } private boolean validateUrl(String webpage) { UrlValidator urlValidator = new UrlValidator(); return urlValidator.isValid(webpage); } }
WebPageReader
读取网页的内容。
private boolean validateUrl(String webpage) { UrlValidator urlValidator = new UrlValidator(); return urlValidator.isValid(webpage); }
在读取网页之前,我们使用 Apache Commons Validator 库中的 UrlValidator
验证 URL。
URL url = new URL(webpage); try (InputStream is = url.openStream(); BufferedReader br = new BufferedReader( new InputStreamReader(is, StandardCharsets.UTF_8))) { content = br.lines().collect( Collectors.joining(System.lineSeparator())); }
通过 InputStream
读取网页。数据被加载到 String
中。或者,我们也可以使用 JSoup 库。
<!DOCTYPE html> <html> <head> <title>Home page</title> <meta charset="UTF-8"> </head> <body> <form action="ReadWebPage"> <label for="page">Enter a web page name:</label> <input type="text" id="page" name="webpage"> <button type="submit">Submit</button> </form> </body> </html>
主页包含一个表单,该表单将要读取的网页发送到应用程序。请注意,网页必须以完整的 http(s)://www.example.com
格式输入。

在截图中,我们可以看到一个简单网页的内容。
在本教程中,我们创建了一个 Java Servlet 应用程序,它读取所选网页的内容并将 HTML 以纯文本形式发送回客户端。