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

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


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


提前致谢。

最佳答案

是的,我们已经扩展了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>

关于java - 编写自定义的HtmlResponseWriter JSF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3168140/

10-10 22:36