Struts-Spring integration part-2

As discussed in last post,there are two ways to configuring spring in struts.
1. Using org.springframework.web.struts.ActionSupportAction class.
2. Using org.springframework.web.struts.DelegatingActionProxy.
We discussed first one in last post.
Lets check second method:-
2. Using org.springframework.web.struts.DelegatingActionProxy.
DelegatingActionProxy is a proxy class for appropriate Action.
Here we extends strut’s Action class to write action class.
But we dont mention this action class in struts-config.xml file.
Instead of our action class we use DelegatingActionProxy.
Follwing steps are required to configure ActionSupport:-
1. Modify struts-config.xml to load spring’s context loder plugin.
Add following entries in struts-xml

1. Using org.springframework.web.struts.ActionSupportAction class.

2. Using org.springframework.web.struts.DelegatingActionProxy.

We discussed first one in last post.

Lets check second method:-

2. Using org.springframework.web.struts.DelegatingActionProxy.
DelegatingActionProxy is a proxy class for appropriate Action.
Here we extends strut’s Action class to write action class.
But we dont mention this action class in struts-config.xml file.
Instead of our action class we use DelegatingActionProxy.
Follwing steps are required to configure ActionSupport:-
1. Modify struts-config.xml to load spring’s context loder plugin.
Add following entries in struts-config.xml

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/ApplicationContext.xml"/>
</plug-in>

Here we are defining the context file to read. This plugging in loaded when server starts and it  reads the configuration file(here its placed at /WEB-INF/ApplicationContext.xml).
2. Modify struts-config.xml file and change action mapping as:-

<action
path="/loginAction"
type="org.springframework.web.struts.DelegatingActionProxy"
name="loginForm"
scope="request"
validate="true"
input="/WEB-INF/pages/login.jsp">
<forward name="success" path="/homePage.do"/>
<forward name="failure" path="/login.do"/>
</action>

Here we are using DelegatingActionProxy instead of LoginAction. All requests goes to DelegatingActionProxy it is the responsibility of this class to call appropriate action class.
2. Define bean definitions in WEB-INF/ApplicationContext.xml.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="businessDelegateBean" class="my.login.action.BusinessDelegate">
</bean>
<bean name="/loginAction" class="my.login.action.LoginAction">
<property name="businessDelegate">
<ref bean="businessDelegateBean"/>
</property>
</bean>
</beans>

Here i defined a bean with id “businessDelegateBean” and map url pattern to actual action class. DelegatingActionProxy class read this file and see that /loginAction is mapped to LoginAction and it forward request to LoginAction, before that it inject businessDelegate.
3. Define BusinessDelegate class.

package my.login.action;
public class BusinessDelegate {
public String validateUser(String userName, String password) {
if(userName.equals("vivek") && password.equals("kumar")) {
return "success";
}
return "failure";
}
}

4. Modify action class.

package my.login.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import my.login.form.LoginForm;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.web.struts.ActionSupport;
public class LoginAction extends ActionSupport {
private BusinessDelegate businessDelegate;
public BusinessDelegate getBusinessDelegate() {
return businessDelegate;
}
public void setBusinessDelegate(BusinessDelegate businessDelegate) {
this.businessDelegate = businessDelegate;
}
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
LoginForm loginForm =(LoginForm) form;
String target = businessDelegate.validateUser(loginForm.getUserName(),
loginForm.getPassword());
if("failure".equalsIgnoreCase(target))
{
ActionErrors  errors = new ActionErrors();
errors.add("loginError", new ActionError("login.failure.message"));
saveErrors(request,errors);
}
return mapping.findForward(target);
}
}

Here we have extended Action class instead of ActionSupport as done in 1st part. Another point is that we no loger use getWebApplicationContext and ApplicationContext. Its responsibility of spring’s bean container to inject businessDelegate before calling execute method.
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s