JSF -- 过滤 javax.faces.resource 文本替换

Posted

技术标签:

【中文标题】JSF -- 过滤 javax.faces.resource 文本替换【英文标题】:JSF -- Filter for javax.faces.resource text replacements 【发布时间】:2012-06-30 02:17:50 【问题描述】:

我正在 JSF 2.17 Mojarra 上使用 Tomcat7。我想在 /javax.faces.resource/* 的 CSS 和 javascript 请求前面放置一个 servlet 过滤器,以重写我们的开发和 rc 环境中的某些文本引用。我似乎无法使用传统的 servlet 过滤器更改这些 CSS 和 Javascript 文件。有没有其他方法可以做到这一点?

例如,我希望替换对 CSS 文件中的 url 的引用: prod.ourdomain.com 到 dev.ourdomain.com

类似的东西。谢谢!

【问题讨论】:

【参考方案1】:

您基本上需要使用自定义ServletOutputStream 覆盖HttpServletResponse#getOutputStream(),该ServletOutputStream 写入本地缓冲区,然后在其中进行字符串替换,最后将修改后的字符串写入响应。这是相当多的代码,所以这里有一些有用的类可以进一步帮助您:

HttpServletResponseOutputWrapper BufferedHttpServletResponse

那么你基本上可以如下实现过滤器:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException 
    if (((HttpServletRequest) request).getRequestURI().endsWith(".css.xhtml"))  // If you use *.xhtml as JSF mapping.
        BufferedHttpServletResponse bufferedResponse = new BufferedHttpServletResponse(((HttpServletResponse) response);
        chain.doFilter(request, bufferedResponse);
        String string = new String(bufferedResponse.getBuffer(), response.getCharacterEncoding());
        string = string.replace("http://prod.ourdomain.com", "http://dev.ourdomain.com");
        response.getWriter().write(string);
    
    else 
        chain.doFilter(request, response);
    

不过,这对于进一步优化是开放的。除了缓冲 整个 响应,您还可以在自定义输出流中执行该作业并仅缓冲以 http://prod.ourdomain.com 开头的字符,然后丢弃它并改为写入新字符串,然后继续。


更新:一个完全不同的选择,毕竟实际上更好,是直接在 CSS 文件中使用 EL。由 JSF <h:outputStylesheet> 执行的 CSS 资源请求,即默认情况下支持 CSS 文件中的 EL。例如,

someSelector 
    background: url("http://#staging.dev ? 'dev' : 'prod'.ourdomain.com/image.png");

【讨论】:

哇。 El 确实是一个漂亮的解决方案。非常感谢! 如果我想在全局范围内注册一个 el 表达式,那么在 JSF 应用程序中执行类似操作的最佳位置在哪里? 您可以使用上下文初始化参数。可通过#initParam 获得。例如。 <param-name>staging</param-name> 的值将由 #initParam.staging 提供。您可以使用热切启动的应用程序范围托管 bean。您可以使用ServletContextListener 来设置ServletContext 中的属性。等等……

以上是关于JSF -- 过滤 javax.faces.resource 文本替换的主要内容,如果未能解决你的问题,请参考以下文章

带有 JSF 的 Servlet 过滤器

如何在 JSF 2 中进行 Web 过滤?

JSF 页面不使用过滤器接口重定向

JSF 缓存静态资源过滤器

具有延迟加载、过滤和排序的 jsf 数据表

如何在 JSF 中实现登录过滤器?