当前位置: 首页 > 知识库问答 >
问题:

myfaces htmlHead不会首先渲染

步建茗
2023-03-14

我已经开始维护一个遗留的JSF应用程序。它使用myFaces 1.1。x和战斧1.1.6。我需要打印METAtagX-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">

如何强制元标记成为第一个元素?我尝试了纯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">

更新:

其中一些Java脚本和样式是由于以下标记而呈现的:

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

剩下的javascript来自

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

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

共有1个答案

郭通
2023-03-14

我会尝试在自定义java过滤器中添加meta标记。

<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执行处理之后,添加meta标记,如下所示:

@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);

    }

}

另见:

  • 修改html响应使用过滤器
  • doFilter()是在Servlet的工作完成之前还是之后执行的?
  • 用. jsp或. xhtml或. jsf扩展名创建JSF页面有什么区别
  • 过滤器的要领(Oracle)
 类似资料:
  • 初次见面,请多多关照。我是生在博多,成长在Git社区的「猴子老师」。今天我们要来一起学习版本管理系统「Git」哦。 要把文档还原到编辑前的状态,大家都是怎么做的呢? 最简单的方法就是先备份编辑前的文档。使用这个方法时,我们通常都会在备份的文档名或目录名上添加编辑的日期。但是,每次编辑文档都要事先复制,这样非常麻烦,也很容易出错。 再加上,如果像上图那样毫无命名规则的话,就无法区分哪一个文档是最新的

  • react 18 里的类组件在严格模式下会执行一次模拟渲染, 在类组件的生命周期里表现如下 first.constructor -> second.constructor -> first.componentDidMount -> first.componentWillUnmount -> second.componentDidMount 一个比较简单的例子就是,复现链接(https://play

  • 我在一个应用程序的前端原型上工作,该应用程序具有给定的JS、React和CoreUI4 React技术栈。我来自Python背景,在网络开发和我给定的技术堆栈方面没有太多经验。当我不得不开始使用钩子时,这一点变得很明显。 问题 我真的不明白为什么它不更新我的和/或不渲染。我需要一个条件渲染,我也使用。 我试图: 从我的主应用程序中传递一个更大的状态,一旦我启动条件逻辑(挂钩规则)就无法工作。 当我

  • 尽管试图避免所有记录在案的陷阱,阻止React在状态更改后重新渲染,但我仍然无法解决我的问题: } 从每个长方体组件调用update函数,并触发长方体网格上新颜色的指定。 试图避免常见的错误: 颜色数组只有在通过扩展运算符从状态复制后才被修改 通过setState()传递新数组 此外,我还处理了两个组件中函数的实例绑定 但是,尽管onClick成功触发了状态更改,但不会进行重新渲染。我在这里缺少的

  • 我正在将当前的ec2环境从amazon linux迁移到Centos7。一路上有一些障碍,但我设法在这里和那里调整东西,让一切都工作起来。然而,我并没有被雷迪斯卡住。 我有一个小的redis集群作为一个简单的K/V缓存运行。对于这次迁移,我一直遵循以下说明。安装似乎工作正常,但我检查了systemctl中的状态,并看到以下内容: $sudo systemctl status Redis.servi

  • 问题内容: 我在Swift 3.0中根据html内容创建了pdf文件: 除了我的base64编码图像外,其他所有内容都可以正常渲染。在Web视图中或在Safari或chrome浏览器中的HTML内容本身可以正确显示,并且可以正确显示所有图像。但是图像永远不会渲染到pdf中。 为什么不渲染图像?如何使它们渲染? 问题答案: 我找到了解决方案! 导出到PDF会在渲染过程完成之前进行。如果您放入很小的图