Come ottenere l’URL di base?

Ho questa struttura:

WebContent resources components top.xhtml company about_us.xhtml https://stackoverflow.com/questions/6878275/how-get-the-base-url/index.xhtml 

top.xhtml è un componente, utilizzato anche in index.xthml e about_us.xhtml .

top.xhtml

  

Quindi il mio problema è che, quando la pagina corrente è https://stackoverflow.com/questions/6878275/how-get-the-base-url/index.xhtml il componente genera correttamente gli URL, ma quando la pagina corrente è about_us.xhtml , genera URL errati. Non posso usare il percorso relativo perché genererà anche l’URL sbagliato. Penso che sia perché il componente è basato sul percorso corrente della pagina *.xhtml .

L’unica soluzione che ho potuto scoprire è:

  

Ma penso che non sia affatto ‘elegante’. Qualche idea?

Gli URL non vengono risolti in base alla struttura del file sul lato server. Gli URL vengono risolti sulla base dei veri indirizzi Web pubblici delle risorse in questione. È il browser che deve chiamarli, non il webserver.

Ci sono diversi modi per ammorbidire il dolore:

JSF EL offre una scorciatoia per ${pageContext.request} nel gusto di #{request} :

 
  • Home
  • About us
  • Se necessario, puoi utilizzare il per renderlo ancora più breve. Mettilo da qualche parte nel modello principale, sarà disponibile per tutte le pagine:

      ... 
  • Home
  • About us
  • JSF 2.x offre che può richiedere un ID vista relativo alla root di contesto in outcome e aggiungerà automaticamente il percorso di contesto e il mapping FacesServlet :

     
  • HTML offre il tag che rende tutti gli URL relativi nel documento relativi a questa base. Potresti farne uso. Inseriscilo in .

      ... 
  • Home
  • About us
  • (nota: questo richiede EL 2.2, altrimenti è meglio usare JSTL fn:substring() , vedere anche questa risposta )

    Questo dovrebbe finire nel codice HTML generato come

      

    Nota che il tag ha un avvertimento: rende tutti gli ancore di salto nella pagina come relativi ad esso pure! Vedi anche Si consiglia di usare il tag html ? In JSF puoi risolverlo come top o .

    Variazione di JSTL 1.2 sfruttata dalla risposta di BalusC