Obtenir l'URL de la demande dans un bean JSF?


18

Comment obtenir l'URL de la requête dans un bean supportant une page JSF? Je l'ai regardé à travers les FacesContext docs et la meilleure façon que je pouvais trouver semble terriblement longue:

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

Edit: Exigences fonctionnelles L'exigence est que nous avons besoin de l'URL complète pour un tiers utilitaire javascript. L'utilisation ou l'architecture de l'utilitaire ne correspond pas bien avec JSF, mais tout ce qui est en deçà de cet appel. La méthode que j'ai trouvée fonctionnera, mais je me suis trompé en creusant si profondément dans le FacesContext. En outre j'espérais qu'il y aurait un moyen qui pourrait être appelé avec le langage d'expression JSF puisque cela va être utilisé dans une manière "vue".

28

Si vous avez besoin de transporter l'API Servlet brute sous les hottes JSF par le FacesContext, il est probable que vous fassiez le travail au mauvais endroit. De quoi s'agit-il, l'exigence fonctionnelle pour laquelle vous pensiez que c'est la bonne solution? Ne devriez-vous pas utiliser une véritable classe Servlet ou un Filter au lieu d'un bean géré par JSF? Ou peut-être n'avez-vous pas besoin de l'URL de la requête, car il existe de meilleurs moyens de "jsfish" pour atteindre le même résultat?

Si vous mettez à jour votre question pour inclure les détails sur les exigences fonctionnelles, nous pourrons peut-être vous proposer la bonne solution.


Mise à jour selon votre édition: donc, il vous suffit après tout du côté de la vue? Par exemple. #{bean.requestURL}? Vous pouvez également le récupérer à partir de l'objet HttpServletRequest qui est déjà implicitement disponible dans EL.

Lorsque vous êtes sur JSP:

${pageContext.request.requestURL} 

Ou quand vous êtes sur Facelets:

#{request.requestURL} 

Et maintenant, comment avez-vous besoin pour JavaScript? Impression en tant que variable JavaScript? Ainsi?

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

Si oui, vous pouvez aussi tout simplement prendre window.location pour cela.

var url = window.location; 

Pas besoin d'encombrer le grain JSF avec les détails spécifiques de la vue.

  0

Merci d'avoir éclairci toutes les différentes méthodes pour l'arracher! 26 juil.. 102010-07-26 17:09:34

  0

De rien. Lequel a finalement aidé? :) 26 juil.. 102010-07-26 17:15:09

  0

J'ai été capable de contourner le problème à la fin, mais j'aurais utilisé window.location 14 sept.. 102010-09-14 22:32:08


3

Vous avez déjà répondu :) Je crains que vous deviez l'utiliser de cette façon, car chaque requête HTTP devra être récupérée du contexte des visages. Vous pouvez, bien sûr, simplifier une partie de cette méthode, comme la récupération du contexte des visages, mais c'est définitivement la voie à suivre, sauf si vous utilisez une sorte de cadre qui résume ces détails et vous permet d'accéder directement à l'objet HttpRequest.

Cordialement.