基于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 controller
Work on new technology : Create and manage cloud applications using Java
In Strut application web.xml look like as follows
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?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>dispatcher</display-name> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> |
Step 3: 替换Struts本身的配置文件
Now replace all struts configuration files to spring configuration file as follows
In Struts applivation struts configuration file-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?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.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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?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.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> |
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 following
Firstly replace all tlds-
1 2 3 4 |
<%@ 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 :
1 2 |
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> |
In Struts :
1 |
<html:form action="/addLogin" method="post"> |
In Spring :
1 |
<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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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
1 |
<% ActionErrors actionErrors = (ActionErrors)request.getAttribute("org.apache.struts.action.ERROR"); %> |
In Spring JSP file as follows-
1 |
<form:errors path="*" cssClass="error" /> |
参考链接
- 把系统从Struts2 迁移到 Spring MVC六大步总结
- SpringBoot系列——i18n国际化
- SpringMVC:Struts2区别、搭建应用、流程处理、核心控制器
- Spring MVC国际化(i18n)和本地化(L10n)示例
- Spring 国际化遇到的坑 No message found under code ‘xxx.xxxx‘ for locale ‘zh_CN‘
- 项目整理:springmvc国际化配置messageSource(以中英文为例)
- Spring核心——MessageSource实现国际化
- springMVC访问静态资源——js、css、img等资源访问不到
- springmvc将后台的数据展示到jsp页面
- Model、ModelMap和ModelAndView的使用详解
- SpringMVC原理分析 | 数据处理:ModelAndView