更改 Servlet 发布位置?

Change Servlet publish location?

所以我遇到了这个问题,我的 html 文件采用某种结构,例如:

我在 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 可以在这里帮助你。为此,有两个步骤:

  1. 设置文档baseuri
  2. 请 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));
}