2010-11-10 4 views
5

Sto utilizzando quanto segue per ottenere un documento di guida nella nostra app. Il mio problema è che mentre lo <h:graphicImage> valuta correttamente il percorso di contesto, lo h:outputLink lo valuta a zero. Ho provato a utilizzare sia $ e # nello h:outputLink perché capisco che hanno diversi tempi di valutazione.Differenza di valutazione del percorso di contesto EL tra outputLink e graphicImage

Qual è la differenza nel modo in cui valgono le due espressioni EL?

<h:outputLink value="${pageContext.servletContext.contextPath}/services/help.pdf"> 
    <h:graphicImage 
     url="${pageContext.servletContext.contextPath}/images/help.png" 
     alt="Online Help"/> 
</h:outputLink> 

risposta

15

Che il percorso del contesto non viene visualizzata nella <h:outputLink> suggerisce che tu sia effettivamente utilizzando Facelets anziché JSP. Il ${pageContext} non esiste affatto in Facelets. È specifico per JSP legacy. Entrambe le espressioni hanno appena valutato una stringa vuota. Non c'è quindi alcuna differenza tra loro.

Che il percorso di contesto venga visualizzato in <h:graphicImage> è completamente previsto. Questo è automaticamente incluso dal componente stesso. In effetti, l'intera espressione è superflua e il seguente dovrebbe funzionare altrettanto bene.

<h:graphicImage url="/images/help.png" alt="Online Help"/> 

Il <h:outputLink> non effettivamente includono automaticamente il percorso del contesto. Solo lo <h:link> lo fa. Dovresti includerlo tu stesso. In Facelets, è possibile utilizzare #{request} per ottenere un handle per HttpServletRequest che a sua volta ha uno getContextPath() (e che viene utilizzato da <h:graphicImage> sotto le copertine).

<h:outputLink value="#{request.contextPath}/services/help.pdf"> 
+0

Utilizziamo Facelets. Non pensavo che stessimo usando un servlet JSP, ma potrei sbagliarmi. Sono ancora un po 'confuso su come in una riga l'oggetto pageContext sia valido e nel prossimo non lo sia. Pensavo di aver provato a non usare il contesto e aveva anche fallito. Avrò bisogno di entrare nel coraggio del nostro ambiente e risolvere questi imbrogli. – Adam

+0

Non valuterà affatto in Facelets. È il 'h: graphicImage' che ha aggiunto il percorso di contesto stesso. – BalusC

3

Prova questo # {} facesContext.externalContext.requestContextPath Spero che questo può aiutare a controllare anche questo link link text

saluti, Sergio Valdez

+0

È necessario elaborare la risposta. Dove dovrei provare? Che differenza fa il '#? Cosa c'è di diverso tra 'requestContextPath' e' contextPath'? – Adam

+0

'#' è usato da JSF per dichiarare EL invece di '$' usato in JSP standar '# è preferibile da JSF ma puoi anche usare ancora' $', devi controllare quale oggetto puoi usare con ' facesContext.externalContext' perché la richiesta ora è gestita da JSF. –

+2

Il '# {request.contextPath}' è più corto. – BalusC

Problemi correlati