[MVC] 常用MVC框架及之间优缺点

目录

  • 常用MVC框架及之间优缺点
    • Spring与Spring MVC的区别
    • Spring与Struts2的区别
    • Spring MVC和Struts2的区别
    • Spring MVC和jFinal的区别
    • REFERENCES
    • 更多

常用MVC框架及之间优缺点

主要框架

  • Spring
  • Spring MVC
  • Struts2
  • jFinal

Spring与Spring MVC的区别

spring是一个开源框架,是为了解决企业应用程序开发,功能如下:

功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

范围:任何Java应用 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

  • 轻量从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外, Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

  • 控制反转Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器 中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

  • 面向切面Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑—— 仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

  • 容器Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例 ——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的, 难以使用。

  • 框架Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。Spring的两大核心AOP与IOC,可以单独用于任何应用,包括与Struts等MVC框架与Hibernate等ORM框架的集成,目前很多公司所谓的轻量级开发就是用Spring + Struts(2)+Hibernate。

Spring MVC就是一个MVC框架,个人觉得Spring MVC annotation式的开发比Struts2方便,可以直接代替上面的Struts(当然Struts的做为一个非常成熟的MVC,功能上感觉还是比Spring强一点,不过Spring MVC已经足够用了)。当然spring mvc的执行效率比struts高,是因为struts的值栈影响效率。

Spring MVC类似于struts的一个MVC框架,其实都是属于spring,spring mvc需要有spring的架包作为支撑才能跑起来。

Spring与Struts2的区别

Struts2就是一个拦截器栈 也就是一系列的拦截器。处理用户的请求,OGNL的使用,表单验证 等都是默认的拦截器在起作用。

Spring的拦截器,主要体现在AOP的事务管理方面,还有比如一些错误或者异常的日志的显示也是通过配置spring的log拦截器来实现的。

Spring MVC和Struts2的区别

  • 核心控制器(前端控制器、预处理控制器) 对于使用过mvc框架的人来说这个词应该不会陌生,核心控制器的主要用途是处理所有的请求,然后对那些特殊的请求 (控制器)统一的进行处理(字符编码、文件上传、参数接受、异常处理等等),SpringMVC核心控制器是Servlet,而Struts2是Filter。

  • 学习难度 Struts2增加很多新的技术点,比如拦截器、值栈及OGNL表达式,学习成本较高,SpringMVC 比较简单,较少的时间都能上手。

  • 管理方式 大部分的公司的核心架构中,就会使用到Spring,而SpringMVC又是Spring中的一个模块,所以Spring对于SpringMVC的控制器管理更加简单方便,而且提供了全 注解方式进行管理,各种功能的注解都比较全面,使用简单,而Struts2需要采用XML很多的配置参数来管理(虽然也可以采用注解,但是几乎没有公司那样使用)。SpringMVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)

  • 性能 SpringMVC会稍微比Struts2快。SpringMVC是基于方法的设计,而Sturts2是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而SpringMVC基于方法,粒度更细,但要小心把握像在servlet控制数据一样。SpringMVC是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在SpringMVC中,一个方法对应一个request上下文。而Struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;Struts2实际上是通过setter getter方法与request打交道的;Struts2中,一个Action对象对应一个request上下文。

  • 参数传递 Struts2中自身提供多种参数接受,其实都是通过(ValueStack)进行传递和赋值,而SpringMVC是通过方法的参数进行接收。

  • 设计思想上 Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在Servlet上扩展。

  • intercepter的实现机制 Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式。这样导致Struts2的配置文件量还是比SpringMVC大,虽然Struts2的配置能继承,所以我觉得论使用上来讲,SpringMVC使用更加简洁,开发效率SpringMVC确实比Struts2高。SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url。Struts2是类级别的拦截,一个类对应一个request上下文;实现restful url要费劲,因为Struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。

  • 另外,Spring MVC的验证也是一个亮点,支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。处理ajax的请求更是方便,只需一个注解。Spring MVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可, 而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去, 使用起来也相对不方便。

    @RequestMapping(value=/whitelists”)  
    public String index(ModelMap map) {  
        Account account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId());  
        List groupList = groupManager.findAllGroup(account.getId());  
        map.put(“account”, account);  
        map.put(“groupList”, groupList);  
        return/group/group-index”;  
    } 

 	// @ResponseBody ajax响应,处理Ajax请求也很方便  
    @RequestMapping(value=/whitelist/{whiteListId}/del”)  
    @ResponseBody  
    public String delete(@PathVariable Integer whiteListId) {  
        whiteListManager.deleteWhiteList(whiteListId);  
        return “success”;  
    } 

Spring MVC和jFinal的区别

  • jFinal的mvc层jar依赖jfinal-src核心包,spring mvc则更笨重!

  • 路由规则:jFinal配置controller类方式可以在集成 JFinalConfig的路由重写方法里面配置,同时默认的情况controller/method这样请求,spring mvc则是在controller类头声明,方法默认需要使用requestMapping注解。

  • 返回视图,jfinal返回视图使用render系列方法,底层和spring mvc相同使用request,response对象跳转带值,区别在于jfinal返回使用的不是在spring mvc下return关键字,这意味着我们可以在返回视图后继续做一些事情。而在spring mvc中更多的时候我们返回一个视图需要做很多事情。

  • jFinal的model特性决定了,我们使用jfinal mvc的getModel()获取一个页面封装实体同时,它也是一个同时能够被数据持久化的对象。

  • 文件上传区别:jfinal文件上传做的封装非常强大,只需一行代码即可实现文件批量上传(重命名除外)

  • jFinal遵循CoC原则,零配置,无xml。

  • jFinal支持ActiveRecord,使数据库开发极致快速。

  • jFinal的Plugin体系结构,扩展性强。

  • jFinal适合中小型项目,Spring MVC适合大中型项目。

Convention over Configuration(CoC)– 惯例优于配置原则

​ 简单点说,就是将一些公认的配置方式和信息作为内部缺省的规则来使用。例如,Hibernate的映射文件,如果约定字段名和类属性一致的话,基本上就可以不要这个配置文件了。你的应用只需要指定不convention的信息即可,从而减少了大量convention而又不得不花时间和精力啰里啰嗦的东东。配置文件很多时候相当的影响开发效率。

REFERENCES

  • Spring MVC和Struts2的比较的优点
  • SSH与jFinal如何决舍
  • Spring 、SpringMVC 、Struts2之间的区别

更多

扫码关注或搜索架构探险之道获取最新文章,不积跬步无以至千里,坚持每周一更,坚持技术分享^_^

你可能感兴趣的:(JFinal,Spring,MVC,Spring)