public class ResourcePhaseListener implements PhaseListener { public static final String RESOURCE_REQUEST_KEY = "rpl_resourcePath"; // Example: /path/to/resources/starting/on/package/root // Resources.RESOURCE_DIR = // getClass().getPackage().getName().replaceAll("\\.", "/"); private static final String ASSUMED_DIR_PREFIX = Resources.RESOURCE_DIR; private static Map resourceMap; private void loadResource(String resourcePath) { InputStream is = getClass().getResourceAsStream( ASSUMED_DIR_PREFIX + resourcePath); if (is == null) { return; } BufferedReader br = new BufferedReader(new InputStreamReader(is)); try { String line = null; StringBuffer resourceBuf = new StringBuffer(); while ((line = br.readLine()) != null) { resourceBuf.append(line + "\n"); } getResourceMap().put(resourcePath, resourceBuf.toString()); } catch (Exception e) { e.printStackTrace(); } finally { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } public void afterPhase(PhaseEvent event) { FacesContext context = event.getFacesContext(); ExternalContext exContext = event.getFacesContext() .getExternalContext(); Object resourcePathObj = exContext.getRequestParameterMap().get( RESOURCE_REQUEST_KEY); if (!(resourcePathObj instanceof String)) { return; } String resourcePath = (String) resourcePathObj; String resource = null; if (!getResourceMap().containsKey(resourcePath)) { loadResource(resourcePath); } resource = getResourceMap().get(resourcePath); if (resource == null) { return; } HttpServletResponse response = (HttpServletResponse) exContext .getResponse(); PrintWriter out = null; response.setContentType("text/plain;charset=UTF-8"); try { out = response.getWriter(); out.print(resource); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { out.close(); } context.responseComplete(); } } public PhaseId getPhaseId() { return PhaseId.RESTORE_VIEW; } public void beforePhase(PhaseEvent event) { } private static Map getResourceMap() { if (resourceMap == null) { resourceMap = new HashMap(); } return resourceMap; } }