【问题标题】:h:outputText inside of href doesn't work in JSF 2.0h:outputText 内的 href 在 JSF 2.0 中不起作用
【发布时间】:2011-12-20 14:45:54
【问题描述】:

我正在将代码从 JSF 1.2 迁移到 JSF 2.0(部署在 JBoss 6.1 上)。但是,在link 标签的href 属性内使用h:outputText 时遇到问题:

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

我不能只使用

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

因为我需要 html 转义属性。

我收到以下异常:

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 中运行良好。

有什么想法吗?谢谢!

【问题讨论】:

    标签: xhtml jsf-2


    【解决方案1】:

    Facelets 是一种基于 XML 的视图技术。 XML 文档必须格式正确。嵌套 XML 标记无效。要解决您的问题,您需要将整个 HTML 包含在 &lt;h:outputText&gt; 中。

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

    顺便说一句,我真的很想知道为什么你不能只使用

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

    这应该同样有效。在href 属性中包含 XML 特殊字符,否则无论如何都会在浏览器端导致无效的 XML 标记错误,并且浏览器将无法下载资源。

    【讨论】:

    • 顺便说一句,如果我使用 ,href 值不会像 "...keywords=nike&page=1&pages=83 ”,但是“...keywords=nike&page=1&pages=83”。框架(或浏览器?)将“&”字符编码为“&”,这会创建无效链接。
    • 对不起,表述错误,不是无效的,而是我不喜欢的格式。我不想在链接中有“keywords=nike&page=1&pages=83”,而是“keywords=nike&page=1&pages=83”。
    • 你为什么不喜欢那个?它同样有效。为什么要与其他人不同并努力尝试,因为想以不同的方式做事?
    • 效果很好(如果您单击生成的链接并在浏览器中打开),但我不确定这是否会在 Google 爬虫访问我的网站时出现问题,而不是 ,它找到
    • 如果 Google 不遵循网络标准,它就会变得愚蠢。 W3 要求以转义形式交付预定义的 HTML/XML 实体。
    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 2014-08-18
    • 2011-11-26
    • 1970-01-01
    • 2017-12-09
    相关资源
    最近更新 更多