把系统从Struts2 迁移到 Spring MVC六大步总结
在这篇辅导材料里,我重点总结了怎么把一个基于struts的系统迁移到SpringMVC架构上来,共分六部曲,让系统一部一部迁移过来,本文讲的知识点以Struts2 to Spring4,但是针对其他应用场景也是可以参考的。
Step 1: 替换基本的框架库。
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 :
- struts.jar
- struts-legacy.jar
- etc..
Have you ever use : Javadoc comment in Java
Spring basic libraries :
- standard.jar
- org.springframework.asm-4.0.1.RELEASE-A.jar
- org.springframework.beans-4.0.1.RELEASE-A.jar
- org.springframework.context-4.0.1.RELEASE-A.jar
- org.springframework.core-4.0.1.RELEASE-A.jar
- org.springframework.expression-4.0.1.RELEASE-A.jar
- org.springframework.web.servlet-4.0.1.RELEASE-A.jar
- org.springframework.web-4.0.1.RELEASE-A.jar
- etc..
Step 2: 修改web.xml配置文件
In this step we have to remove Action filter dispatcher for the web.xml and add Spring dipatcher servlet as Front controllerWork on new technology : Create and manage cloud applications using Java
In Strut application web.xml look like as follows
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="" xmlns="" xmlns:web=".xsd" xsi:schemaLocation=" .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="" xmlns="" xsi:schemaLocation=" .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: 替换Struts本身的配置文件
Now replace all struts configuration files to spring configuration file as followsIn Struts applivation struts configuration file-
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" ".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.geekonjavaonjava.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="" xmlns:context="" xmlns:p="" xmlns:xsi="" xsi:schemaLocation=" .0.xsd .0.xsd"> <context:component-scan base-package="com.geekonjavaonjava.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> <span style="font-family: Times New Roman;"><span style="white-space: normal;"> </span></span>Here, <context:component-scan> tag is used, so that spring will load all the components from given package i.e. " com.geekonjavaonjava.spring.login.controller".
Use this in Struts2 : Get value of struts property tag into jsp variable
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文件
While migration an application from struts to spring we need to change in jsp file as followingFirstly replace all tlds-
<%@ taglib uri="" prefix="bean" %> <%@ taglib uri="" prefix="html" %> <%@ taglib uri="" prefix="logic" %> <%@ taglib uri="" prefix="tiles" %>
Replace these with following spring taglib's :
<%@ taglib prefix="form" uri=""%> <%@ taglib prefix="spring" uri=""%>
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 类文件
Now following changes need to be done in action classes for struts to spring migration using annotations-Struts Action:
package com.geekonjavaonjava.struts2.login; import com.opensymphony.xwork2.ActionSupport; /** * @author geekonjava * */ @SuppressWarnings("serial") public class LoginAction extends ActionSupport{ private String username; private String password; public String execute() { if (this.username.equals("geekonjava") && 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.geekonjavaonjava.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 GeekOnJava * */ @Controller public class LoginController { @RequestMapping(value="/login.do", method = RequestMethod.GET) public String doLogin(ModelMap model, LoginForm loginForn) { if (this.username.equals("geekonjava") && this.password.equals("sweety")) { model.addAttribute("message", "Login Success"); } else { model.addAttribute("message", "Login Failure"); } return "home"; } }
Step 6: 修改前端验证机制
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" />