Matt,
I have attached a simple filter class which works well with Spring MVC. The
basic operation works on the following principles:
1) The servlet container retains responsibility for serving all static
resources. This ensures optimum performance (resources can be cached, have
their timestamps checked for updates, etc) and avoids any I/O nasties that
might arise if the filter itself tries to read and serve up these resources.
2) The filter redirects any requests for active pages to the relevant
processing chain, which includes all filters related to active content, e.g.
Hibernate filter. This helps ensure that the minimum number of filters are
applied to static content.
3) The filter requires reasonably sophisticated pattern matching abilities
to sort active from static page requests. This implies the use of an
excludes filter on top of the normal include filter provided by default as
part of the servlet standard.
The attached implementation is Spring MVC specific. Any request that the
filter believes matches an active page are redirected to the dispatch
servlet by name. All other requests are allowed to pass straight through for
normal processing by the servlet container. The solution also relies on the
use of the <dispatcher> filter configuration element available as of the
servlet 2.4 spec to separate filtering on active page requests from those
for static content, which leads me to believe the solution could be made to
work for the other web frameworks.
Let me know what you think.
Mike.
On 1/29/07, mraible <[EMAIL PROTECTED]> wrote:
Any update on this Mike? It looks like most folks would prefer to stick
with
*.html (as would I).
http://appfuse.org/pages/viewpage.action?pageId=495
Thanks,
Matt
Matt Raible-3 wrote:
>
> On 1/17/07, Michael Horwitz <[EMAIL PROTECTED]> wrote:
>> Matt,
>>
>> I have successfully used Dojo with SpringMVC while still keeping the
>> .html
>> extension by using a filter to redirect any non-dojo requests to the
>> Spring
>> servlet. This approach has two nice side effects: 1) the servlet
>> container
>> can use its default handling for all static content and 2) one can
reduce
>> the number of filters that get applied to such content.
>>
>> If people are interested I would be more than happy to share the
>> solution.
>
> I'd definitely be interested in this and having folks test it with
> Struts 2. It might be best to post it here, as well as in JIRA
> (http://issues.appfuse.org/browse/APF-431).
>
> Matt
>
>>
>> Mike.
>>
>>
>> On 1/17/07, Matt Raible <[EMAIL PROTECTED]> wrote:
>> > I've created a poll so everyone can vote on their favorite extension.
>> >
>> > http://appfuse.org/pages/viewpage.action?pageId=495
>> >
>> > You'll need to create an account and login to vote. To do this, go to
>> > View > Account > Sign Up (or login if you already have an account).
>> >
>> > Thanks!
>> >
>> > Matt
>> >
>> > On 1/16/07, Sanjiv Jivan <[EMAIL PROTECTED]> wrote:
>> > > I like .html but the problem I've faced with using this extension
is
>> that
>> > > serving static html file with the .html file extension (like
>> documentation,
>> > > Dojo templates or FckEditor files) becomes very hard to map to not
go
>> to
>> the
>> > > applications MVC controller. I've spent countless number of hours
>> messing
>> > > with the url-pattern in web.xml without much success.
>> > >
>> > > So I usually use .htm for the application extension.
>> > >
>> > > Sanjiv
>> > >
>> > >
>> > > On 9/20/06, Matt Raible < [EMAIL PROTECTED]> wrote:
>> > > >
>> > > > Dear AppFuse users,
>> > > >
>> > > > As many of you likely know, there are a couple of issues with
using
>> > > > the *.html extension with some frameworks in AppFuse. For
example,
>> > > > with WebWork - it loads Dojo template files from a *.html
>> extension.
>> > > > If you want to use Dojo with WebWork, you have to modify your
>> default
>> > > > extension.
>> > > >
>> > > > http://issues.appfuse.org/browse/APF-431
>> > > >
>> > > > Because of this, we're starting to look at other extensions. I'd
>> > > > rather use one for all frameworks, rather than the recommended
ones
>> > > > for each framework b/c it allows us to have one security.xmlfiles,
>> > > > rather than one for each framework. Another option is to use
>> > > > path-based mapping, for example:
>> > > >
>> > > > http://localhost:8080/yourapp/go/users
>> > > >
>> > > > Where "/go/*" is the path that front-controller servlet/filters
are
>> > > > mapped to. The only problem with this is stat trackers typically
>> like
>> > > > to track extensions, and so we'd be unfriendly to those companies
>> who
>> > > > like to watch their stats.
>> > > >
>> > > > Here's a couple thoughts - feel free to add your own suggestions
>> and
>> > > thoughts:
>> > > >
>> > > > 1. *.htm
>> > > > 2. *.aspx
>> > > > 3. *.php
>> > > > 4. *.app
>> > > > 5. *.a
>> > > > 6. *.o
>> > > > 7. *.apf (would help us track AppFuse-based applications, but
it's
>> a
>> > > > pretty ugly extension)
>> > > > 8. *.em
>> > > > 9. *.fun
>> > > > 10. *.page
>> > > >
>> > > > I still like *.html the best b/c it doesn't give away the
>> underlying
>> > > > technology, so *.htm seems like the best option after that. But
of
>> > > > course, I'm open to suggestions. ;-)
>> > > >
>> > > > Matt
>> > > >
>> > > >
>> > >
>> ---------------------------------------------------------------------
>> > > > To unsubscribe, e-mail:
>> > > [EMAIL PROTECTED]
>> > > > For additional commands, e-mail: [EMAIL PROTECTED]
>> > > >
>> > > >
>> > >
>> > >
>> >
>> >
>> > --
>> > http://raibledesigns.com
>> >
>> >
>> ---------------------------------------------------------------------
>> > To unsubscribe, e-mail:
>> [EMAIL PROTECTED]
>> > For additional commands, e-mail: [EMAIL PROTECTED]
>> >
>> >
>>
>>
>
>
> --
> http://raibledesigns.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
--
View this message in context:
http://www.nabble.com/Changing-default-extension-from-*.html-to-*.---tf2307780s2369.html#a8699069
Sent from the AppFuse - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
package org.appfuse.webapp.filter;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.PatternMatchUtils;
import org.springframework.web.util.UrlPathHelper;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
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 active
* pages but still allows 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
* the 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 DojoFilter implements Filter {
private static Log log = LogFactory.getLog(DojoFilter.class);
private final static String DEFAULT_INCLUDES = "*.html";
private final static String DEFAULT_EXCLUDES = "";
public static final String INCLUDES_PARAMETER="includes";
public static final String EXCLUDES_PARAMETER="excludes";
public static final String ACTION_SERVLET_NAME_PARAMETER="action_servlet_name";
public static final String _REQUEST_PARSED =
"org.appfuse.webapp.request.parsed";
private String[] excludes;
private String[] includes;
private String actionServletName = "action";
private RequestDispatcher actionServletRequestDispatcher;
/**
* Read the includes/excludes paramters and set the filter accordingly.
*/
public void init(FilterConfig filterConfig)
{
String includesParam = filterConfig.getInitParameter(INCLUDES_PARAMETER);
if (StringUtils.isEmpty(includesParam))
{
includes = parsePatterns(DEFAULT_INCLUDES);
}
else
{
includes = parsePatterns(includesParam);
}
String excludesParam = filterConfig.getInitParameter(EXCLUDES_PARAMETER);
if (StringUtils.isEmpty(excludesParam))
{
excludes = parsePatterns(DEFAULT_EXCLUDES);
}
else
{
excludes = parsePatterns(excludesParam);
}
String actionServletNameParam =
filterConfig.getInitParameter(ACTION_SERVLET_NAME_PARAMETER);
if (StringUtils.isNotEmpty(actionServletNameParam))
{
actionServletName = actionServletNameParam;
}
ServletContext servletContext = filterConfig.getServletContext();
actionServletRequestDispatcher =
servletContext.getNamedDispatcher(actionServletName);
if (actionServletRequestDispatcher == null)
{
log.error("No action servlet named [" + actionServletName + "] could be
found. Please check configuration in web.xml.");
throw new RuntimeException("Could not instantiate dojo filter: no valid
action servlet specified, or action servlet not found.");
}
}
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;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (request.getAttribute(_REQUEST_PARSED) != null)
{
chain.doFilter(request, response);
return;
}
final HttpServletRequest req = (HttpServletRequest) request;
final HttpServletResponse res = (HttpServletResponse) response;
UrlPathHelper urlPathHelper = new UrlPathHelper();
String path = urlPathHelper.getPathWithinApplication(req);
boolean pathExcluded = PatternMatchUtils.simpleMatch(excludes, path);
boolean pathIncluded = PatternMatchUtils.simpleMatch(includes, path);
if (pathIncluded && ! pathExcluded)
{
// req.setAttribute(_REQUEST_PARSED, Boolean.TRUE);
actionServletRequestDispatcher.forward(req, res);
return;
}
chain.doFilter(req, res);
}
public void destroy() {
actionServletRequestDispatcher = null;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]