70 votes

Comment obtenir l'URL de base?

J'ai cette structure:

WebContent
    resources
        components
            top.xhtml

    company
        about_us.xhtml

    index.xhtml

top.xhtml est un composant, qui est utilisé dans index.xthml et about_us.xhtml trop.

top.xhtml

<ul>
    <li><a href="index.xhtml">Home</a></li>
    <li><a href="company/about_us.xhtml">About us</a></li>
    ...
</ul>

Donc mon problème est que, lorsque la page en cours est - index.xhtml le composant génère des Url correctement, mais lorsque la page en cours est - about_us.xhtml, il génère des Url erronées. Je ne peux pas utiliser un chemin relatif, car il va générer l'URL erronée. Je pense que c'est parce que le composant est basé sur le tracé actuel de la *.xhtml page.

La seule solution que j'ai pu trouvé est:

<ul>
    <li><a href="${pageContext.request.contextPath}/webname/index.xhtml">Home</a></li>
    <li><a href="${pageContext.request.contextPath}/webname/about_us.xhtml">About us</a></li>
    ...
</ul>

Mais je pense que ce n'est pas "élégant". Des idées?

152voto

BalusC Points 498232

Les url ne sont pas résolus basé sur la structure de fichiers du serveur. Les url sont résolus basé sur le public réel des adresses web des ressources en question. C'est à savoir le webbrowser qui a obtenu pour les invoquer, pas le serveur.

Il existe plusieurs façons pour adoucir la douleur:

JSF EL offre une abréviation pour ${pageContext.request} dans la saveur de l' #{request}:

<li><a href="#{request.contextPath}/index.xhtml">Home</a></li>
<li><a href="#{request.contextPath}/about_us.xhtml">About us</a></li>

Vous pouvez, si nécessaire, d'utiliser <c:set> balise pour le rendre encore plus courte. Mettre quelque part dans le modèle master, il sera disponible pour toutes les pages:

<c:set var="root" value="#{request.contextPath}/" />
...
<li><a href="#{root}index.xhtml">Home</a></li>
<li><a href="#{root}about_us.xhtml">About us</a></li>

JSF 2.x vous offre l' <h:link> , ce qui peut prendre une identification par rapport à la racine de contexte en outcome , et il va ajouter le chemin de contexte et d' FacesServlet cartographie automatiquement:

<li><h:link value="Home" outcome="index" /></li>
<li><h:link value="About us" outcome="about_us" /></li>

HTML offre l' <base> balise qui permet à tous les Url relatives dans le document relatif à cette base. Vous pourriez faire usage de. Le mettre dans l' <h:head>.

<base href="#{request.requestURL.substring(0, request.requestURL.length() - request.requestURI.length())}#{request.contextPath}/" />
...
<li><a href="index.xhtml">Home</a></li>
<li><a href="about_us.xhtml">About us</a></li>

(note: ceci nécessite EL 2.2, sinon vous feriez mieux d'utiliser JSTL fn:substring(), voir aussi cette réponse)

Cela devrait se terminer dans le code HTML généré quelque chose comme

<base href="http://example.com/webname/" />

Notez que l' <base> balise a un inconvénient: il fait tout sauter les ancres dans la page comme d' <a href="#top"> par rapport à celui-ci! Voir aussi Est-il recommandé d'utiliser le <base> balise html? Dans JSF-vous capable de le résoudre comme <a href="#{request.requestURI}#top">top</a> ou <h:link value="top" fragment="top" />.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X