代码之家  ›  专栏  ›  技术社区  ›  Diego Magalhães

编写自定义的HtmlResponseWriter JSF

  •  1
  • Diego Magalhães  · 技术社区  · 15 年前

    对于许多现在还不重要的内部问题,我们有一个Servlet过滤器,它可以更改所有需要的结果 application/xhtml+xml 并重写为 text/html;charset=UTF-8

    我的问题是HtmlResponseWriter,它是负责渲染的组件。有没有可能扩展它并覆盖它的方法,以便我们实现所需的过滤效果?

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

    提前谢谢。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Zombies    15 年前

    是的,我们已经扩展了JSF(实际上是oracleadf)组件,以满足那些无法开箱即用的特殊需求。您将需要获得这些呈现的所有源文件,并对要删除的有问题的HTML进行递归搜索 application/xhtml+xml . 这只是为了确保它实际上在 HtmlResponseWriter 班级。JSF组件框架可能很复杂,所以您永远不会知道,可能还有其他实例呈现了这个头。

    自从 HtmlResponseWriter 未声明 final 就像某些组件一样,您可以扩展它,并重写其中的方法 应用程序/xhtml+xml register it faces-config.xml . 唯一的障碍是如果在 在需要重写的方法中被引用。如果是这种情况,你要么不能在你的重新实现中引用它们,要么你必须完全重新构建一个新的 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>