【问题标题】:myfaces htmlHead is not rendered firstmyfaces htmlHead 没有先渲染
【发布时间】:2018-12-17 23:31:40
【问题描述】:

我已经开始维护一个遗留的 JSF 应用程序。它使用 myFaces 1.1.x 和 tomahawk 1.1.6。我需要打印META标签X-UA-Compatible作为HEAD元素的第一个元素,否则IE会忽略它。

<%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="t" uri="http://myfaces.apache.org/tomahawk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <f:view>
    <t:documentHead>
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta http-equiv="Content-type" content="text/html; charset=UTF-8">

它会生成

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
<script type="text/javascript" src="/Viewer/faces/myFacesExtensionResource/org.apache.myfaces.renderkit.html.util.MyFacesResourceLoader/15311471/navmenu.jscookmenu.HtmlJSCookMenuRenderer/JSCookMenu.js"><!--
//--></script>
<script type="text/javascript" src="/Viewer/faces/myFacesExtensionResource/org.apache.myfaces.renderkit.html.util.MyFacesResourceLoader/15311471/navmenu.jscookmenu.HtmlJSCookMenuRenderer/MyFacesHack.js"><!--
//--></script>
<script type="text/javascript"><!--
var myThemeMiniBlackBase='/Viewer/faces/myFacesExtensionResource/org.apache.myfaces.renderkit.html.util.MyFacesResourceLoader/15311471/navmenu.jscookmenu.HtmlJSCookMenuRenderer/ThemeMiniBlack/';
//--></script>
<script type="text/javascript" src="/Viewer/faces/myFacesExtensionResource/org.apache.myfaces.renderkit.html.util.MyFacesResourceLoader/15311471/navmenu.jscookmenu.HtmlJSCookMenuRenderer/ThemeMiniBlack/theme.js"><!--
//--></script>
<link rel="stylesheet" href="/Viewer/faces/myFacesExtensionResource/org.apache.myfaces.renderkit.html.util.MyFacesResourceLoader/15311471/navmenu.jscookmenu.HtmlJSCookMenuRenderer/ThemeMiniBlack/theme.css" type="text/css" />
<script type="text/javascript" src="/Viewer/faces/myFacesExtensionResource/org.apache.myfaces.renderkit.html.util.MyFacesResourceLoader/15311471/popup.HtmlPopupRenderer/JSPopup.js"><!--
//--></script>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8">

如何强制 META 标签成为第一个元素?我尝试了普通的 HTML HEAD 元素,但它也不起作用。

我需要

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8">

更新:

其中一些 javascripts 和样式是因为这个标签而呈现的:

<t:jscookMenu theme="ThemeMiniBlack" layout="hbr" immediate="true">

剩下的javascript来自

<t:popup closePopupOnExitingElement="true" closePopupOnExitingPopup="true"
         displayAtDistanceX="10" displayAtDistanceY="20" styleClass="popup">

问题是我是否可以强制我放入 t:documentHead 的内容具有优先权?我担心我需要编写自定义标签。

【问题讨论】:

  • 您是如何尝试纯 HTML HEAD 的,结果如何?
  • 是的,我做到了。看起来 HtmlJSCookMenuRenderer 非常“聪明”,它可以找到 HEAD 元素并将其内容放在开头。
  • 请更好地编辑您的问题并添加其他信息,而不是添加不能解决问题的答案。
  • 是的,你是对的。问题没有解决。这只是一个原因识别。将答案合并回问题​​。
  • 无论我使用 HEAD 还是 t:documentHead 输出都是一样的。上述标签的渲染器调用 addResource.addInlineScriptAtPosition() / addJavaScriptAtPosition() 以某种方式找到 HEAD 元素并将其脚本放在它的开头。

标签: jsf myfaces tomahawk jsf-1.1


【解决方案1】:

我会尝试在自定义 Java 过滤器中自己添加元标记。

<filter>
   <filter-name>MetaTagsFilter</filter-name>
   <filter-class>com.yournamespace.MetaTagsFilter</filter-class>
</filter>

然后为 JSF servlet 做一个过滤器映射:

<filter-mapping>
   <filter-name>MetaTagsFilter</filter-name>
   <servlet-name>FacesServlet</servlet-name>
</filter-mapping>

<servlet-mapping>
  <servlet-name>FacesServlet</servlet-name>
  <url-pattern>*.faces</url-pattern>
</servlet-mapping>

在您的过滤器逻辑中,添加元标记,在 servlet 执行处理之后,如下所示:

@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain filterChain) throws IOException, ServletException {

    HtmlResponseWrapper capturingResponseWrapper = new HtmlResponseWrapper(
            (HttpServletResponse) response);

    filterChain.doFilter(request, capturingResponseWrapper);

    if (response.getContentType() != null
            && response.getContentType().contains("text/html")) {


        // Try this https://stackoverflow.com/a/32830377/1199132
        capturingResponseWrapper.addHeader("X-UA-Compatible", "IE=edge");


        // Or this, that way you have more control over WHERE it gets written
        String content = capturingResponseWrapper.getCaptureAsString();

        // replace stuff here (find the <head></head> tags and add the <meta> at the very beginning)

        System.out.println(replacedContent);

        response.getWriter().write(replacedContent);

    }

}

另请参阅:

【讨论】:

  • 嗨,好主意。我忘记了 META 是等效的 og HTTP 标头。同时我实现了几乎可以工作的自定义 JSF 标记 - AddResource 不支持支持元标记。
猜你喜欢
  • 2016-05-31
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 2019-02-03
  • 2022-11-29
  • 2020-12-18
相关资源
最近更新 更多