更改Servlet发布位置?

时间:2016-03-14 21:28:45

标签: java html servlets jsoup web.xml

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

  • 的WebContent
    • 管理
      • Page1.html
      • Page2.html
    • 附加功能
      • Page3.html
    • WEB-INF
    • META-INF

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

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

由于

1 个答案:

答案 0 :(得分:1)

  

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

TL; DR

或者:

  • 编辑HTML文件以使资源网址相对于WebContent文件夹
  • 让Jsoup将资源网址更改为绝对网址。

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

在修改过程中,代码需要正确设置资源URL。 Jsoup可以帮到你。为此,有两个步骤:

  1. 设置文档baseuri
  2. 让Jsoup将任何网址变为绝对网址
  3. 1)设置文档baseuri

    您设置baseuri的方式取决于您使用Jsoup加载内容的方式。

    Jsoup.connect

    这是最简单的方法。 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/" //
    );
    

    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将任何网址变为绝对网址

    一旦设定了底座,就应该把网址设为绝对。请参阅以下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));
    }