2011-12-05 22 views
15

Tôi đang phát triển một Ứng dụng GWT tạo báo cáo để tải xuống. Khi tôi khởi động trong Eclipse nó có một URL như sau:URL cơ sở cho Ứng dụng GWT

http://127.0.0.1:8888/MyApp.html

Nhưng khi tôi gói ứng dụng của tôi cho việc triển khai trong một máy chủ web (ví dụ Tomcat) URL của tôi là như thế này:

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

Có cách nào để nhận URL cơ sở của ứng dụng không? Giống như http://localhost:8080/MyApp/ trong trường hợp thứ hai?

+0

Những gì bạn làm có nghĩa là "nhận URL cơ sở của ứng dụng"? Trong servlet của bạn hoặc ở phía khách hàng? – Vladimir

Trả lời

2

Phương thức doPost trên RemoteServiceServlet được chuyển qua HttpServletRequest do khách hàng gửi. HttpServletRequest có một số phương pháp có sẵn có thể xây dựng URL cơ sở của yêu cầu của khách hàng. HttpServletRequest.getRequestURL() truy lục toàn bộ URL từ yêu cầu. Nếu bạn chỉ muốn URL cơ sở không có tên trang, thay vào đó bạn có thể sử dụng kết hợp của getRemoteHost, getRemotePortgetServletPath.

Ví dụ:

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

Đối với phía khách hàng mà bạn có thể sử dụng Window.Location

Ví dụ:

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

phương pháp khác là sử dụng GWT Dictonary. Ở đây bạn đưa một đoạn mã JavaScript trong trang chủ HTML của bạn để thiết lập giá trị:

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

Sau đó tải các giá trị vào các mặt hàng khác với GWT điển:

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

Để sử dụng này, bạn sẽ phải thay đổi trang máy chủ HTML cho các phiên bản địa phương và sản xuất của bạn.

+0

Đó là một cách tiếp cận thú vị. Nhưng nó chỉ hoạt động trên máy khách, đúng không? –

+0

Có, bằng cách sử dụng Window.Location chỉ hoạt động ở phía máy khách. Tôi đã cập nhật câu trả lời của mình để đưa vào một cách tiếp cận khác. –

+0

Không có bên máy chủ đầy đủ? GWT thực sự hút điều này. –

0

Tôi nghi ngờ điều này một Tomcat, không phải là một vấn đề GWT. Hãy thử đổi tên tệp WAR của ứng dụng đóng gói của bạn thành ROOT.war và đặt nó vào thư mục webapp của Tomcat của bạn. Tomcat thường coi một ứng dụng như một ứng dụng để triển khai trong ngữ cảnh gốc (tức là bạn sẽ nhận được quyền truy cập /MyApp.html của mình).

17

phía Chủ đầu tư:

GWT.getHostPageBaseURL(); 

hoặc

GWT.getModuleBaseURL(); 

Server side bạn có thể lấy URL của bất kỳ servlet từ HttpServletRequest bằng cách sử dụng phương pháp này rất đơn giản:

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

Xin chào, cảm ơn cho câu trả lời, Tôi nhận được uncatat UnsatisfiedLinkError tomcat trên một trong hai GWT.getModuleBaseUrl() hoặc GWT.getHostPageBaseUrl(). Tôi đang làm gì sai? java.lang.UnsatisfiedLinkError: com.google.gwt.core.client.impl.Impl.getModuleBaseURL() Ljava/lang/String; – Ehsan

Các vấn đề liên quan