Struts to Spring mvc migration

Hi in this tutorial we will see the migration of a web application made in struts to spring mvc. Struts to Spring migration we will do step by step. Here I will share you step by step approach to migrate application from Struts to Spring using annotations.

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" />