编写自定义 HtmlResponseWriter JSF

Posted

技术标签:

【中文标题】编写自定义 HtmlResponseWriter JSF【英文标题】:Write a custom HtmlResponseWriter JSF 【发布时间】:2011-03-11 05:38:42 【问题描述】:

对于许多现在不计算在内的内部问题,我们有一个 Servlet 过滤器,它可以更改 application/xhtml+xml 的所有结果并重写为 text/html;charset=UTF-8,因此即使使用 facelets,它也可以在 IE 6.0 上正常工作。

我的问题是关于 HtmlResponseWriter,它是负责渲染的组件。是否可以扩展它并覆盖它的方法,以便我们实现过滤器的预期效果?

内容类型将始终输出为 text/html; 编码将始终为UTF-8; 脚本标签将被包裹在 < ! -- <[[CDATA ]]> --> 中。

提前致谢。

【问题讨论】:

application/xhtml+xml 究竟来自哪里?默认情况下,标准 JSF/Facelets 不会发出它。为什么不直接修复它而不是覆盖渲染器? 你好 BalusC,模板包含 ,将 cdata 包含在 javascript 中,但欺骗浏览器(实际上是 IE-6)读取以文本/html 的形式响应。因此,所有产生 text/html 响应的请求都作为 application/xhtml+xml 提供,但过滤器将其设置为 text/html。我会寻找更多信息以更好地回答您的考虑。 我只是充当text/html 并将JS 移动到它自己的.js 文件中,您可以通过<script src="file.js"> 加载该文件。顺便说一句:在 cmets 中使用 @nickname@BalusC 会自动通知特定用户有关特定 cmets。在我浏览这个主题之前我没有看到你的评论:) ohhh @BalusC 对不起:/,所以我和过滤器后面的一些人聊天,他向我解释说,我们必须使用 CDATA 和一些标签提供内联 js,就像我们使用“app/xhtml”一样+xml" 所以这就是为什么模板被设置为此内容类型并且过滤器将其更改为 text/html。所以我的问题仍然存在,是否可以覆盖 HtmlResponseWriter? 是的,但无论如何使用application/xhtml+xml 是没有意义的。您可以将其设置为text/html。它会工作得很好,你不需要覆盖作家。 【参考方案1】:

是的,我们扩展了 JSF(实际上是 Oracle ADF)组件以满足开箱即用无法完成的特殊要求。您将需要获取这些渲染的所有源文件并递归搜索您想要删除的违规 HTML,application/xhtml+xml。这只是为了确保它实际上在 HtmlResponseWriter 类中。 JSF 组件框架可能很复杂,所以您永远不知道,可能还有其他实例会呈现此标头。

由于HtmlResponseWriter 不像某些组件那样声明为final,您可以扩展它,并覆盖正在打印application/xhtml+xml 的方法和faces-config.xml 中的register it。唯一的障碍是,如果在您需要覆盖的方法中引用了 HtmlResponseWriter 内部声明的私有变量。如果是这种情况,您将无法在重新实现中引用它们,或者您将不得不完全重新构建一个新的 HtmlResponseWriter 类(通过扩展 ResponseWriter 并模仿每个方法和实例变量)。扩展HTMLResponseWriter 的好处是您将自动获取对其进行的任何更改(来自 JSF 更新)(当然,被覆盖的方法除外)。

更新: 这是我为 faces-config.xml 所做的,但它使用的是 Oracle ADF:

<?xml version="1.0" encoding="windows-1252"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee">
  <application>
    <default-render-kit-id>oracle.adf.rich</default-render-kit-id>
  </application>
  <render-kit>
    <render-kit-id>oracle.adf.rich</render-kit-id>
    <renderer>
      <component-family>org.apache.myfaces.trinidad.Input</component-family>
      <renderer-type>oracle.adf.rich.Text</renderer-type>
      <renderer-class>com.company.jsf.renders.text.CustomRenderer</renderer-class>
    </renderer>
  </render-kit>
</faces-config>

【讨论】:

是的!这正是需要做的,但我不知道如何声明扩展组件以供正确使用。能否提供更多信息? @Kamia,一旦您编写了 Java 类,请在 faces-config.xml 中指向它,以便它在您的新类中注册 HtmlResponseWriter。我可以提供一个例子,但这是来自 ADF... 只是找到了它所需的步骤,对于 ResponseWriter,还不足以使用它。你必须重写整个渲染工具包或制作一个装饰器来使用它来防止重写所有类。我会结束这个问题并给你分数,因为你的回答让我看到了 Pro JSF and Ajax (第 237 到 264 页)一书。我希望我也可以为此指出@BalusC。

以上是关于编写自定义 HtmlResponseWriter JSF的主要内容,如果未能解决你的问题,请参考以下文章

编写自定义函数:建立双向链表,该链表有20个结点,20个结点所需的数值由随机函数产生。 编写自定义函数:

编写自定义 lint 警告以检查自定义注释

自定义 UISlider(无需编写自定义代码)

编写自定义函数,求水仙花数,并输出

代码调试篇:如何编写 gdb 自定义命令

代码调试篇:如何编写 gdb 自定义命令