2010-07-28 6 views
9

je dois avoir ce lien:dans l'URL jsf2

http://myserver:/myproject/innerpage/clip.jsf&id=9099

pour extraire l'identifiant d'un code comme ceci:

HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
String clipId = request.getParameter("id"); 

Quand je lance sur tomcat je reçois:

un message /OnAir/innerpage/clip.jsf & id = 9099

description La ressource demandée (/OnAir/innerpage/clip.jsf & id = 9099) n'est pas disponible.

Lorsque je l'exécute sans & id = 9099, il fonctionne bien.

Comment puis-je le faire fonctionner?

Répondre

24

Le caractère de séparation entre le chemin et la chaîne de requête dans l'URL est ?, et non &. Le & est un caractère séparateur pour plusieurs paramètres dans la chaîne de requête, par ex. name1=value1&name2=value2&name3=value3. Si vous omettez le ?, la chaîne de requête sera considérée comme faisant partie du chemin d'accès dans l'URL, ce qui entraînera une erreur de page/ressource HTTP 404 non trouvée comme vous l'avez rencontré.

Ainsi, ce lien devrait fonctionner http://myserver:port/myproject/innerpage/clip.jsf?id=9099


Cela dit, il y a une meilleure façon d'accéder au paramètre de requête. Définissez-le en tant que propriété gérée avec la valeur #{param.id}.

public class Bean { 

    @ManagedProperty(value="#{param.id}") 
    private Long id; 

    @PostConstruct 
    public void init() { 
     System.out.println(id); // 9099 as in your example. 
    } 

    // ... 
} 

Les retours EL #{param.id} vous la valeur de request.getParameter("id"). Un conseil: chaque fois que vous devez transporter l'API Servlet "brute" sous les hottes JSF à l'intérieur d'un bean géré, demandez-vous toujours (ou ici à SO): "N'y a-t-il pas une méthode JSF-ish?" . Il y a de fortes chances que vous soyez trop compliqué;)

+0

merci. J'étais idiot – Dejell

+8

De rien. Non, il faut juste commencer quelque part. J'ai fait la même erreur il y a plus de 10 ans. Apprends de tes erreurs. Rappelez-vous les pour chaque fois que vous rencontrez les mêmes symptômes de problème à nouveau. Les leçons apprises sont précieuses pour l'avenir. – BalusC

+0

En fait, ça ne marcherait pas pour moi. La portée de mon bean est vue et je reçois la méchante exception: La portée de l'objet référencé par l'expression # {param.id}, requête, est plus courte que celle des beans gérés référents (clipBean) portée de vue – Dejell

3

Vous devez d'abord nous montrer comment vous envoyez le paramètre dans votre JSF, est-ce un commandButton/Link? Un lien de sortie? UNE ? Aussi utilisez-vous redirect = true?

Vous risquez de perdre l'identifiant quelque part pendant la requête.