2011-06-27 4 views
9

Wiem, że można uzyskać nazwę klienta modułu GWT za pomocą GWT.getModuleName() lub getHostPageBaseURL(), ale czy można uzyskać do niego dostęp z serwera?Jak uzyskać bazowy adres URL lub nazwę modułu GWT z zakresu serwera GWT?

To, czego szukam, to podstawowy adres URL wdrożonej aplikacji. Na przykład, jeśli aplikacja GWT jest wdrożona jako http://foo.com/deploy1/MyModule/, chcę wiedzieć, że żądanie pochodziło z podstawowego adresu URL: http://foo.com/deploy1/

Po prostu pobranie identyfikatora URI z żądania HTTP zapewni pełną ścieżkę do modułu, gdy naprawdę chcą bazę (zostanie on wdrożony w ramach różnych ścieżek podrzędnych w tej samej domenie)

+0

Aby wyjaśnić, mogę uzyskać identyfikator URI z 'HttpServletRequest', ale to daje mi' http: // foo.com/deploy1/MyModule/'. Próbuję uniknąć sztywnego kodowania nazwy modułu 'MyModule' lub duplikowania go w pliku właściwości. Jest to zdefiniowane w pliku xml modułu GWT, ale wolałbym nie być obciążonym utrzymywaniem synchronizacji z innym kodem źródłowym pliku lub z innymi. – dpdearing

Odpowiedz

9

getContextPath() daje ścieżkę /deploy1.

Jeśli potrzebujesz pełny adres URL, można łatwo odtworzyć go od innych HttpServletRequest właściwości, czy można zacząć getRequestURL i dostosować wynik zastąpić ścieżkę część.

+0

Nie jestem pewien, jak przeoczyłem tę metodę, ale wydaje się, że to wystarczy. Czasami najprostsza odpowiedź jest najlepsza! – dpdearing

1

można sprawdzić nagłówek Referer http: http://en.wikipedia.org/wiki/HTTP_referrer

+0

Próbowałem wyjaśnić pytanie. Mogę uzyskać identyfikator URI, ale problem polega na uzyskaniu identyfikatora URI _without_ nazwa modułu GWT (lub uzyskanie nazwy modułu w czasie wykonywania do przycinania). czy "Referer" nie dałby mi pełnej ścieżki podrzędnej? – dpdearing

3

trzeba zrozumieć związek między serwerem a klientem w GWT.

Patrzysz więc na zwykły kod Greetings GWT RPC i widzisz klienta, serwer, foldery współdzielone (możesz dodać folder publiczny, aby umieścić html, jsp lub inne pliki bezpośrednio dostępne przez ścieżkę modułu).

Prawdopodobnie nie zdajemy sobie sprawy, że odpowiedź serwera na żądanie klienta RPC nie musi być spełniona przez klasę w module. Wewnątrz modułu będziesz miał interfejs definiowania żądań RPC, w którym zdefiniujesz ścieżkę odpowiadającą po stronie serwera @RemoteServiceRelativePath ("/ hello").

Aby spełnić żądanie RPC po ścieżce "/ hello", nie trzeba kodować serwletu w folderze "serwera" jakiegokolwiek modułu. Można nawet mieć

@RemoteServiceRelativePath("/hello.jsp") 

lub

@RemoteServiceRelativePath("/hello.php") 

w rzeczywistości, mam JSP logowania, który akceptuje żądania RPC z kilku modułów i musi dowiedzieć się, który moduł jest emitując żądania.

Lub możesz używać RequestBuilder lub składania żądania JSON javascript-include.

Mając to na uwadze, w jaki sposób ogranicznik RPC po stronie serwera byłby ograniczony do definiowania przez dowolny moduł, niezależnie od tego, czy jest umieszczony w folderze określonego modułu? Wystarczy, że klient poinformuje podmiot odpowiadający po stronie serwera, do którego modułu należy klient. Używanie Map lub HashMap jako typu danych do transmisji RpC byłoby bardzo pomocne. Jeśli używasz REquestFactory, identyfikacja jednostki będzie w stanie poinformować twój serwer o tym, co moduł przechodzi przez przestrzeń nazw obiektu.

http://h2g2java.blessedgeek.com/2009/08/gwt-rpc.html

+0

+1 za doskonałe wyjaśnienie, ale tak naprawdę nie dostarczyłeś odpowiedzi na problem pobierania podstawowego adresu URL, jak robi to @ThomasBroyer. – dpdearing

1

2 lata późno, ale ktoś inny może mieć to samo pytanie.

W każdym razie możesz uzyskać dokładnie takie dane, jakie chcesz, używając GWT.getModuleBaseURL().

+0

Zgodnie z dokumentami, powinno to być również możliwe po stronie serwera przy użyciu '' RemoteServiceServlet.getRequestModuleBasePath() ''. – phineas