Archive for the ‘Struts2 Tips’ Category

Using Interceptors in Struts2

Thursday, January 24th, 2008

Interceptors are classes which implement com.opensymphony.xwork2.interceptor.Interceptor interface. Interceptors are configured in struts.xml. Interceptors are used for pre-processing and post-processing on Action invocations. Multiple interceptors can be applied to an action request.

Interceptor stack is a group of interceptors which can be referenced together. So instead of configuring a number of interceptors every time, we can just configure an interceptor stack with all the required interceptors in it.
Struts2 configures a default interceptor stack which handles all the generic functionalities required by action classes. These include Exception Interceptor, Validation Interceptor etc.

To demonstrate the use of interceptors, let us build an interceptor named “actiontimer” which will print the time required by an action request in milliseconds on the console. To ensure that time taken by default interceptors are not included, we will configure actiontimer as the last interceptor after default interceptor stack.

ActionTimer.java

struts.xml

interceptordemo.jsp

Creating a cascading application menu using Struts2 and YUI

Saturday, January 19th, 2008

Download Source | View Demo

Yahoo User Interface (YUI) library is a set of Javascript based client side components for building highly interactive Web applications. All the YUI components work on the client side data. It also has built in Ajax support.

By integrating YUI to your Struts2 application, you can create cutting edge Web 2.0 rich client applications. In this post, I will show you how the YUI Menu component can be used along with Struts2 to create a cascading application menu.

Struts2 - YUI - Cascading MenuBar Using JSON

Following are the components used in this sample project.

1. struts.xml - Struts2 action mappings.

2. web.xml - Configuration file for the sample web application

3. Menu.java - This encapsulates a Menu object. Can contain sub menus.

4. MenuDemoAction.java - Controller class for Menu demo. Contains code to populate sample Menu data. In real projects, you will populate this from database.

5. menudemo.jsp - This is a sample application screen with application menu at the top.

6. AppMenuTag.java - This is a custom tag library which renders a YUI based Menu bar.

7. menu.tld - The tag library configuration file inside WEB-INF folder.

In addition, this example uses the following css and JavaScript files provided as part of YUI. In real projects, these also must be part of your project.

8. http://yui.yahooapis.com/2.4.1/build/menu/assets/skins/sam/menu.css

9. http://yui.yahooapis.com/2.4.1/build/yahoo-dom-event/yahoo-dom-event.js
10. http://yui.yahooapis.com/2.4.1/build/container/container_core-min.js
11. http://yui.yahooapis.com/2.4.1/build/menu/menu-min.js
12. http://yui.yahooapis.com/2.4.1/build/json/json-beta-min.js

Now let us see how the code works.

When user accesses http://localhost:8080/struts2demo/MenuDemoAction.action, MenuDemoAction’s execute is invoked. This prepares the Menu data. A list of Menu objects is created. Each of this in turn can contain sub menus. After this control is passed to menudemo.jsp. In real applications, this will be fed from an XML file or from database tables.

menudemo.jsp contains AppMenuTag and it is invoked during JSP rendering. This converts the Menu object structure to a JSON structure using a YUI library. This JSON structure is given as input to the YUI menu control which renders the CSS based menu on the screen! Can it be any simpler? This whole project took me about 20 minutes to implement and test.

Now using similar techniques you can implement a wide range of controls available in YUI. These include tree, grid etc. which are frequently required in Web applications. YUI also contains utility functions such as a JSON library and methods for AJax interaction (YUI Connect).

Struts2 - Java on Rails?

Thursday, January 17th, 2008

Ruby on Rails is a Web application framework based on Ruby language. In many respects, Struts2 is very similar to Ruby on Rails but at the same time is better suited to large enterprise applications. Being J2EE based, Struts2 can leverage the entire Java API along with J2EE API such as EJBs for distributed processing.

Let us see if Struts2 compares to RoR when it comes to strong points of Ruby on Rails.

1. Minimal configuration - Like RoR, Struts2 requires minimal configuration. The both assume “intelligent defaults” for most of the configuration.

2. Automatic data transfer between controller and view - Struts2 achieves transparent data transfer between controller and view component using value stack concept. OGNL support in Struts2 makes it very simple!

3. ORM Mapping - Hibernate is an ideal open source tool that supports complex ORM mapping requirements. This can be easily used along with Struts2. In RoR, equivalent is the ActiveRecord. Another option for Java developers is the Spring DAO.

In addition to these, Struts2 has other very important features which makes it the ideal choice for any large scale Web application development. These are,

1. Talent Pool - A lot of Java talent is available in the job market. You cannot hire a 100 member RoR team in a day!

2. Scalability - J2EE has been evolving for almost 10 years now and offers pretty good scalability.

3. Out of the box portlet support - This is a must have for a large enterprise application composed of multiple Web applications.

4. Advanced Ajax support - The Dojo based Ajax support can be leveraged to create highly responsive Web applications.

5. Validation support - Client side and server side validations can be applied declaratively.

Pretty soon Struts2 will turn out to be “Java on Rails”…

Struts2 in production - beware of experimental features

Thursday, January 17th, 2008

Struts2 is a production quality Web framework. Many architects including me have been using it on many production Web systems across the world. But you need to be careful when using experimental features in Struts2 in a production system. They are undergoing rapid changes and when you upgrade, you might have to change your code!

For example, out of the box portlet support is one of the major experimental features. If your application is designed keeping the portal enviornment in mind (separate render and action requests) you can easily port your Struts2 application to portlet environment such as JetSpeed and JBoss portal. But portlet usage is different between 2.0.9 and 2.0.11 versions of Struts2! That means you will have to rework some of the code written in Struts 2.0.9 to get it working in 2.0.11.

Similar is the case with Ajax tags such as the Ajax div tag which uses Dojo. These are undergoing rapid changes and new attributes and behavior is added to these tags. So be prepared for some migration effort if you are using them in Struts 2.0.9/2.0.11 and want to move to Struts 2.1.

Main experimental features as of Struts 2.0.11 are cookie interceptor, portlet support, ajax theme, SEO friendly URL support and new plugins such as Tiles plugin. Hopefully most of these will stabilize by Struts 2.1 release.