Thursday, January 13, 2011

Difference between Struts 1.x and Struts 2.x

Difference between Struts 1.x and Struts 2.x

1) Action classes
Struts1 extends the abstract base class by its action class. 
The problem with struts1 is that it uses the abstract classes rather than interfaces.    

While in Struts 2 an Action class implements an Action interface along with other interfaces use optional and custom services. 
Struts 2 provides a base ActionSupport class that implements commonly used interfaces. Although an Action interface is 
not necessary any POJO object along with an execute signature can be used as a Struts 2 Action object.

2) Threading Model
Struts 1 Actions are singletons therefore they must be thread-safe because only one instance of a class 
handles all the requests for that Action. The singleton strategy restricts to Struts 1 Actions and requires extra 
care to make the action resources thread safe or synchronized while developing an application.  

Struts 2 doesn't have thread-safety issues as Action objects are instantiated for each request. A servlet 
container generates many throw-away objects per request and one more object does not impose a performance penalty or 
impact garbage collection.


3) Servlet Dependency    
Actions are dependent on the servlet API because HttpServletRequest and HttpServletResponse is passed to 
the execute method when an Action is invoked therefore Struts1.    

Container does not treat the Struts 2 Actions as a couple. Servlet contexts are typically represented 
as simple Maps that allow Actions to be tested in isolation. Struts 2 Actions can still access the original request and 
response if required. While other architectural elements directly reduce or eliminate the need to access the 
HttpServetRequest or HttpServletResponse.


4) Testability 
Struts1 application has a major problem while testing the application because the execute method exposes 
the Servlet API. Struts TestCase provides a set of mock object for Struts 1.    

To test the Struts 2 Actions instantiate the Action set the properties and invoking methods. 
Dependency Injection also makes testing easier.

5) Harvesting Input    
Struts 1 recieves an input by creating an ActionForm object. Like the action classes all ActionForms class 
must extend a ActionForm base class. Other JavaBeans classes cannot be used as ActionForms while developers 
create redundant classes to receive the input. DynaBeans is the best alternative to create the conventional 
ActionForm classes.

Struts 2 requires Action properties as input properties that eliminates the need of a second input object. 
These Input properties may be rich object types since they may have their own properties. Developer can access 
the Action properties from the web page using the taglibs. 
Struts 2 also supports the ActionForm pattern POJO form objects and POJO Actions as well.

6) Expression Language
Struts1 integrates with JSTL so it uses the JSTL EL. The EL has basic object graph traversal but 
relatively weak collection and indexed property support.    

Struts 2 can use JSTL but the framework also supports a more powerful and flexible expression language 
called "Object Graph Notation Language" (OGNL).

7) Binding values into views
Struts 1 binds object into the page context by using the standard JSP mechanism.   

Struts 2 uses a ValueStack technology to make the values accessible to the taglibs without coupling 
the view to the object to which it is rendering. The ValueStack strategy enables us to reuse views across a 
range of types having same property name but different property types.

8) Type Conversion
Struts 1 ActionForm properties are almost in the form of Strings. Commons-Beanutils are used by used by Struts 1 
for type conversion. Converters are per-class which are not configurable per instance.    

Struts 2 uses OGNL for type conversion and converters to convert Basic and common object types and primitives as well.

9) Validation
Struts 1 uses manual validation that is done via a validate method on the ActionForm or by using an extension 
to the Commons Validator. Classes can have different validation contexts for the same class while 
chaining to validations on sub-objects is not allowed.


Struts 2 allows manual validation that is done by using the validate method and the XWork Validation framework. 
The Xwork Validation Framework allows chaining of validations into sub-properties using the validations defined for 
the properties class type and the validation context.

10) Control Of Action Execution
Each module in Struts 1 has a separate Request Processors (lifecycles) while all the Actions in the module must 
share the same lifecycle.

In Struts 2 different lifecycles are created on a per Action basis via Interceptor Stacks. 
Custom stacks are created and used with different Actions as



In the following section, we are going to compare the various features between the two frameworks. 
Struts 2.x  is very simple as compared to struts 1.x,  few of its excellent features are:

1.  Servlet Dependency:
Actions in Struts1 have dependencies on the servlet API since the HttpServletRequest and HttpServletResponse 
objects are passed to the execute method when an Action is invoked but in case of Struts 2, Actions are not 
container dependent because they are made simple POJOs. In struts 2, the servlet contexts are represented as 
simple Maps which allows actions to be tested in isolation. Struts 2 Actions can access the original request 
and response, if required. However, other architectural elements reduce or eliminate the need to access the 
HttpServetRequest or HttpServletResponse directly.

2.  Action classes
Programming the abstract classes instead of interfaces is one of design issues of struts1 framework that 
has been resolved in the struts 2 framework. 
Struts1 Action classes needs to extend framework dependent abstract base class. But in case of Struts 2 
Action class may or may not implement interfaces to enable optional and custom services. In case of Struts 2, 
Actions are not container dependent because they are made simple POJOs. Struts 2 provides a base ActionSupport 
class to implement commonly used interfaces. Albeit, the Action interface is not required. Any POJO object with 
an execute signature can be used as an Struts 2 Action object.

3.  Validation
Struts1 and Struts 2 both supports the manual validation via a validate method.
Struts1 uses validate method on the ActionForm, or validates through an extension to the Commons Validator. 
However, Struts 2 supports manual validation via the validate method and the XWork Validation framework. 
The Xwork Validation Framework supports chaining validation into sub-properties using the validations defined for the 
properties class type and the validation context.

4.  Threading Model
In Struts1, Action resources must be thread-safe or synchronized. So Actions are singletons and thread-safe, 
there should only be one instance of a class to handle all requests for that Action. The singleton strategy places
restrictions on what can be done with Struts1 Actions and requires extra care to develop. However in case of Struts 2,
Action objects are instantiated for each request, so there are no thread-safety issues. (In practice, servlet containers 
generate many throw-away objects per request, and one more object does not impose a performance penalty or impact 
garbage collection.)

5.  Testability
Testing Struts1 applications are a bit complex. A major hurdle to test Struts1 Actions is that the execute method 
because it exposes the Servlet API. A third-party extension, Struts TestCase, offers a set of mock object for Struts1. 
But the Struts 2 Actions can be tested by instantiating the Action, setting properties and invoking methods. Dependency 
Injection support also makes testing simpler. Actions in struts2 are simple POJOs and are framework independent,  hence 
testability is quite easy in struts2.

6.  Harvesting Input
Struts1 uses an ActionForm object to capture input. And all ActionForms needs to extend a framework dependent 
base class. JavaBeans cannot be used as ActionForms, so the developers have to create redundant classes to capture input. 
However Struts 2 uses Action properties (as input properties independent of underlying framework) that 
eliminates the need for a second input object, hence reduces redundancy. Additionally in struts2, Action 
properties can be accessed from the web page via the taglibs. Struts 2 also supports the ActionForm pattern, 
as well as POJO form objects and POJO Actions. Even rich object types, including business or domain objects, 
can be used as input/output objects.

7.  Expression Language
Struts1 integrates with JSTL, so it uses the JSTL-EL. The struts1 EL has basic object graph traversal, but 
relatively weak collection and indexed property support. Struts 2 can also use JSTL, however it supports a more 
powerful and flexible expression language called "Object Graph Notation Language" (OGNL).

8.  Binding values into views
In the view section, Struts1 uses the standard JSP mechanism to bind objects (processed from the model section) 
into the page context to access. However Struts 2 uses a "ValueStack" technology so that the taglibs
can access values without coupling your view to the object type it is rendering. The ValueStack strategy allows 
the reuse of views across a range of types which may have the same property name but different property types.

9.  Type Conversion
Usually, Struts1 ActionForm properties are all Strings. Struts1 uses Commons-Beanutils for type conversion. 
These type converters are per-class and not configurable per instance. However Struts 2 uses OGNL for type 
conversion. The framework includes converters for basic and common object types and primitives.

10.  Control of Action Execution
Struts1 supports separate Request Processor (lifecycles) for each module, but all the Actions in a 
module must share the same lifecycle. However Struts 2 supports creating different lifecycles on a per 
Action basis via Interceptor Stacks. Custom stacks can be created and used with different Actions as needed.

No comments:

Post a Comment