Struts to spring migration
Step 1: Replace struts libraries with spring libraries.
Firstly while migrating from struts to spring we have to replace our struts related libraries with spring libraries in lib folder. I have mentioned basic libraries of both struts and spring for your clarification.
Struts basic libraries :
1. struts.jar
2. struts-legacy.jar
etc..
Spring basic libraries :
1. standard.jar
2. org.springframework.asm-4.0.1.RELEASE-A.jar
3. org.springframework.beans-4.0.1.RELEASE-A.jar
4. org.springframework.context-4.0.1.RELEASE-A.jar
5. org.springframework.core-4.0.1.RELEASE-A.jar
6. org.springframework.expression-4.0.1.RELEASE-A.jar
7. org.springframework.web.servlet-4.0.1.RELEASE-A.jar
8. org.springframework.web-4.0.1.RELEASE-A.jar
etc..
Step 2: Change made to web.xml file for struts to spring migration
In this step we have to remove Action filter dispatcher for the web.xml and add Spring dipatcher servlet as Front controller
In Strut application web.xml look like as follows
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Struts2MyFirstApp</display-name> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter>
<filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>Login.jsp</welcome-file> </welcome-file-list> </web-app>
In Spring application web.xml look like as follows
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>springApp</display-name> <servlet> <servlet-name>springApp</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springApp</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
Step 3: Replace config files for struts to spring migration
Now replace all struts configuration files to spring configuration file as follows
In Struts applivation struts configuration file-
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="false" /> <constant name="struts.custom.i18n.resources" value="myapp" /> <package name="default" extends="struts-default" namespace="/"> <action name="login" class="com.dineshonjava.struts2.login.LoginAction"> <result name="success">Welcome.jsp</result> <result name="error">Login.jsp</result> </action> </package> </struts>
In Spring application spring configuration file as follows
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <context:component-scan base-package="com.dineshonjava.spring.login.controller" /> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> </beans>
Here, <context:component-scan> tag is used, so that spring will load all the components from given package i.e. “com.dineshonjava.spring.login.controller“
We can use different view resolver, here I have used InternalResourceViewResolver. In which prefix and suffix are used to resolve the view by prefixing and suffixing values to the object returned by ModelAndView in action class.
Step 4: JSP changes for struts to spring migration
While migration an application from struts to spring we need to change in jsp file as following
Firstly replace all tlds-
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %> <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
Replace these with following spring taglib’s :
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
In Struts :
<html:form action="/addLogin" method="post">
In Spring :
<form:form method="POST" commandName="loginForm" name="loginForm" action="login.do">
Here commandName is going to map with corresponding formbean for that jsp. Next we will see, how action is getting called with spring 4 annotations.
Step 5: Action class changes for struts to spring migration
Now following changes need to be done in action classes for struts to spring migration using annotations-
Struts Action:
package com.dineshonjava.struts2.login; import com.opensymphony.xwork2.ActionSupport; /** * @author Dinesh Rajput * */ @SuppressWarnings("serial") public class LoginAction extends ActionSupport{ private String username; private String password; public String execute() { if (this.username.equals("dinesh") && this.password.equals("sweety")) { return "success"; } else { addActionError(getText("error.login")); return "error"; } } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
Spring action
package com.dineshonjava.spring.login.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * @author Dinesh.Rajput * */ @Controller public class LoginController { @RequestMapping(value="/login.do", method = RequestMethod.GET) public String doLogin(ModelMap model, LoginForm loginForn) { if (this.username.equals("dinesh") && this.password.equals("sweety")) { model.addAttribute("message", "Login Success"); } else { model.addAttribute("message", "Login Failure"); } return "home"; } }
Step 6: Validation changes for struts to spring migration
in struts JSP file validation changes as follows
<% ActionErrors actionErrors = (ActionErrors)request.getAttribute("org.apache.struts.action.ERROR"); %>
In Spring JSP file as follows-
<form:errors path="*" cssClass="error" />
very well explained
where is LoginForm class coming from that you have magically added to method signature, without any explanation? we need to guess?