【问题标题】:Change Servlet publish location?更改 Servlet 发布位置?
【发布时间】:2016-06-30 03:15:03
【问题描述】:

所以我有这个问题,我的 html 文件具有某种结构,例如:

  • 网页内容
    • 管理员
      • Page1.html
      • Page2.html
    • 附加功能
      • Page3.html
    • WEB-INF
    • 元信息

我正在使用表单标签将请求重定向到适当的 servlet 文件,在 servlet 文件 (java) 中,我使用 JSOUP 加载内容、修改内容并将其作为新网页发回。我的问题是资源没有被加载(例如图像、js 和 css),因为 servlet 将文件发布在根文件夹中。他们有什么方法可以更改该特定 html 的默认发布站点吗?

例如,如果我加载 Page3.html,我希望它能够将其发布在 Extras 文件夹而不是 WebContent 文件夹下。

谢谢

【问题讨论】:

  • 你的这种设置对我来说似乎非常不寻常(或者我根本没有得到它)​​。您能否更详细地描述为什么在这种情况下使用 JSoup。您不使用某种模板创建 HTML 页面吗?

标签: java html servlets jsoup web.xml


【解决方案1】:

我的问题是资源没有被加载(例如图像、js 和 css)

TL;DR

要么:

  • 编辑 HTML 文件以使资源 url 相对于 WebContent 文件夹
  • 要求 Jsoup 将资源 URL 更改为绝对 URL。

让我们深入研究第二个选项。

在修改过程中,代码需要正确设置资源url。 Jsoup 可以在这里为您提供帮助。为此,有两个步骤:

  1. 设置文档baseuri
  2. 让 Jsoup 将任何 url 变成绝对的 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 变成绝对的 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));
}

【讨论】:

  • 我不知道你能做到,我最终将我的 html 转换为 JSP 并使用 getAbsolutePath 方法检索 servlet 的整个位置,然后我使用目标文件夹完成了它.但是我刚试了一下,它也有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多