Базовый URL для приложения GWT

Я разрабатываю приложение GWT, которое создает отчеты для загрузки. Когда я запускаю в Eclipse, он имеет такой URL:

http://127.0.0.1:8888/MyApp.html

Но когда я упаковываю свое приложение для развертывания на веб-сервере (т.е. Tomcat), мой URL-адрес выглядит следующим образом:

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

Есть ли способ получить базовый URL-адрес приложения? Как http://localhost:8080/MyApp/ во втором случае?

Ответы

Ответ 1

Метод doPost на RemoteServiceServlet передается HttpServletRequest, отправленным клиентом. HttpServletRequest имеет ряд доступных методов, которые могут построить базовый URL-адрес клиентского запроса. HttpServletRequest.getRequestURL() извлекает весь URL-адрес из запроса. Если вы просто хотите использовать базовый URL без имени страницы, вместо этого вы можете использовать комбинацию getRemoteHost, getRemotePort и getServletPath.

Пример:

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

Ответ 2

Клиентская сторона:

GWT.getHostPageBaseURL();

или

GWT.getModuleBaseURL();

Вы можете получить URL-адрес любого сервлета из HttpServletRequest с помощью этого простого метода:

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();
    }
}

Ответ 3

Для клиентской стороны вы можете использовать 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. Здесь вы можете добавить фрагмент JavaScript на странице HTML хоста, чтобы установить значение:

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

Затем загрузите значение на стороне клиента с помощью словаря GWT:

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

Чтобы использовать это, вам придется изменить страницу хоста HTML для локальных и производственных экземпляров.

Ответ 4

Я подозреваю, что это Tomcat, а не проблема GWT. Попробуйте переименовать файл WAR вашего упакованного приложения в ROOT.war и поместив его в папку Tomapp Webapps. Tomcat обычно рассматривает такое приложение как одно для развертывания в корневом контексте (т.е. Вы получите доступ к вашему/MyApp.html).