2010-11-10 73 views
5

我正在使用以下來獲取我們的應用程序中的幫助文檔。我的問題是,雖然<h:graphicImage>正確評估上下文路徑,但h:outputLink評估它什麼也沒有。我曾嘗試在h:outputLink中同時使用$#,因爲我知道他們有不同的評估時間。outputLink和graphicImage之間的EL上下文路徑評估差異

兩個EL表達式如何評估有什麼區別?

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

回答

15

,上下文路徑沒有出現在<h:outputLink>暗示你實際上是使用Facelets而不是JSP。在Facelets中根本不存在${pageContext}。它是特定於傳統JSP的。這兩個表達式都剛剛評估爲空字符串。因此,它們之間根本沒有區別。

完全預期上下文路徑出現在<h:graphicImage>中。這是由組件本身自動包含的。事實上,整個表達式是多餘的,下面的內容應該是一樣的。

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

<h:outputLink>確實不會自動包括上下文路徑。只有<h:link>這樣做。你需要自己包含它。在Facelets中,您可以使用#{request}來獲得HttpServletRequest的句柄,而HttpServletRequest也具有getContextPath()(以及其中的<h:graphicImage>)。

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

我們正在使用Facelets。我沒有想到我們使用的是JSP servlet,但我可能是錯的。我仍然有點困惑如何在一行pageContext對象是有效的,在下一個不是。我以爲我試圖依靠不使用上下文,它也失敗了。我需要進入我們的環境的膽量,並理清這些詭計。 – Adam 2011-04-14 00:09:01

+0

它在Facelets中根本不會評估。這是'h:graphicImage',它自己添加了上下文路徑。 – BalusC 2011-04-14 01:36:27

3

試試這個#{} facesContext.externalContext.requestContextPath我希望這可以幫助你也檢查此鏈接link text

問候, 塞爾吉奧·瓦爾迪茲

+0

您需要詳細說明您的答案。我應該在哪裏嘗試? '#'做了什麼區別? 'requestContextPath'和'contextPath'有什麼區別? – Adam 2011-01-18 17:57:36

+0

JSF使用'#'來聲明EL,而不是使用標準JSP''''''的'$',但是你也可以繼續使用'$',你必須檢查你可以使用' facesContext.externalContext'導致請求現在由JSF管理。 – 2011-02-23 16:29:32

+2

'#{request.contextPath}'較短。 – BalusC 2012-12-20 03:12:53