Java 编写自定义HtmlResponseWriter JSF
对于许多现在不重要的内部问题,我们有一个Servlet过滤器,它可以更改所有结果,即Java 编写自定义HtmlResponseWriter JSF,java,jsf,components,render,Java,Jsf,Components,Render,对于许多现在不重要的内部问题,我们有一个Servlet过滤器,它可以更改所有结果,即application/xhtml+xml,并重写为text/html;charset=UTF-8,因此即使使用facelets,它在IE 6.0中也不会出现问题 我的问题是关于HtmlResponseWriter的,它是负责渲染的组件。是否有可能扩展它并覆盖它的方法,以实现过滤器的预期效果 内容类型将始终输出为text/html 编码总是UTF-8 脚本标记将被包装在中 提前感谢。是的,我们已经扩展了JSF
application/xhtml+xml
,并重写为text/html;charset=UTF-8
,因此即使使用facelets,它在IE 6.0中也不会出现问题
我的问题是关于HtmlResponseWriter的,它是负责渲染的组件。是否有可能扩展它并覆盖它的方法,以实现过滤器的预期效果
- 内容类型将始终输出为text/html李>
- 编码总是
UTF-8代码>
- 脚本标记将被包装在
<!-->中代码>
应用程序/xhtml+xml
。这只是为了确保它实际上在HtmlResponseWriter
类中。JSF组件框架可能很复杂,所以您永远不会知道,在其他实例中可能会呈现此标头
由于HtmlResponseWriter
不像某些组件那样声明为final
,因此您可以扩展它,并覆盖打印application/xhtml+xml
和faces config.xml
中的方法。唯一的障碍是,如果在需要重写的方法中引用了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>
oracle.adf.rich
oracle.adf.rich
org.apache.myfaces.trinidad.Input
oracle.adf.rich.Text
com.company.jsf.renders.text.CustomRenderer
是的,我们已经扩展了JSF(实际上是Oracle ADF)组件,以满足无法立即完成的特殊需求。您将需要获取这些渲染的所有源文件,并递归搜索要删除的有问题的HTML,即应用程序/xhtml+xml
。这只是为了确保它实际上在HtmlResponseWriter
类中。JSF组件框架可能很复杂,所以您永远不会知道,在其他实例中可能会呈现此标头
由于HtmlResponseWriter
不像某些组件那样声明为final
,因此您可以扩展它,并覆盖打印application/xhtml+xml
和faces config.xml
中的方法。唯一的障碍是,如果在需要重写的方法中引用了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>
oracle.adf.rich
oracle.adf.rich
org.apache.myfaces.trinidad.Input
oracle.adf.rich.Text
com.company.jsf.renders.text.CustomRenderer
应用程序/xhtml+xml究竟从何而来?默认情况下,标准JSF/Facelets不会发出这种消息。为什么不直接修复它而不是覆盖渲染器呢?Hello BalusC,模板包含,在javascript中包含cdata,但是欺骗浏览器(实际上是IE-6)将响应读取为文本/html。因此,所有生成text/html响应的请求都作为application/xhtml+xml提供,但过滤器将其设置为text/html。我会寻找更多信息来更好地回答您的考虑。我只是充当text/html
,将JS移动到自己的.JS
文件中,您可以通过
加载该文件。顺便说一句:在评论中使用@昵称
,比如@BalusC
,将自动通知特定用户特定的评论。我没有看到你的评论,直到我浏览了这个主题:)ohhh@BalusC抱歉:/,所以我和过滤器后面的一些人聊天,他向我解释说,我们必须像“app/xhtml+xml”一样提供带有CDATA和一些标记的内联js,这就是为什么模板设置为这种内容类型,过滤器将其更改为text/html。所以我的问题依然存在,是否可以覆盖HtmlResponseWriter?是的,但无论如何使用application/xhtml+xml
是没有意义的。您可以将其设置为text/html
。它也可以正常工作,并且不需要重写编写器。application/xhtml+xml
究竟从何而来?默认情况下,标准JSF/Facelets不会发出这种消息。为什么不直接修复它而不是覆盖渲染器呢?Hello BalusC,模板包含,在javascript中包含cdata,但是欺骗浏览器(实际上是IE-6)将响应读取为文本/html。因此,所有生成text/html响应的请求都作为application/xhtml+xml提供,但过滤器将其设置为text/html。我去看看