Here's the code - enjoy. I wrote a different one for PathRequestFilter
(i.e. /do/*), but this one should work for both - my local versions have a
lot of extra logic in it - so I trimmed that. This is untested and I don't
even know if it'll compile. I'll be adding to my appfuse project shortly,
so I'll know in the next week or two.
Here's the settings in web.xml:
<filter>
<filter-name>requestFilter</filter-name>
<display-name>Request Filter</display-name>
<filter-class>org.appfuse.webapp.filter.ExtensionRequestFilter</filter-class
>
<init-param>
<param-name>allowedExtensions</param-name>
<param-value>.html,.asp,.cfm</param-value>
</init-param>
<init-param>
<param-name>ignorePaths</param-name>
<param-value>/images,/includes</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>requestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
ExtensionRequestFilter.java ------------------------
/**
* This class is used to filter all requests and to determine
* if a request should forward to an Action.
*
* @author Matt Raible
* @version $Revision: 1.2 $ $Date: 2003/09/29 15:28:41 $
*/
public class ExtensionRequestFilter implements Filter {
//~ Static fields/initializers
=============================================
private static String[] allowedExtensions = null;
private static String[] ignorePaths = null;
//~ Instance fields
========================================================
/**
* The <code>Log</code> instance for this class
*/
private Log log = LogFactory.getLog(ExtensionRequestFilter.class);
private FilterConfig config = null;
//~ Methods
================================================================
public void init(FilterConfig config) throws ServletException {
this.config = config;
allowedExtensions =
StringUtils.split(config.getInitParameter("allowedExtensions"),
",");
ignorePaths =
StringUtils.split(config.getInitParameter("ignorePaths"), ",");
}
/**
* Destroys the filter.
*/
public void destroy() {
config = null;
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain)
throws IOException, ServletException {
// cast to the types I want to use
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// flag to attempt to process this URL
boolean process = true;
// get the requested path
String path = request.getServletPath();
// we don't care to check the ignoredPaths
for (int j = 0; j < ignorePaths.length; j++) {
if (path.startsWith(ignorePaths[j])) {
process = false;
break;
}
}
if (process && !StringUtils.equals(path, "/") &&
!StringUtils.equals(path, "")) {
// get Struts' configuration
ModuleConfig m = getModuleConfig(request);
// get a list of actions
ActionConfig[] actions = m.findActionConfigs();
// check to see if path ends with a vanity extension
for (int j = 0; j < allowedExtensions.length; j++) {
if (path.endsWith(allowedExtensions[j])) {
path =
path.substring(0,
path.indexOf(allowedExtensions[j]));
break;
}
}
String params = RequestUtil.getRequestParameters(request);
StringBuffer url = new StringBuffer();
// check all the actions to see if we have a match
for (int i = 0; i < actions.length; i++) {
ActionConfig action = actions[i];
String actionPath = action.getPath();
if (StringUtils.equalsIgnoreCase(actionPath, path)) {
url.append(actionPath + ".html");
url.append((!StringUtils.isEmpty(params)) ? ("?" +
params)
: "");
log.debug("requesting action: " + actionPath);
RequestDispatcher dispatcher =
request.getRequestDispatcher(url.toString());
dispatcher.forward(request, response);
return;
}
}
}
chain.doFilter(request, response);
}
/**
* Return the module configuration object for the currently selected
* module. MR - Copied from Struts' ActionServlet
*
* @param request The servlet request we are processing
* @since Struts 1.1
*/
protected ModuleConfig getModuleConfig(HttpServletRequest request) {
ModuleConfig mConfig =
(ModuleConfig) request.getAttribute(Globals.MODULE_KEY);
if (mConfig == null) {
mConfig =
(ModuleConfig)
config.getServletContext().getAttribute(Globals.MODULE_KEY);
}
return mConfig;
}
}
-----Original Message-----
From: Dirk Behrendt [mailto:[EMAIL PROTECTED]
Sent: Monday, September 29, 2003 11:59 AM
To: [EMAIL PROTECTED]
Subject: Change the ".do" extension
Hello Matt!
That sounds good.
But can you give full code examples (web.xml, other necessary codes)? I
do not know, how to realize it.
Dirk
From: Matt Raible <[EMAIL PROTECTED]>
Subject: Change the ".do" extension
Date: Mon, 29 Sep 2003 09:27:05 -0500
Content-Type: text/plain;
charset="iso-8859-1"
Yes this is possible. I use a filter mapped to /* and perform logic to
lookup all the actions and attempt a match, then forward to the action
if
it's found.
http://www.raibledesigns.com/page/rd?anchor=vanity_urls_in_struts
HTH,
Matt
-----Original Message-----
From: Dirk Behrendt [mailto:[EMAIL PROTECTED]
Sent: Monday, September 29, 2003 8:09 AM
To: [EMAIL PROTECTED]
Subject: Change the ".do" extension
Hello!
Is there a possibility to get rid of the .do extension in the actions?
For example:
http://localhost/login.do
should be
--> http://localhost/login
Ist this possible?
Thanks!
Dirk
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]