myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mraible <m...@raibledesigns.com>
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
web.xml:

    <!-- No servlet-mapping - StaticFilter handles forwarding to "faces"
servlet when no static files found -->
    <!--servlet-mapping>
        <servlet-name>faces</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping-->

    <servlet-mapping>
        <servlet-name>dwr-invoker</servlet-name>
        <url-pattern>/dwr/*</url-pattern>
    </servlet-mapping>

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)?

Thanks,

Matt

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.io.IOException;
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 =
getFilterConfig().getInitParameter(INCLUDES_PARAMETER);
        if (StringUtils.isEmpty(includesParam)) {
            includes = parsePatterns(DEFAULT_INCLUDES);
        } else {
            includes = parsePatterns(includesParam);
        }

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

    private String[] parsePatterns(String delimitedPatterns) {
        //make sure no patterns are repeated.
        Set patternSet =
org.springframework.util.StringUtils.commaDelimitedListToSet(delimitedPatterns);
        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) iterator.next();
            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,
path);
        boolean pathIncluded = PatternMatchUtils.simpleMatch(includes,
path);

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

            RequestDispatcher rd =
getServletContext().getRequestDispatcher(path);
            rd.forward(request, response);
            return;
        }

        if (servletName != null) {
            RequestDispatcher rd =
getServletContext().getNamedDispatcher(servletName);
            rd.forward(request, response);
            return;
        }
        
        chain.doFilter(request, response);
    }
}
-- 
View this message in context: http://www.nabble.com/Using-a-StaticFilter-and-dispatching-to-FacesServlet-doesn%27t-work-tf3450338.html#a9623982
Sent from the MyFaces - Users mailing list archive at Nabble.com.


Mime
View raw message