struts2的项目怎么写成springmvc的框架

综合 2026-10-17 04:00:32 6

把 Struts2 项目改成 SpringMVC,项的框不是目写简单换个 jar 包的事。我见过一个跑了六年的项的框老系统,Action 里塞满了业务逻辑,目写Service 层薄得像纸,项的框改起来比重新写还累。目写但真要动手,项的框核心就三件事:请求映射、目写参数绑定、项的框视图解析。目写下面按我实际改过的项的框几个项目来说。

先看 web.xml。目写Struts2 靠 FilterDispatcher 或 StrutsPrepareAndExecuteFilter 拦截所有请求,项的框SpringMVC 换成 DispatcherServlet。目写配置差不多,项的框但 SpringMVC 的 servlet 需要指定 contextConfigLocation 加载 spring-mvc.xml。有个坑:原来 Struts2 的 filter 可能还配了 struts.action.extension 参数,改成 SpringMVC 后这些要全删掉,否则 404 能让你查半天。

Action 到 Controller 的转换最费时间。Struts2 的 ActionSupport 里 execute 方法返回 String,靠 struts.xml 里的 result 跳转。SpringMVC 的 @Controller 方法直接返回 ModelAndView 或者 String 视图名。我一般先把 Action 类上的 @Scope("prototype") 去掉——SpringMVC 的 Controller 默认单例,只要不往字段里塞状态就没问题。然后方法参数从无参变成 @RequestParam 或 @ModelAttribute。有个细节:Struts2 的 Action 属性自动绑定请求参数,改成 SpringMVC 后要么在方法参数里逐个声明,要么用 @ModelAttribute 绑到对象上,后者更省事。

struts.xml 里的 action 配置要拆成 @RequestMapping。原来一个 action 里多个 method 用 method 属性区分,现在直接写多个 @RequestMapping(value="/user", method=RequestMethod.GET) 之类。注意 Struts2 的 action 名带 .action 后缀,SpringMVC 默认不带,前端链接得批量改。我上次改的时候用 sed 全局替换,结果把静态资源里的 .action 也误伤了,后来加了个正则排除 /static/ 路径。

拦截器这块差异不小。Struts2 的 Interceptor 栈很重,SpringMVC 的 HandlerInterceptor 轻量得多。原来做登录校验的拦截器,preHandle 里拿 ActionContext 取 session,现在换成 HttpServletRequest。权限校验的代码基本能复用,但要注意 Struts2 的 ActionInvocation 和 SpringMVC 的 HandlerMethod 不是一回事,invoke 方法得重写。有个项目用了 Struts2 的 token 拦截器防重复提交,改成 SpringMVC 后我直接用 @Token 注解加自定义拦截器,反而更干净。

视图层 JSP 大部分不用动,但 Struts2 标签库要全换掉。s:property 换成 ${ } 或 JSTL 的 c:out,s:iterator 换成 c:forEach。最麻烦的是 s:select 和 s:checkboxlist,数据源从 Action 属性变成 Model 里的 list,前端 name 属性也得跟着调。我一般先把 JSP 里的 Struts 标签全搜出来,列个清单,改一个划掉一个。有个页面用了 s:date 格式化,换成 fmt:formatDate 后时区不对,查了才发现原来 Struts2 默认用 GMT+8,SpringMVC 的 fmt 标签得手动设 timeZone。

异常处理。Struts2 的 exception 拦截器配全局异常映射,SpringMVC 用 @ExceptionHandler 或者 SimpleMappingExceptionResolver。我倾向后者,在 spring-mvc.xml 里配 exceptionMappings,跟原来 struts.xml 的 global-exception-mappings 几乎一一对应。但要注意 Struts2 的异常链会包装 ActionException,SpringMVC 直接抛原始异常,所以 catch 的类名得改。

最后说依赖。pom.xml 里删掉 struts2-core、struts2-spring-plugin、struts2-convention-plugin,加上 spring-webmvc、jackson-databind(如果原来用 struts2-json-plugin)。版本对齐很重要,SpringMVC 4.x 配 Servlet 3.0 以上,老项目如果是 Servlet 2.5 得先升容器。我改过一个 Tomcat 6 的项目,升到 Tomcat 8 才跑起来,中间还遇到 EL 表达式不兼容,把 jsp-api 和 el-api 的 scope 改成 provided 才解决。

改完别急着上线。Struts2 的 OGNL 表达式和 SpringMVC 的 SpEL 在参数绑定上行为不同,比如 List<String> 的绑定,Struts2 用 list[0].name,SpringMVC 用 list[0].name 也行但索引从 0 开始必须连续。我写了个小脚本对比两边请求参数解析结果,跑了三百多个接口才敢切流量。整个过程大概两周,一个人搞的话时间主要花在 JSP 标签替换和拦截器重写上。

本文地址:http://www.79wt.cn/news/1830b1099806.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

友情链接