本文摘自文章 SpringMVC与Struts2区别与比较总结
并对原文章中的某些区别点进行了摘除,并增加了自己的一些配图比较说明
因为学习和使用是相辅相成的,鉴于自己Struts2使用经验较缺乏,特整理了一份留给以后的自己参考,希望,以后成为大神了,再详细补说每一个区别点!
SSH: Spring + Struts2 + Hibernate
SSM: Spring + SpringMVC + Mybatis
Struts的详细配置 可以参考我的博文第一个Struts2 ,快速翻看一下
SpringMVC的整合可以看我的博文Spring MVC 整合,大致扫一遍
Struts2 和 SpringMVC 的区别:
(1)Struts2 :是类级别的拦截,一个类对应一个request上下文;实现restful url架构相对要费劲,因为Struts2中 Action的一个方法对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了
LoginAction.java
package com.appleyk.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport { //继承类ActionSupport
/**
* 类版本号
*/
private static final long serialVersionUID = 1L;
private String username;
private String password; //类属性 所有Action之间共享
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;
}
@Override
public String execute() throws Exception { //重写 execute方法 实现Action行为
if(getUsername().equals("appleyk") && getPassword().equals("521")){
return "success";
}
else if(getUsername().equals("") & getPassword().equals("")){
return "welcome";
}
else
return "error";
} //返回的字符串 表示一个jsp页面 相当于一个url
}
SpringMVC:是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以从架构本身上,很容易实现restful(一种架构设计风格) url
ItemController.java
package com.taotao.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.taotao.common.pojo.EasyUIDataGridResult;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.JsonUtils;
import com.taotao.pojo.TbItem;
import com.taotao.service.ItemService;
/**
* 商品信息 Controller 控制器-->操作商品信息表
* 控制器里面的每一个url,对应一个实现方法,方法之间不共享数据
* @author Appleyk
* 2017年8月14日12:04:46
*/
@Controller
public class ItemController {
@Autowired
private ItemService itemService;
@RequestMapping("/item/{itemID}")
@ResponseBody
private TbItem geTbItemByID(@PathVariable Long itemID){
TbItem item = itemService.geTbItemByID(itemID);
return item;
}
@RequestMapping(value="/item/save",method=RequestMethod.POST)
@ResponseBody
public TaotaoResult createItem(TbItem item,String desc){
TaotaoResult result = itemService.createItem(item, desc);
return result;
}
@RequestMapping("/item/param/list")
//可以不用@ResponseBody注解的方式直接返回json数据,自己写工具类,返回json字符串
public String getItemParamList(Integer page,Integer rows){
EasyUIDataGridResult result = itemService.getItemParamList(page, rows);
String json = JsonUtils.objectToJson(result);
return json;
}
}
(2)Struts2 : 方法之间虽然也是独立的,但其所有的Action(一个Action对应一个java类)变量是共享的,这个虽然不会影响程序的运行,却给我们读代码的时候带来麻烦;一个Action对象对应一个requset上下文
SpringMVC:方法之间基本上是独立的,独享 request和response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量
(3)Struts2: 由于需要针对每个request进行封装,把request、session等servlet生命周期的变量封装成一个个Map,供给每个Action使用,并保证线程安全,所以,原则上是比较耗费内存的
(4)Struts2 : 核心控制器是Filter -->类 StrutsPrepareAndExecuteFilter
通过url找对应的Action.....
SpringMVC:的核心控制器是Servlet -->类 DispatcherServlet
通过url找对应的Controller....
SpringMVC : 集成了Ajax,使用起来非常方便,只需一个注解@ResponseBody就可以实现将对象转换为json数据,然后直接返回 响应文本即可
SpringMVC:是Spring的一个分支,和Spring无缝衔接。从项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同 的目录结构和相关配置做到和SpringMVC一样的效果,但是需要xml配置的地方不少)
(8)总结:
A:SpringMVC开发效率和性能高于Struts2。
B:SpringMVC可以认为已经100%零配置。
选择编程语言也是,不能一篇盖全的去比较各个语言之间的优劣势,语言是为了迎合某个点而产生的;
但是选对框架和选对语言,对于项目的开发效率和市场的长远发展来说,还是很重要的!
不断学习,不断摸索,不断碰壁,不断进步!