【问题标题】:Remove appended header from JSF page从 JSF 页面中删除附加的标题
【发布时间】:2012-01-31 19:23:45
【问题描述】:

我用以下代码编写了一个.xhtml 页面:

<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <p>P</p>
    </body>
</html>

我正在新窗口中使用 JavaScript 打开此页面。

不幸的是它显示为

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    </head>
    <div id="">
        <html>
            <head>
                <title>Test</title>
            </head>
            <body>
                <p>P</p>
            </body>
        </html>
    </div>
</html>

这当然是无效的 HTML。如何删除那些附加的标签?为什么要创建它们?

我正在使用 JSF 1.2、Facelets、Portlet API 2.0 和 JBoss PortletBridge。

【问题讨论】:

  • 您应该使用带有 组件的模板,然后在您的页面中使用
  • 听起来好像 JS 触发的请求 URL 与 web.xml 中指定的 FacesServlet URL 模式不匹配。请验证这一点。我不确定 portlet API 的作用/影响是什么,因为我从未使用过它,所以我不会直接将其发布为答案。
  • 模式为*.xhtml,URL以.xhtml结尾。
  • 哦?这适用于您不通过 JS 打开的普通页面吗?

标签: java jsf facelets portlet jsf-1.2


【解决方案1】:

尝试使用 jsf head 和 body 组件:

<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core">
    <f:view>
        <h:head>
            <title>Test</title>
        </h:head>
        <h:body>
            <p>P</p>
        </h:body>
    </f:view>
    </html>

【讨论】:

  • h:headh:body 很遗憾仅在 JSF 2 中可用。
  • 您没有首先解释为什么会出现问题。
【解决方案2】:

您应该使用带有组件的模板,然后在您的页面中使用

示例 模板

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html dir="ltr" xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<h:head>
<title><ui:insert name="title">Default title</ui:insert></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</h:head>
<h:body dir="ltr">
<ui:insert name="content" />
</h:body>
</html>

还有一个 .xhtml 页面

!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<f:view xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
>
<html>
    <head></head>
    <body>
<ui:composition template="${empty param.sl ? '/includes/template.xhtml' : '/includes/templatepopup.xhtml'}">
    <ui:define name="title">${msg.removeapplicant_title}</ui:define>
<ui:define name="content">
        <f:view>


put your htlml here

</f:view>
    </ui:define>
</ui:composition>
</body></html>
</f:view>

【讨论】:

  • 实际上我使用了一个模板并得到了描述的问题。为了简单起见,我在问题中省略了它。
  • 您暗示需要使用模板客户端才能检索正确的 HTML 结果。这是不真实的。
【解决方案3】:

我现在为弹出窗口写了一个HttpServlet 来规避这个问题。由于它转发到的文件以*.jsp 结尾,因此它不受FacesServlet 的影响,并且不会附加任何奇怪的标头。

【讨论】:

    猜你喜欢
    • 2017-08-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多