更改 Servlet 发布位置?
Change Servlet publish location?
所以我遇到了这个问题,我的 html 文件采用某种结构,例如:
- 网络内容
- 管理员
- Page1.html
- Page2.html
- 额外内容
- Page3.html
- WEB-INF
- 元信息
我在 servlet 文件中使用将请求重定向到适当的 servlet 文件的表单标签 (java) 我使用 JSOUP 加载内容,修改它并将其作为新的发回网页。我的问题是由于 servlet 将文件发布在根文件夹中,资源没有被加载(例如图像、js 和 css)。他们有什么办法可以更改特定 html 的默认发布站点吗?
例如,如果我加载 Page3.html,我希望它能够将其发布到 Extras 文件夹下,而不是 WebContent 文件夹下。
谢谢
My problem is resource are not getting loaded (such as images, js and css)
TL;DR
或者:
- 编辑 HTML 文件以使资源 url 相对于 WebContent 文件夹
- 请 Jsoup 将资源 url 更改为绝对资源。
让我们深入探讨第二个选项。
在修改过程中,代码需要正确设置资源url。 Jsoup 可以在这里帮助你。为此,有两个步骤:
- 设置文档
baseuri
- 请 Jsoup 将任何 url 转换为绝对值
1) 设置文档baseuri
您设置 baseuri
的方式将取决于您如何使用 Jsoup 加载内容。
Jsoup.connect
这是最简单的方法。 Jsoup 将为您设置 baseuri。
Document doc = Jsoup.connect(url).get(); // Document is parsed with baseuri set.
如果 url 主机是托管您的 servlet 的服务器,则此处可能存在代码味道。
如果 url 是另一台服务器,您需要像下面这样解析文档:
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 转换为绝对值
设置 baseuri 后,就可以使 urls 绝对化了。见以下Java8码:
@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));
}
所以我遇到了这个问题,我的 html 文件采用某种结构,例如:
- 网络内容
- 管理员
- Page1.html
- Page2.html
- 额外内容
- Page3.html
- WEB-INF
- 元信息
- 管理员
我在 servlet 文件中使用将请求重定向到适当的 servlet 文件的表单标签 (java) 我使用 JSOUP 加载内容,修改它并将其作为新的发回网页。我的问题是由于 servlet 将文件发布在根文件夹中,资源没有被加载(例如图像、js 和 css)。他们有什么办法可以更改特定 html 的默认发布站点吗?
例如,如果我加载 Page3.html,我希望它能够将其发布到 Extras 文件夹下,而不是 WebContent 文件夹下。
谢谢
My problem is resource are not getting loaded (such as images, js and css)
TL;DR
或者:
- 编辑 HTML 文件以使资源 url 相对于 WebContent 文件夹
- 请 Jsoup 将资源 url 更改为绝对资源。
让我们深入探讨第二个选项。
在修改过程中,代码需要正确设置资源url。 Jsoup 可以在这里帮助你。为此,有两个步骤:
- 设置文档
baseuri
- 请 Jsoup 将任何 url 转换为绝对值
1) 设置文档baseuri
您设置 baseuri
的方式将取决于您如何使用 Jsoup 加载内容。
Jsoup.connect
这是最简单的方法。 Jsoup 将为您设置 baseuri。
Document doc = Jsoup.connect(url).get(); // Document is parsed with baseuri set.
如果 url 主机是托管您的 servlet 的服务器,则此处可能存在代码味道。
如果 url 是另一台服务器,您需要像下面这样解析文档:
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 转换为绝对值
设置 baseuri 后,就可以使 urls 绝对化了。见以下Java8码:
@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));
}