Quelle URL utiliser pour créer un lien / naviguer vers d'autres pages JSF

Je ne sais pas comment faire le lien entre les fichiers D'un projet Java Server Faces, lorsque certains fichiers se trouvent dans des sous-dossiers. (J'allais ajouter des captures d'écran pour que vous puissiez voir la vue du projet Nebeans, et la vue des fichiers de l'exemple que j'essaie.... mais je ne suis pas encore autorisé à ajouter des images).

j'titre d'exemple, mon projet, j'ai des fichiers appelés "index.xhtml" et "calculer/calculer.xhtml". J'ai aussi un fichier appelé "modèle.xhtml", qui est utilisé par les deux. La question est de quel format d'url utiliser dans le modèle qui fonctionnera pour les deux fichiers.

en html simple, je voudrais juste utiliser quelque chose comme ce qui suit pour fournir un lien retour à la page d'accueil qui fonctionnerait de n'importe quel endroit:

<a href="/index.html">Home</a>

mais je n'arrive pas à comprendre ce qui compte comme dossier racine pour une application JSF, et s'il faut utiliser la structure de dossier" project view "ou la structure de dossier" files list".

5
demandé sur BalusC 2015-06-06 16:45:10

1 réponses

tout d'abord, JSF est un générateur de code HTML. Il n'est donc pas différent dans JSF que dans "plain" HTML. Vous ne devez tout simplement pas regarder la structure du système de fichiers dans le projet webapp lors de la création de liens en HTML. Vous devriez regarder la structure URL publique de ces ressources. C'est notamment le webbrowser qui doit invoquer et télécharger ces ressources, pas le webserver. Le webbrowser ne sait absolument rien de la structure du système de fichiers du serveur web. Cela n'est pas propre aux projets JSF. Ce s'applique à tous les projets web.

URLs relatives ne sont pas relatives à leur emplacement dans la structure du système de fichiers dans le projet webapp. Ils sont relatifs à L'URL de la requête du document HTML actuellement ouvert, exactement celui que vous voyez dans la barre d'adresse du navigateur. Il est à noter que lorsqu'un élément <base> est présent dans le document HTML, toutes les URL relatives du document HTML qui ne commencent pas par / deviendront relatives à cet élément.

Étant donné une webapp qui est configuré avec FacesServlet modèle d'URL de cartographie de *.xhtml , et est déployé à localhost:8080 avec un chemin de contexte de /context , L'URL d'un /index.xhtml fichier dans la racine Web du projet sera comme ci-dessous:

http://localhost:8080/context/index.xhtml
----   -------------- ------- -----------
  |           |          |         `-- resource
  |           |          `-- path (can be multiple folders)
  |           `-- domain (and port)
  `-- scheme

lorsque vous êtes actuellement dans http://localhost:8080/context/index.xhtml , et que vous voulez créer un lien vers http://localhost:8080/context/calculate/calculate.xhtml , alors tous les chemins ci-dessous pointeront en fin de compte vers exactement la même URL absolue.

  • une URL relative commençant par // est relative au schéma actuel.

    <a href="//localhost:8080/context/calculate/calculate.xhtml">link</a>
    
  • une URL relative commençant par / est relative au domaine.

    <a href="/context/calculate/calculate.xhtml">link</a>
    
  • Une URL relative pas commençant par / est par rapport à la trajectoire.

    <a href="calculate/calculate.xhtml">link</a>
    

et quand vous êtes actuellement en http://localhost:8080/context/calculate/calculate.xhtml , et vous voulez lier à http://localhost:8080/context/index.xhtml , alors les mêmes règles s'appliquent:

  • une URL relative commençant par // est relative au schéma actuel.

    <a href="//localhost:8080/context/index.xhtml">link</a>
    
  • une URL relative commençant par / est relative au domaine.

    <a href="/context/index.xhtml">link</a>
    
  • Une URL relative pas commencer par / est relatif au chemin.

    <a href="../index.xhtml">link</a>
    

comme vous le réalisez probablement maintenant, une URL relative commençant par / est pas dépendant du chemin et du domaine actuels. Donc, c'est L'URL que vous voulez vraiment utiliser partout dans votre application web sans vous soucier des problèmes de maintenance lors du changement de domaine ou du déplacement de fichiers dans le serveur. La seule chose qui reste est la dynamicité du chemin du contexte. Vous savez probablement déjà que cette valeur n'est pas contrôlable à l'intérieur de la webapp. Vous voulez vraiment éviter le codage dur. Vous pouvez cependant facilement laisser JSF l'imprimer programmatiquement avec un peu d'aide de EL. Il est à savoir tout juste disponible par HttpServletRequest#getContextPath() et le HttpServletRequest est en EL disponible comme objet implicite #{request} .

<a href="#{request.contextPath}/index.xhtml">link</a>
<a href="#{request.contextPath}/calculate/calculate.xhtml">link</a>

cela devient fastidieux de le répéter à chaque fois. Heureusement, JSF offre le composant <h:link> dans le but de générer un élément HTML <a> avec le chemin de contexte actuel automatiquement inlined.

<h:link value="link" outcome="index.xhtml" />
<h:link value="link" outcome="calculate/calculate.xhtml" />

notez que le outcome doit représenter un ID de vue JSF, qui n'est pas nécessairement le même que le chemin D'URL (il le sera lorsque vous mapperez FacesServlet sur *.xhtml ). Vous pouvez même omettre l'extension de fichier ici, JSF le détectera automatiquement dans le cadre de la "navigation implicite" mécanisme.

<h:link value="link" outcome="index" />
<h:link value="link" outcome="calculate/calculate" />

voir aussi:

19
répondu BalusC 2017-05-23 11:46:50