我的问题是资源没有被加载(例如图像、js 和 css)
TL;DR
要么:
- 编辑 HTML 文件以使资源 url 相对于 WebContent 文件夹
- 要求 Jsoup 将资源 URL 更改为绝对 URL。
让我们深入研究第二个选项。
在修改过程中,代码需要正确设置资源url。 Jsoup 可以在这里为您提供帮助。为此,有两个步骤:
- 设置文档
baseuri
- 让 Jsoup 将任何 url 变成绝对的 url
1) 设置文档baseuri
您设置baseuri 的方式将取决于您使用 Jsoup 加载内容的方式。
Jsoup.connect
这是最简单的方法。 Jsoup 会为你设置 baseuri。
Document doc = Jsoup.connect(url).get(); // Document is parsed with baseuri set.
Jsoup.parse( //
Jsoup.connect(otherServerUrl).response().body(), //
"http://resources-site.com/" //
);
Jsoup.parse
在下面的签名中选择最适合您情况的签名并设置 baseUri:
Jsoup.parse(html, baseUri);
Jsoup.parse(in, charsetName, baseUri);
Jsoup.parse(html, baseUri, parser);
Jsoup.parse(in, charsetName, baseUri, parser);
Jsoup.parseBodyFragment(bodyHtml, baseUri);
你也可以查看姐妹方法Jsoup.parseBodyFragment(bodyHtml, baseUri)。
2) 让 Jsoup 将任何 url 变成绝对的 url
一旦设置了 baseuri,就该让 url 成为绝对的了。请参阅以下 Java 8 代码:
@SuppressWarnings("serial")
Map<String, String> attributesNames = new HashMap<String, String>() {
{
put("a", "href");
put("img", "src");
}
};
for (Element elt : doc.select(String.join(",", attributesNames.keySet())) {
String elementTagName = elt.tagName();
String attributeName = attributesNames.get(elementTagName);
if (attributeName == null) {
throw new RuntimeException("Unexpected element: " + elementTagName);
}
elt.attr(attributeName, elt.absUrl(attributeName));
}