JSF - 筛选javax.faces.resource文本替换

时间:2012-06-28 14:20:04

标签: jsf servlets jsf-2 rewrite servlet-filters

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

例如,我正在寻找替换CSS文件中找到的url的引用: prod.ourdomain.com 至 dev.ourdomain.com

这样的事情。谢谢!

1 个答案:

答案 0 :(得分:3)

您基本上需要使用自定义HttpServletResponse#getOutputStream()覆盖ServletOutputStream,该自定义@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

然而,这可以进一步优化。您也可以在自定义输出流中执行作业而不是缓冲整个响应,只缓存以<h:outputStylesheet>开头的字符,然后将其丢弃并写入新字符串,然后继续。


更新:一个完全不同的选择,毕竟实际上更好,就是在CSS文件中直接使用EL。由JSF someSelector { background: url("http://#{staging.dev ? 'dev' : 'prod'}.ourdomain.com/image.png"); } 执行的CSS资源请求,默认情况下支持CSS文件中的EL。例如,

{{1}}