2

我们正在为客户托管一个站点,他们希望我们将他们在服务器上的标头包含到我们托管的页面中。因此,无论何时他们更改它,它都会在我们的网站上自动更改。

我们试图在我们的 JSP 代码中使用“include”标签。我们使用的代码如下:

<%@ include file="www.CLIENT.com/CLIENT2/MiddlePageFiles/Vendor_header.html" %>

我们也试过

<%@ include file="**http://**www.CLIENT.com/CLIENT2/MiddlePageFiles/Vendor_header.html" %>

不幸的是,这些对我们不起作用。似乎正在发生的事情是代码仅在本地查找此文件,并且似乎永远不会去“外部”查找它。

当我们使用 iframe 时,我们可以将标题拉入我们的页面,但由于标题的构造/编码方式,当我们使用 iframe 时,鼠标悬停在下拉菜单上并不能正常工作。下拉菜单在页面上的其余内容下方“层叠”,我们无法将它们带到“顶部”。

作为临时解决方法,我们将 HTML 托管在我们自己的服务器上。

有任何想法吗?

4

4 回答 4

3

如果您选择在 Java 中执行此操作,那么使用 Apache Commons 的 HttpClient 会非常方便。

public static String fetchSourceHtml( String urlString ) {

  try {
    HttpClient httpClient = new HttpClient();
    GetMethod getMethod = new GetMethod( urlString );
    getMethod.setFollowRedirects( true );

    int httpStatus = httpClient.executeMethod( getMethod );

    if (httpStatus >= 400) {
      return "";
    }

    String sourceHtml = getMethod.getResponseBodyAsString();
    return sourceHtml;
  }
  catch (IOException e) {
    return "";
  }
}

对于快速而肮脏的解决方案,您的 JSP 可以直接调用此方法。当然,如果您愿意,可以创建一个 taglib 标记来调用该方法。

您可能想要更改 HttpClient 的超时和重试机制。默认情况下,它会自动尝试最多 3 次,每次尝试在 30 秒后超时。

但是,您可能希望研究将字符串缓存一段合适的时间。您真的不想为访问您网站的每个页面创建 2 个阻止外部 http 请求。

于 2008-10-09T13:24:24.613 回答
1

JSP 包含不支持包含远程文件,这就是需要相对 URL 的原因:http: //java.sun.com/products/jsp/syntax/1.2/syntaxref1214.html

我建议编写一个函数来打开与该页面的连接并下载内容,然后将它们打印到您自己的out流中。然后,您可以将该函数放在本地文件中,仅include此而已。

于 2008-10-09T13:17:15.907 回答
1

如何使用 JSTL 核心库并执行以下操作:

<c:import url="http://www.CLIENT.com/CLIENT2/MiddlePageFiles/Vendor_header.html" />

那应该能够在请求时包含远程内容。

于 2008-10-09T13:52:08.193 回答
-1

JSP 包含并不意味着像外部服务器那样工作。这是解决您的问题的一种完全可怕的方法,但它是我在类似情况下的唯一选择。编写一个类来实际解析来自该站点的 html,然后将其打印出来。我要补充一点,无论何时你要做这样的事情,拥有某种身份验证机制总是一个好主意。

于 2008-10-09T13:24:52.023 回答