SpringMVC 和Struts2的区别 1. 机制: spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。 2. 性能: spring会稍微比struts快。spring mvc是基于方法的设计,而sturts 是基于类,每次发一次请求都会实例一个action,每个action都会被注 入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控 制数据一样。spring3 mvc是方法级别的拦截,拦截到方法后根据参数 上的注解,把request数据注入进去,在spring3 mvc中,一个方法对应 一个request上下文。而struts2框架是类级别的拦截,每次来了请求就 创建一个Action,然后调用setter getter方法把request中的数据注 入;struts2实际上是通 setter getter方法与request打交道的; struts2中,一个Action对象对应一个request上下文。 3. 参数传递: struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。 4. 设计思想上: struts更加符合oop(面向对象编程)的编程思想, spring就比较谨慎,在servlet上扩展。 5. intercepter的实现机制: struts有自己的interceptor机制,spring mvc用的是独立的AOP方式 。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配 置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发 效率Spring MVC确实比struts2高。spring mvc是方法级别的拦截,一 个方法对应一个request上下文,而方法同时又跟一个url对应,所以说 从架构本身上spring3 mvc就容易实现restful url。struts2是类级别 的拦截,一个类对应一个request上下文;实现restful url要费劲,因 为struts2 action的一个方法可以对应一个url;而其类属性却被所有 方法共享,这也就无法用注解或其他方式标识其所属方法了。spring3 mvc的方法之间基本上独立的,独享request response数据,请求数据 通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量 ,而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有 Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。 6. 另外,spring3 mvc的验证也是一个亮点,支持JSR303,处理ajax 的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可。
MyBatis与hibernate区别 1. hibernate是全自动,而mybatis是半自动。 hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整 的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基 本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。 2. hibernate数据库移植性远大于mybatis。 hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库 (oracle、MySQL等)的耦合性,而mybatis由于需要手写sql,因此与 数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而 用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成 本很高。 3. hibernate拥有完整的日志系统,mybatis则欠缺一些。 hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、 优化警告、缓存提示、脏数据警告等;而mybatis则除了基本记录功能 外,功能薄弱很多。 4. mybatis相比hibernate需要关心很多细节 hibernate配置要比mybatis复杂的多,学习成本也比mybatis高。但也 正因为mybatis使用简单,才导致它要比hibernate关心很多技术细节。 mybatis由于不用考虑很多细节,开发模式上与传统jdbc区别很小,因 此很容易上手并开发项目,但忽略细节会导致项目前期bug较多,因而 开发出相对稳定的软件很慢,而开发出软件却很快。hibernate则正好 与之相反。但是如果使用hibernate很熟练的话,实际上开发效率丝毫 不差于甚至超越mybatis。 5. sql直接优化上,mybatis要比hibernate方便很多 由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多 。而hibernate的sql很多都是自动生成的,无法直接维护sql;虽有hql ,但功能还是不及sql强大,见到报表等变态需求时,hql也歇菜,也就 是说hql是有局限的;hibernate虽然也支持原生sql,但开发模式上却
与orm不同,需要转换思维,因此使用上不是非常方便。总之写sql的灵活度上hibernate不及mybatis。
JAVA8 十大新特性
1.Java 8允许给接口添加一个非抽象的方法实现,使用 default关键字
2.ambda表达式都对应一个类型,通常是接口类型
3.“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接
口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的
4.Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用,上面的代码展示了如何引用一个静态方法,我们也可以引用一个对象的方法
5.直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。
6.可以直接在lambda表达式中访问外层的局部变量,和匿名对象不同的是,这里的变量num可以不用声明为final
7.lambda内部对于实例的字段以及静态变量是即可读又可写。该行为和匿名对象是一致的
8.JDK 1.8 API包含了很多内建的函数式接口,在老Java中常用到的比
如Comparator或者Runnable接口,这些接口都增加了
@FunctionalInterface注解以便能用在lambda上。
Java 8 API同样还提供了很多全新的函数式接口来让工作更加方便,有
一些接口是来自Google Guava库里的
9.Java 8 在包java.time下包含了一组全新的时间日期API。新的日期API和开源的Joda-Time库差不多,但又不完全一样
10.在Java 8中支持多重注解
Spring MVC具体步骤:1、 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;2、 DispatcherServlet——>HandlerMapping,HandlerMapping 将会把请求映射为 HandlerExecutionChain 对象(包含一个 Handler 处理器(页面控制器)对象、多个 HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;4、 HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个 ModelAndView 对象(包含模型数据、逻辑视图名);5、 ModelAndView 的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的 View,通过这种策略模式,很容易更换其他视图技术;6、 View——>渲染,View 会根据传进来的 Model 模型数据进行渲染,此处的 Model 实际是一个 Map 数据结构,因此很容易支持其他视图技术;7、 返回控制权给 DispatcherServlet,由 DispatcherServlet 返回响应给用户,到此一个流程结束。
struts2原型图
用户请求-->ActionMapper(Action映射)-->FilterDispatcher(转发)-->ActionProxy(Action代理)
-->读取配置文件-->比对struts.xml中配置 -->ActionInvocation(Action核心调度器)
-->经过层层的(Interceptor)过滤-->执行Action中的method方法-->方法执行完后返回Result结果
-->根据返回结果读取页面(Template)-->再一次经过层层(Interceptor)过滤-à响应给用户
Freemarker的使用方法
第一步:把freemarker的jar包添加到工程中
第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。
第三步:创建一个Configration对象,该对象负责管理Freemarker的模板加载路径,负责生成模板实例
第四步:告诉config对象模板文件存放的路径。
第五步:设置config的默认字符集。一般是utf-8
第六步:从config对象中获得模板对象。需要制定一个模板文件的名字。
第七步:创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。数据模型就是一个MAP集合
第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。
第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。
第十步:关闭writer对象。
第一步:把freemarker的jar包添加到工程中
第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。
第三步:创建一个Configration对象,该对象负责管理Freemarker的模板加载路径,负责生成模板实例
第四步:告诉config对象模板文件存放的路径。
第五步:设置config的默认字符集。一般是utf-8
第六步:从config对象中获得模板对象。需要制定一个模板文件的名字。
第七步:创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。数据模型就是一个MAP集合
第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。
第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。
第十步:关闭writer对象。