Struts2 和 SpringMVC 的区别:
1、机制上:Struts2入口是 Filter(通过实现请求转发和初始化操作)。SpringMVC入口是 Servlet(实现请求转发和初始化操作)
2、工作流程:
Struts2:
1.客户端浏览器发出HTTP请求.
2.根据web.xml配置,该请求被FilterDispatcher接收
3.根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton
4.Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5.Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面
6.返回HTTP响应到客户端浏览器
SpringMVC:
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(二者组成HandlerExecutionChain),并将其一并返回给DispatcherServlet。
4.DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5.执行处理器(Controller,也叫后端控制器)。
6.Controller执行完成返回ModelAndView
7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11.DispatcherServlet对用户进行响应
3、拦截级别不同:
1.Struts2拦截属于类级别的拦截,一个请求对应一个Action,是基于类的。(方法之间独立,但是action变量是可以共享)。然后调用get和set方法把request请求中的数据注入其中。2.Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。
1.SpringMVC属于单列模式,基于方法拦截模式,粒度更细。(方法之间不共享变量,独享request response数据处理结果通过ModelMap交回给框架。
4、数据返回方式:
Struts2需要在struts.xml中result标签中指定是返回数据还是重定向其他Action。
SpringMVC集成了Ajax,使用起来更加方便。只需要一个@ResponseBody就可以实现。
Struts2使用:返回 json数据Struts.xml 参数设置:
private List<Goods> goods;
public List<Goods> getGoods() {
return goods;
}
1.在xml文件中如果result没有param属性时,内容如下:
<action name="goods" class="cn.csdn.action.GoodsAction">
<result type="json"/>
</action>
得到的是json数据,但是autocomplete解析不出这样的json格式,所以读取不出来,结果为:
{"goods":[{"id":2,"name":"老王 ","price":222.0},{"id":1,"name":"老王 ","price":222.0},{"id":3,"name":"老王 ","price":222.0},{"id":4,"name":"老王 ","price":222.0},{"id":5,"name":"老王 ","price":222.0}]
2.如果加上param的name为根对象,则可以返回的是json数据
<action name="goods" class="cn.csdn.action.GoodsAction">
<result type="json">
<!-- 这里指定将被Struts2序列化的属性,该goods属性在action中必须有对应的getter方法 -->
<param name="root">goods</param>
</result>
</action>
返回的数据为:
[{"id":2,"name":"老王 ","price":222.0},{"id":1,"name":"老王 ","price":222.0},{"id":3,"name":"老王 ","price":222.0},{"id":4,"name":"老王 ","price":222.0},{"id":5,"name":"老王 ","price":222.0}]
可见返回的是json数据,并且在智能提示中可以提取出来,可以得知: <param name="root">goods</param>的意思是从根节点为goods的开始遍历,所有看到的数据就是json数据了。
3.如果在action中封装的是一个实体,也就是查询的是一条数据,则代码为:
private Goods goods;
public Goods getGoods() {
return goods;
}
在xml文件中如果没有param,内容如下:
<action name="goods" class="cn.csdn.action.GoodsAction">
<result type="json"/>
</action>
响应的数据为:
{"goods":{"id":1,"name":"老王 2","price":222.0}}
4.如果加上param参数,则返回的是
<action name="goods" class="cn.csdn.action.GoodsAction">
<result type="json">
<!-- 这里指定将被Struts2序列化的属性,该goods属性在action中必须有对应的getter方法 -->
<param name="root">goods</param>
</result>
</action>
结果为:{"id":1,"name":"老王 2","price":222.0}
5.如果在action中的数据为:
private List<Goods> goodsList;
private Goods goods;
public List<Goods> getGoodsList() {
return goodsList;
}
public Goods getGoods() {
return goods;
}
在xml文件中的数据为:
<action name="goods" class="cn.csdn.action.GoodsAction">
<result type="json">
<!-- 这里指定将被Struts2序列化的属性,该goods属性在action中必须有对应的getter方法 -->
<param name="root">goods</param>
</result>
</action>
则返回的只是goods对应的实体
{"id":1,"name":"老王 2","price":222.0}
6.如果为:
<action name="goods" class="cn.csdn.action.GoodsAction">
<result type="json">
<!-- 这里指定将被Struts2序列化的属性,该goodsList属性在action中必须有对应的getter方法 -->
<param name="root">goodsList</param>
</result>
</action>
则返回的只是goodsList的实体,为:
[{"id":2,"name":"老王 ","price":222.0},{"id":1,"name":"老王 ","price":222.0},{"id":3,"name":"老王 ","price":222.0},{"id":4,"name":"老王 ","price":222.0},{"id":5,"name":"老王 ","price":222.0}]
7.如果在xml中的文件为:
<action name="goods" class="cn.csdn.action.GoodsAction">
<result type="json">
<!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
<param name="root">goodsList,goods</param>
</result>
</action>
那么返回的数据为:
{"id":1,"name":"老王 2","price":222.0}
也就是谁在后面返回的是哪个
8.如果xml数据为:
<result type="json">
<param name="includeProperties">goods</param>
</result>
返回的结果为:
{"goods":[]}
9.如果xml中数据为:
<result type="json">
<param name="includeProperties">goodsList.name</param>
</result>
返回的数据为:
{"goodsList":[{"name":"老王1 "},{"name":"老王 2"},{"name":"老王3 "},{"name":"老王4 "},{"name":"老王5 "}]}
10.如果xml中数据为:
<result type="json">
<param name="includeProperties">^goodsList.name</param>
</result>
返回的数据为:
{"goodsList":[{"name":"老王1 "},{"name":"老王 2"},{"name":"老王3 "},{"name":"老王4 "},{"name":"老王5 "}]}
iBatis 2.x 和 MyBatis 3.0.x 的区别:
1、 全局配置文件命名
iBatis 通常把为 sqlMapConfig.xml,文件名本身并没有要求,在 MyBatis 中经常会将该文件命名为 Configuration.xml
2、 全局配置文件
3、ibatis需要实现dao层,操作数据库xml与mapper接口绑定不同(看图):

备注:如有错误,还请大神多多指教。
本文详细对比了Struts2与SpringMVC的工作机制、流程、拦截级别及数据返回方式,深入解析两者在实际应用中的差异。

609

被折叠的 条评论
为什么被折叠?



