h: outputText внутри href не работает в JSF 2.0 - PullRequest
1 голос
/ 20 декабря 2011

Я перевожу код с JSF 1.2 на JSF 2.0 (развернут на JBoss 6.1).Однако у меня возникла проблема с использованием h:outputText внутри атрибута href тега link:

<link rel='canonical' href='<h:outputText value="#{resultPage.currentLink}" escape="false"/>' />

Я не могу просто использовать

<link rel='canonical' href="#{resultPage.currentLink}" />

, потому что мне нужен html escapeатрибут.

Я получаю следующее исключение:

javax.servlet.ServletException: Error Parsing /shoe/shoe2.xhtml: Error Traced[line: 23] The value of attribute "href" associated with an element type "link" must not contain the '<' character.
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:321)
    com.youandshoe.web.controller.EncoderFilter.doFilter(EncoderFilter.java:28)
    com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126)
    com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:118)

root cause

javax.faces.view.facelets.FaceletException: Error Parsing /shoe/shoe2.xhtml: Error Traced[line: 23] The value of attribute "href" associated with an element type "link" must not contain the '<' character.
    com.sun.faces.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:390)
    com.sun.faces.facelets.compiler.SAXCompiler.doMetadataCompile(SAXCompiler.java:373)
    com.sun.faces.facelets.compiler.Compiler.metadataCompile(Compiler.java:128)
    com.sun.faces.facelets.impl.DefaultFaceletFactory.createMetadataFacelet(DefaultFaceletFactory.java:316)
    com.sun.faces.facelets.impl.DefaultFaceletFactory.access$200(DefaultFaceletFactory.java:89)
    com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:165)
    com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:164)
    com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:90)
    com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:86)
    com.sun.faces.util.ExpiringConcurrentCache$1.call(ExpiringConcurrentCache.java:95)
    java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    java.util.concurrent.FutureTask.run(Unknown Source)
    com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:110)
    com.sun.faces.facelets.impl.DefaultFaceletCache.getMetadataFacelet(DefaultFaceletCache.java:131)
    com.sun.faces.facelets.impl.DefaultFaceletCache.getMetadataFacelet(DefaultFaceletCache.java:58)
    com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:249)
    com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:198)
    com.sun.faces.application.view.ViewMetadataImpl.createMetadataView(ViewMetadataImpl.java:102)
    com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:223)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
    com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:107)
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
    org.apache.myfaces.extensions.cdi.jsf2.impl.listener.phase.CodiLifecycleWrapper.execute(CodiLifecycleWrapper.java:97)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
    com.youandshoe.web.controller.EncoderFilter.doFilter(EncoderFilter.java:28)
    com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126)
    com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:118)

Однако тот же код прекрасно работает в JSF 1.2, JBoss 5.1.

Есть идеи?Thanx!

1 Ответ

2 голосов
/ 20 декабря 2011

Facelets - это технология представления на основе XML.XML-документ должен быть правильно сформирован.Вложение XML-тегов недопустимо.Чтобы решить вашу проблему, вам нужно вместо этого включить весь HTML внутри <h:outputText>.

<h:outputText value="&lt;link rel=&quot;canonical&quot; href=&quot;#{resultPage.currentLink}&quot; /&gt;" escape="false" />

Кстати, мне действительно интересно, почему вы не можете просто использовать

<link rel="canonical" href="#{resultPage.currentLink}" />

Это должно работать одинаково хорошо.Наличие специальных символов XML в атрибуте href в противном случае приведет к ошибочным ошибкам разметки XML на стороне браузера, и браузер не сможет загрузить ресурс.

...