对于现在还不算在内的许多内部问题,我们有一个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/