2010-11-10 9 views
5

Estoy usando lo siguiente para obtener un documento de ayuda en nuestra aplicación. Mi problema es que mientras el <h:graphicImage> evalúa correctamente la ruta del contexto, h:outputLink lo evalúa en nada. He intentado usar ambos $ y # en el h:outputLink porque entiendo que tienen diferentes tiempos de evaluación.diferencia de evaluación de ruta de contexto EL entre outputLink y graphicImage

¿Cuál es la diferencia en la forma en que evalúan las dos expresiones EL?

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

Respuesta

15

que la ruta de contexto no se ven <h:outputLink> sugiere que eres actualmente usando Facelets en lugar de JSP. El ${pageContext} no existe en Facelets en absoluto. Es específico de JSP heredado. Ambas expresiones acaban de evaluar a una cadena vacía. Por lo tanto, no hay diferencia entre ellos en absoluto.

Que la ruta de contexto aparece en <h:graphicImage> es totalmente esperado. Esto es incluido automáticamente por el componente en sí. De hecho, toda la expresión es superflua y lo siguiente debería funcionar tan bien.

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

El <h:outputLink> de hecho no incluye automáticamente la ruta de contexto. Solo el <h:link> hace eso. Tendría que incluirlo usted mismo. En Facelets, puede usar #{request} para obtener un identificador para HttpServletRequest que a su vez también tiene getContextPath() (y que es utilizado por <h:graphicImage> debajo de las fundas).

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

Estamos usando Facelets. No pensé que estuviéramos usando un servlet JSP, pero puedo estar equivocado. Todavía estoy un poco confundido de cómo en una línea el objeto pageContext es válido y en el siguiente no. Pensé que había intentado confiar en no usar el contexto y que también había fallado. Tendré que entrar en las entrañas de nuestro entorno y resolver estas travesuras. – Adam

+0

No se evaluará en absoluto en Facelets. Es el 'h: graphicImage' que agregó la ruta del contexto en sí. – BalusC

3

Prueba este # {facesContext.externalContext.requestContextPath} Espero que esto puede ayudar a que también compruebe este enlace link text

Saludos, Sergio Valdez

+0

Tienes que dar más detalles sobre tu respuesta. ¿Dónde debería intentar eso? ¿Qué diferencia hace el '#'? ¿Qué es diferente entre 'requestContextPath' y' contextPath'? – Adam

+0

'#' es usado por JSF para declarar EL en lugar de '$' que se usa en JSP estándar '#' es preferido por JSF pero también puedes usar '$', debes verificar con qué objeto puedes usar ' facesContext.externalContext' porque la solicitud ahora está gestionada por JSF. –

+2

El '# {request.contextPath}' es más corto. – BalusC

Cuestiones relacionadas