编写一个自定义的HtmlResponseWriter JSF

问题描述:

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

我的问题是在HtmlResponseWriter,它是负责渲染的组件。是否可以扩展它并覆盖它的方法,以便我们完成滤镜的预期效果?

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

在此先感谢。

+0

凡究竟'是application/xhtml + xml'从何而来?标准的JSF/Facelets在默认情况下不会发出。你为什么不直接修复它而不是重写渲染器? – BalusC 2010-07-05 13:34:37

+0

Hello BalusC,该模板包含,以便在JavaScript中包含cdata,但却愚弄浏览器(实际上是IE-6)以text/html的形式读取响应。 因此,所有产生文本/ html响应的请求将作为application/xhtml + xml提供,但过滤器会将其设置为text/html。我会寻找更多信息以更好地回答您的考虑。 – 2010-07-05 19:13:59

+0

我只是将'text/html'作为'text/html'并将JS移动到它自己的'.js'文件中,通过'

是的,我们已经扩展了JSF(实际上是Oracle ADF)组件,以满足特殊的需求,而这些特殊的需求不可能在开箱即用的情况下完成。您将需要获取这些渲染的所有源文件,并对要删除的有问题的HTML进行递归搜索,即application/xhtml+xml。这只是为了确保它实际上在HtmlResponseWriter课程中。 JSF组件框架可能很复杂,所以你永远不知道,可能有其他情况下,这个头被渲染。

由于HtmlResponseWriter未声明final像某些组件,可以只延伸这一点,并覆盖其中application/xhtml+xml正在打印和在faces-config.xmlregister it的方法。唯一的障碍是如果在你需要覆盖的方法中引用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> 
+0

是的!这正是我需要做的,但是我不知道如何声明扩展组件以便正确使用,您能否提供给我更多信息? – 2010-07-08 11:58:04

+0

@Kamia,一旦您编写了Java类,请在faces-config.xml中指向它,以便它注册“ HtmlResponseWriter'与你的新班级,我可以提供一个例子,但这是来自ADF,虽然... – Zombies 2010-07-08 15:35:43

+0

只是发现它所需的步骤,在ResponseWriter的情况下,是不够使用它..你必须重写整个渲染工具包或制作一个装饰器以防止所有类的重写 因为您的答案将我引向Pro JSF和Ajax(第237页至第264页)这本书,所以我关闭了这个问题并给了您关于这个问题的观点。 我希望我也可以指出@BalusC。 – 2010-07-08 20:37:19