2010-07-21 9 views
18

Jak uzyskać adres URL żądania w komponencie bean wspierającym stronę JSF? Szukałem przez docs FacesContext a najlepszym sposobem udało mi się znaleźć wydaje się strasznie długo:Uzyskaj adres URL żądania w komponencie bean JSF?

public String getRequestURL() 
{ 
    Object request = FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
    if(request instanceof HttpServletRequest) 
    { 
      return ((HttpServletRequest) request).getRequestURL().toString(); 
    }else 
    { 
     return ""; 
    } 
} 

Edit: Wymagania funkcjonalne Warunkiem jest to, że musimy pełny adres URL do strony trzeciej javascript użyteczność. Użycie lub architektura narzędzia nie pasuje do JSF, ale wszystko, co jest krótsze od tego wywołania. Metoda, którą znalazłem, zadziała, ale źle się stało, że tak głęboko zagłębia się w FaceContext. Dodatkowo miałem nadzieję, że istnieje sposób, który można nazwać za pomocą JSF Expression Language, ponieważ będzie on używany w sposób "podglądowy".

Odpowiedz

28

Jeśli będziesz potrzebować ciągnięcia surowego API Servlet z pod okapów JSF przez FacesContext, to prawdopodobnie wykonujesz pracę w niewłaściwym miejscu. Co to jest, wymagania funkcjonalne, dla których uważasz, że jest to właściwe rozwiązanie? Czy może nie być używana prawdziwa klasa Servlet lub Filter zamiast zarządzanego komponentu bean JSF? A może w ogóle nie potrzebujesz adresu URL żądania, ponieważ istnieją lepsze sposoby "jsfish", aby osiągnąć to samo?

Jeśli zaktualizujesz pytanie w celu uwzględnienia szczegółów dotyczących wymagań funkcjonalnych, możemy zaproponować odpowiednie rozwiązanie.


Aktualizacja jak na swoje EDIT: tak, po prostu trzeba go przecież na pierwszej stronie? Na przykład. #{bean.requestURL}? Możesz także po prostu pobrać go z obiektu HttpServletRequest, który jest już niejawnie dostępny w EL.

Kiedy jesteś na JSP:

${pageContext.request.requestURL} 

Lub gdy jesteś na Facelets:

#{request.requestURL} 

A teraz, jak jest to potrzebne dla JavaScript? Drukowanie jako zmienna JavaScript? Podoba ci się?

var url = '#{request.requestURL}'; 

Jeśli tak, można też po prostu chwycić window.location do tego.

var url = window.location; 

Nie trzeba zaśmiecać komponentu bean JSF, aby wyświetlić określone szczegóły.

+0

Dzięki za oczyszczenie wszystkich różnych metod ich wyciągania! – Adam

+0

Nie ma za co. Który w końcu pomógł? :) – BalusC

+0

W końcu udało mi się to obejść, ale użyłbym window.location – Adam

3

Już odpowiedziałeś :) Obawiam się, że będziesz musiał użyć go w ten sposób, ponieważ każde żądanie HTTP będzie musiało zostać pobrane z kontekstu twarzy. Można oczywiście uprościć część tej metody, np. Odzyskiwanie kontekstu twarzy, ale ostatecznie jest to droga do zrobienia, chyba że użyje się jakiegoś frameworka, który usuwa te szczegóły i pozwala bezpośrednio przejść do obiektu HttpRequest.

Pozdrawiam.

Powiązane problemy