所以我有这个问题,我在某个结构中有我的html文件,例如:
我正在使用表单标记将请求重定向到相应的servlet文件,在servlet文件(java)中我使用JSOUP加载内容,修改它并将其作为新网页发回。我的问题是资源没有被加载(例如图像,js和css),因为servlet在根文件夹中发布文件。他们以任何方式更改特定html的默认发布网站吗?
所以例如如果我加载Page3.html我希望它能够在Extras文件夹下发布它而不是WebContent文件夹。
由于
答案 0 :(得分:1)
我的问题是资源没有被加载(例如图像,js和css)
或者:
让我们深入研究第二个选项。
在修改过程中,代码需要正确设置资源URL。 Jsoup可以帮到你。为此,有两个步骤:
baseuri
baseuri
您设置baseuri
的方式取决于您使用Jsoup加载内容的方式。
这是最简单的方法。 Jsoup将为您设置基础。
Document doc = Jsoup.connect(url).get(); // Document is parsed with baseuri set.
如果url host是托管servlet的服务器,则可能存在代码异味。
如果网址是另一台服务器,则需要解析下面的文档:
Jsoup.parse( //
Jsoup.connect(otherServerUrl).response().body(), //
"http://resources-site.com/" //
);
在下面的签名中为您的案例选择最合适的签名,并设置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)
。
一旦设定了底座,就应该把网址设为绝对。请参阅以下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));
}