Разница в оценке пути контекста EL между outputLink и graphicImage

Я использую следующее, чтобы получить справочный документ в нашем приложении. Моя проблема в том, что в то время как <h:graphicImage> правильно оценивает контекстный путь, h:outputLink ничего не оценивает. Я пытался использовать как $, так и # в h:outputLink, потому что я понимаю, что у них разное время оценки.

В чем разница в том, как оцениваются два выражения EL?

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

person Adam    schedule 10.11.2010    source источник


Ответы (2)


Что контекстный путь не отображается в <h:outputLink>. предполагает, что вы фактически используете Facelets вместо JSP. ${pageContext} вообще не существует в Facelets. Это специфично для устаревшего JSP. Оба выражения только что получили пустую строку. Таким образом, между ними нет никакой разницы.

Появление пути контекста в <h:graphicImage> вполне ожидаемо. . Это автоматически включается самим компонентом. На самом деле, все выражение является излишним, и следующее должно работать так же хорошо.

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

<h:outputLink> действительно не включает контекстный путь автоматически. Это делает только <h:link>. Вам нужно будет включить его самостоятельно. В Facelets вы можете использовать #{request}, чтобы получить дескриптор HttpServletRequest, который в свою очередь, также имеет getContextPath() ( и который используется <h:graphicImage> под одеялом).

<h:outputLink value="#{request.contextPath}/services/help.pdf">
person BalusC    schedule 13.04.2011
comment
Мы используем Facelets. Я вообще не думал, что мы используем сервлет JSP, но могу ошибаться. Я все еще немного запутался, как в одной строке объект pageContext действителен, а в следующей нет. Я думал, что пытался полагаться на то, чтобы не использовать контекст, и это также потерпело неудачу. Мне нужно проникнуть в внутренности нашего окружения и разобраться в этих махинациях. - person Adam; 14.04.2011
comment
Он вообще не будет оцениваться в Facelets. Это h:graphicImage, который добавил сам контекстный путь. - person BalusC; 14.04.2011

Попробуйте этот #{facesContext.externalContext.requestContextPath}, надеюсь, это поможет вам также проверить эту ссылку текст ссылки

С уважением, Серхио Вальдес.

person Sergio Valdez    schedule 22.12.2010
comment
Вам нужно уточнить свой ответ. Где я должен попробовать это? Какая разница #? В чем разница между requestContextPath и contextPath? - person Adam; 18.01.2011
comment
# используется JSF для объявления EL вместо $, который используется в стандартном JSP. # предпочитает JSF, но вы также можете использовать $, вы должны проверить, какой объект вы можете использовать с facesContext.externalContext, потому что запрос теперь управляется JSF. - person Sergio Valdez; 23.02.2011
comment
#{request.contextPath} короче. - person BalusC; 20.12.2012