myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mraible <>
Subject Using a StaticFilter and dispatching to FacesServlet doesn't work
Date Thu, 22 Mar 2007 21:00:16 GMT

In my web application, I prefer to have FacesServlet mapped to *.html.  This
has worked fine for me for the last couple of years. Recently, I've tried to
add a StaticFilter that looks for static files (i.e. /content/faq.html) and
dispatches to those if they're found. If they're not found, I dispatch to
the FacesServlet, which doesn't have a <servlet-mapping> in web.xml.  This
all works great, except that <h:commandLink> seems to need the servlet
mapping in order to create its links.  If I have the following in my

    <!-- No servlet-mapping - StaticFilter handles forwarding to "faces"
servlet when no static files found -->


Links are rendered as /dwr/foo.xhtml instead of /foo.html.  Is this a known
issue?  Is there a better way to do what I'm trying to do (without using a
different extension)?



package org.appfuse.webapp.filter;

import org.apache.commons.lang.StringUtils;
import org.springframework.util.PatternMatchUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.UrlPathHelper;

import javax.servlet.FilterChain;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Iterator;
import java.util.Set;

 * A simple filter that allows the application to continue using the .html
prefix for actions but also allows
 * static files to be served up with the same extension. Dojo to serve up
its HTML template code. The filter works
 * on an include/exclude basis where all requests for active pages are
redirected by the filter to thee dispatch
 * servlet. All Dojo related .html requests are allowed to pass straight
through to be processed by the servlet
 * container as per normal.
public class StaticFilter extends OncePerRequestFilter {
    private final static String DEFAULT_INCLUDES = "*.html";
    private final static String DEFAULT_EXCLUDES = "";
    private static final String INCLUDES_PARAMETER = "includes";
    private static final String EXCLUDES_PARAMETER = "excludes";
    private static final String SERVLETNAME_PARAMETER = "servletName";
    private String[] excludes;
    private String[] includes;
    private String servletName = null;
     * Read the includes/excludes paramters and set the filter accordingly.
    public void initFilterBean() {
        String includesParam =
        if (StringUtils.isEmpty(includesParam)) {
            includes = parsePatterns(DEFAULT_INCLUDES);
        } else {
            includes = parsePatterns(includesParam);

        String excludesParam =
        if (StringUtils.isEmpty(excludesParam)) {
            excludes = parsePatterns(DEFAULT_EXCLUDES);
        } else {
            excludes = parsePatterns(excludesParam);
        // if servletName is specified, set it
        servletName =

    private String[] parsePatterns(String delimitedPatterns) {
        //make sure no patterns are repeated.
        Set patternSet =
        String[] patterns = new String[patternSet.size()];
        int i = 0;
        for (Iterator iterator = patternSet.iterator(); iterator.hasNext();
i++) {
            //no trailing/leading white space.
            String pattern = (String);
            patterns[i] = pattern.trim();
        return patterns;

     * This method checks to see if the current path matches includes or
excludes. If it matches includes and
     * not excludes, it forwards to the static resource and ends the filter
chain. Otherwise, it forwards to the
     * next filter in the chain.
     * @param request the current request
     * @param response the current response
     * @param chain the filter chain
     * @throws IOException
     * @throws ServletException
    public void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
                                 FilterChain chain) throws IOException,
ServletException {

        UrlPathHelper urlPathHelper = new UrlPathHelper();
        String path = urlPathHelper.getPathWithinApplication(request);
        boolean pathExcluded = PatternMatchUtils.simpleMatch(excludes,
        boolean pathIncluded = PatternMatchUtils.simpleMatch(includes,

        if (pathIncluded && !pathExcluded) {
            if (logger.isDebugEnabled()) {
                logger.debug("Forwarding to static resource: " + path);

            RequestDispatcher rd =
            rd.forward(request, response);

        if (servletName != null) {
            RequestDispatcher rd =
            rd.forward(request, response);
        chain.doFilter(request, response);
View this message in context:
Sent from the MyFaces - Users mailing list archive at

View raw message