« Return to Thread: Using a StaticFilter and dispatching to FacesServlet doesn't work
In my web application, I prefer to have FacesServlet mapped to *.html. Thishas worked fine for me for the last couple of years. Recently, I've tried toadd a StaticFilter that looks for static files (i.e. /content/faq.html) anddispatches to those if they're found. If they're not found, I dispatch tothe FacesServlet, which doesn't have a <servlet-mapping> in web.xml. Thisall works great, except that <h:commandLink> seems to need the servletmapping in order to create its links. If I have the following in myweb.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 knownissue? Is there a better way to do what I'm trying to do (without using adifferent extension)?Thanks,Mattpackage 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 .htmlprefix for actions but also allows* static files to be served up with the same extension. Dojo to serve upits HTML template code. The filter works* on an include/exclude basis where all requests for active pages areredirected by the filter to thee dispatch* servlet. All Dojo related .html requests are allowed to pass straightthrough 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 itservletName =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 orexcludes. If it matches includes and* not excludes, it forwards to the static resource and ends the filterchain. 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#a9623982Sent from the MyFaces - Users mailing list archive at Nabble.com.
« Return to Thread: Using a StaticFilter and dispatching to FacesServlet doesn't work
| Free embeddable forum powered by Nabble | Forum Help |