This is because struts don't have a protocol of these steps. The action-mapping only extracts what the next step is. This problem is as old as struts is and it has been discussed in all struts user lists. In 2003 I wrote an article and offered a little source code to solve this problem (see http://www.manfred-wolff.de/struts/articles-old/HowTo-Back.html). After that I got 70 visits per month on my homepage - only from people which were interested in this feature. So in 2006 I did a refactoring and made a sourceforge project of this solution. Now it is possible for anyone to download the code and an example application and everybody can offer patches for the solution.

The first solution tracks all
*.do
pathes and stores it into a ringbuffer. If the buffer is full, the first entry will be overwritten. So a first struts best practice is forced: Every request must pass the
RequestProcessor
. The second solution can be parameterize with a pattern, so that only a certain pathes will be saved, e.g. only pathes to actions, that are connected to a JSP-site.

Abbildung 1: Concept of PreActions

Just have a look to figure 1. Every step to a jsp will be directed through a
Pre*Action
class. So a back has only to keep in mind of those actions. A back from the menu is directed to the
PreEditPersonAction
. If all links are created in such a way the back solution has only keep in mind for request-parameter and not for request attributes, because a back isn't really a back but a "forward into the past".

The new solution is really easy to configure. First you have to add two entries in the
struts-config.xml