【问题标题】:Base URL for a GWT AppGWT 应用程序的基本 URL
【发布时间】:2011-12-05 21:45:52
【问题描述】:

我正在开发一个生成报告以供下载的 GWT 应用程序。当我在 Eclipse 中启动时,它有一个这样的 URL:

http://127.0.0.1:8888/MyApp.html

但是当我打包我的应用程序以部署在 Web 服务器(即 Tomcat)中时,我的 URL 是这样的:

http://localhost:8080/MyApp/MyApp.html

有没有办法获取应用的基本 URL?像第二种情况下的http://localhost:8080/MyApp/

【问题讨论】:

  • “获取应用程序的基本 URL”是什么意思?在您的 servlet 中还是在客户端?

标签: url gwt


【解决方案1】:

客户端:

GWT.getHostPageBaseURL();

GWT.getModuleBaseURL();

服务器端你可以使用这个简单的方法从HttpServletRequest获取任何servlet的URL:

public static String getBaseUrl( HttpServletRequest request ) {
    if ( ( request.getServerPort() == 80 ) ||
         ( request.getServerPort() == 443 ) ) {
      return request.getScheme() + "://" +
             request.getServerName() +
             request.getContextPath();
    } else {
      return request.getScheme() + "://" +
             request.getServerName() + ":" + request.getServerPort() +
             request.getContextPath();
    }
}

【讨论】:

  • 您好,感谢您的回答,我在 GWT.getModuleBaseUrl() 或 GWT.getHostPageBaseUrl() 上收到了 tomcat UnsatisfiedLinkError。我究竟做错了什么? java.lang.UnsatisfiedLinkError: com.google.gwt.core.client.impl.Impl.getModuleBaseURL()Ljava/lang/String;
【解决方案2】:

对于客户端,您可以使用Window.Location

例如:

public static String getUrlString(String path) {
    UrlBuilder urlBuilder = new UrlBuilder();
    urlBuilder.setHost(Window.Location.getHost());
    urlBuilder.setPath(path);

    String port = Window.Location.getPort();
    if (!port.isEmpty())
        urlBuilder.setPort(Integer.parseInt(port));

    return urlBuilder.buildString();
}

另一种方法是使用GWT Dictonary。在这里,您在主机 HTML 页面中包含 JavaScript 的 sn-p 以设置值:

<script type="text/javascript" language="javascript">
  var location = { baseUrl: "http://localhost:8080/myapp" };
</script>

然后使用 GWT Dictionary 将值加载到客户端:

   Dictionary theme = Dictionary.getDictionary("location");
   String baseUrl = theme.get("baseUrl");

要使用它,您必须更改本地和生产实例的 HTML 主机页面。

【讨论】:

  • 这是一个有趣的方法。但它只适用于客户端,对吧?
  • 是的,使用 Window.Location 仅适用于客户端。我更新了我的答案以包含另一种方法。
  • 没有完整的服务器端? GWT 在这方面真的很烂。
  • 对不起,我对 GWT 的所有经验都是客户端。为什么需要知道服务器端的 URL?
【解决方案3】:

RemoteServiceServlet 上的doPost 方法传递了客户端发送的HttpServletRequestHttpServletRequest 有许多可用的方法可以构造客户端请求的基本 URL。 HttpServletRequest.getRequestURL() 从请求中检索整个 URL。如果您只想要没有页面名称的基本 URL,则可以改用 getRemoteHostgetRemotePortgetServletPath 的组合。

例子:

doPost(request, response){
    String baseURL = new StringBuilder();
    baseURL.append(request.getRemoteHost());
    baseURL.append(":");
    baseURL.append(request.getRemotePort());
    baseURL.append(request.getServletPath());
}

【讨论】:

    【解决方案4】:

    我怀疑这是 Tomcat,而不是 GWT 问题。尝试将打包应用程序的 WAR 文件重命名为 ROOT.war 并将其放在 Tomcat 的 webapps 文件夹中。 Tomcat 通常将此类应用程序视为要在根上下文中部署的应用程序(即,您将获得 /MyApp.html 访问权限)。

    【讨论】:

      猜你喜欢
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多