Struts2与ibatis使用经验总结

本文详细对比了Struts2与SpringMVC的工作机制、流程、拦截级别及数据返回方式,深入解析两者在实际应用中的差异。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

 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接口绑定不同(看图):

备注:如有错误,还请大神多多指教。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值