The other folks have already pointed out several of the big improvements found in Struts 2, like POJO actions and decoupling of actions from Servlet API.
I would add that, in general, the entire framework demonstrates a cleaner architecture. Struts 2 is a very good case study in software engineering principles. All of the components in Struts 2 are cleanly separated from each other allowing, among many other things, easy testing of all framework components.
You can customize and add your own versions of all framework components with very little effort. For instance, the UI Component tags that come bundled with Struts 2 can be customized easily and cleanly. If you need the oupput of the bundled form tag to be in a different format or use different styling, you can easily customize the component to do what you need. The same holds true for even core components like the ObjectFactory that instantiates the actions and interceptors. The Spring plugin takes advantage of this to override the core objectfactory with one that looks for spring beans when its trying to come up with a given framework component.
So, I would say that a clean, highly flexible architecture is the hallmark of the new struts
Chad Davis<br />Co-author of Struts 2 in Action
I’ve looked at a lot of different solutions, and in my humble opinion Aspose is the way to go. Here’s the link: http://aspose.com