struts-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jose L Martinez-Avial (JIRA)" <>
Subject [jira] [Commented] (WW-3849) Hability PrefixBasedActionMapper to exclude the prefix when retrieveing the ActionMapper
Date Thu, 12 Jul 2012 06:37:35 GMT


Jose L Martinez-Avial commented on WW-3849:

I would like to reuse the actions, excluding the prefix from the URI before calling the mapper.
So the uris /mypackage/myaction, /en/mypackage/myaction and /pt/mypackage/myaction would be
processed by the same action mapping.

The idea would be to provide a list of prefixes that need to be removed from the URI when
looking for the corresponding ActionMapping. Initially I thought that the best option was
using PrefixBaseActionMapper, but since it does not remove the prefix, I can not use it.

After some thinking, I ended extending the methods parseNameAndNamespace and getUriFromActionMapping
from DefaultActionMapper. The method parseNameAndNamespace  checks the uri agains the prefixes,
and removes the prefix if there is a match, and then calls the parent's method. Then the prefix
is saved in the request context:

	private String prefixes[] = new String[] { "/en", "/pt", "/es" };

	protected void parseNameAndNamespace(String uri, ActionMapping mapping, ConfigurationManager
configManager) {
		String actionPrefix = null;

		for (String prefix1 : prefixes) {
			if (uri.startsWith(prefix1)) {
				actionPrefix = prefix1;
				//LOG.debug("Removing preffix " + prefix1);
				uri = uri.substring(prefix1.length());
				//LOG.debug("New URI " + uri);
		if (actionPrefix != null) {
			HttpServletRequest request = ServletActionContext.getRequest();
			request.setAttribute(PREFFIX_ATTRIBUTE_NAME, actionPrefix);


On the method getUriFromActionMapping I retrieve the prefix from the request:

	public String getUriFromActionMapping(ActionMapping mapping) {
		String actionPrefix = "";
		HttpServletRequest request = ServletActionContext.getRequest();

		if (request.getAttribute(PREFFIX_ATTRIBUTE_NAME) != null)
			actionPrefix = (String) request.getAttribute(PREFFIX_ATTRIBUTE_NAME);

		StringBuilder uri = new StringBuilder(actionPrefix);

It works fine, but it seems a bit of a hack, so maybe there is a better way to do this.

> Hability PrefixBasedActionMapper to exclude the prefix when retrieveing the ActionMapper
> ----------------------------------------------------------------------------------------
>                 Key: WW-3849
>                 URL:
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Dispatch Filter
>    Affects Versions: 2.2.3
>            Reporter: Jose L Martinez-Avial
>             Fix For: 2.3.x
> The PrefixBasedActionMapper is able to map different actions to different mappers using
prefixes. So you can have something like this:
> /preffix1:mapper1,/preffix2:mapper2,:defaultMapper
> And the following URIs would be processed by different mappers
> /preffix1/mynamespace1/myaction1 (by mapper1)
> /preffix2/mynamespace1/myaction1 (by mapper2)
> /mynamespace1/myaction1  (by defaultMapper)
> So you can have three different ActionMappers, one per prefix. The problem with this
is that you can not reuse the same actions for different prefixes(ie, reuse an ActionMapper),
since the ActionMapper will try to match the full URI, without taking out the prefix. I suggest
to parametrize the PrefixBasedActionMapper to remove the preffix from the URI when calling
the ActionMapper, so the same mapper can be used more than once.

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:!default.jspa
For more information on JIRA, see:


View raw message