框架

3 篇文章 0 订阅
1 篇文章 0 订阅

一 、Struts

1. struts 是一个按 MVC 模式设计的 Web 层框架,其实它就是一个大大的 servlet,这个 Servlet
名为 ActionServlet,或是 ActionServlet 的子类。我们可以在 web.xml 文件中将符合某种特征
的 所 有 请 求 交 给 这个 Servlet 处 理 , 这 个 Servlet 再 参 照 一 个 配 置 文件 ( 通 常 为
/WEB-INF/struts-config.xml)将各个请求分别分配给不同的 action 去处理。
一个扩展知识点:struts 的配置文件可以有多个,可以按模块配置各自的配置文件,这样可
以防止配置文件的过度膨胀;
2. ActionServlet 把请求交给 action 去处理之前,会将请求参数封装成一个 formbean 对象(就
是一个 java 类,这个类中的每个属性对应一个请求参数),封装成一个什么样的 formbean
对象呢?看配置文件。
3.要说明的是, ActionServlet 把 formbean 对象传递给 action 的 execute 方法之前,可能会调
用 formbean 的 validate 方法进行校验,只有校验通过后才将这个 formbean 对象传递给 action
的 execute 方法,否则,它将返回一个错误页面,这个错误页面由 input 属性指定,(看配置
文件)作者为什么将这里命名为 input 属性,而不是 error 属性,我们后面结合实际的运行效
果进行分析。
4.action 执行完后要返回显示的结果视图,这个结果视图是用一个 ActionForward 对象来表示
的,actionforward 对象通过 struts-config.xml 配置文件中的配置关联到某个 jsp 页面,因为程
序中使用的是在 struts-config.xml 配置文件为 jsp 页面设置的逻辑名,这样可以实现 action

程序代码与返回的 jsp 页面名称的解耦。

Struts的优点

1. 实现 MVC 模式,结构清晰,使开发者只关注业务逻辑的实现.
2.有丰富的 tag 可以用 ,Struts 的标记库(Taglib),如能灵活动用,则能大大提高开发效率
3. 页面导航
使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这
对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得
更加明显。
4. 提供 Exception 处理机制 .
5. 数据库链接池管理

6. 支持 I18N

缺点

一、 转到展示层时,需要配置 forward,如果有十个展示层的 jsp,需要配置十次 struts,而
且还不包括有时候目录、文件变更,需要重新修改 forward,注意,每次修改配置之后,
要求重新部署整个项目,而 tomcate 这样的服务器,还必须重新启动服务器
二、 、 Struts 的 Action 必需是 thread-safe 方式,它仅仅允许一个实例去处理所有的请
求。所以 action 用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。
三、 测试不方便. Struts 的每个 Action 都同 Web 层耦合在一起,这样它的测试依赖于 Web
容器,单元测试也很难实现。不过有一个 Junit 的扩展工具 Struts TestCase 可以实现它
的单元测试。
四、 类型的转换. Struts 的 FormBean 把所有的数据都作为 String 类型,它可以使用工具
Commons-Beanutils 进行类型转化。但它的转化都是在 Class 级别,而且转化的类型是
不可配置的。类型转化时的错误信息返回给用户也是非常困难的。
五、 对 Servlet 的 依 赖 性 过 强 . Struts 处 理 Action 时 必 需 要 依 赖 ServletRequest 和
ServletResponse,所有它摆脱不了 Servlet 容器。
六、 前端表达式语言方面.Struts 集成了 JSTL,所以它主要使用 JSTL 的表达式语言来获取
数据。可是 JSTL 的表达式语言在 Collection 和索引属性方面处理显得很弱。
七、 对 Action 执行的控制困难. Struts 创建一个 Action,如果想控制它的执行顺序将会非
常困难。甚至你要重新去写 Servlet 来实现你的这个功能需求。
八、 对 Action 执行前和后的处理. Struts 处理 Action 的时候是基于 class 的 hierarchies,很
难在 action 处理前和后进行操作。
九、 对事件支持不够. 在 struts 中,实际是一个表单 Form 对应一个 Action 类(或
DispatchAction),换一句话说:在 Struts 中实际是一个表单只能 对应一个事件,struts
这种事件方式称为 application event,application event 和 component event 相比是一种
粗粒度的事件

二、Spring

1.Spring 实现了工厂模式的工厂类(在这里有必要解释清楚什么是工厂模式),这个类名为
BeanFactory(实际上是一个接口),在程序中通常 BeanFactory 的子类 ApplicationContext。
Spring 相当于一个大的工厂类,在其配置文件中通过<bean>元素配置用于创建实例对象的类
名和实例对象的属性。
2. Spring 提供了对 IOC 良好支持,IOC 是一种编程思想,是一种架构艺术,利用这种思想
可以很好地实现模块之间的解耦。IOC 也称为 DI(Depency Injection),什么叫依赖注入呢?
譬如,Class Programmer
{
Computer computer = null;
public void code()
{
//Computer computer = new IBMComputer();
//Computer computer = beanfacotry.getComputer();
computer.write();
}
public void setComputer(Computer computer)
{
this.computer = computer;
}
}
另外两种方式都由依赖,第一个直接依赖于目标类,第二个把依赖转移到工厂上,第三个彻
底与目标和工厂解耦了。在 spring 的配置文件中配置片段如下:
<bean id=”computer” class=”cn.itcast.interview.Computer”>
</bean>
<bean id=”programmer” class=”cn.itcast.interview.Programmer”>
<property name=”computer” ref=”computer”></property>
</bean>
3. Spring 提供了对 AOP 技术的良好封装, AOP 称为面向切面编程,就是系统中有很多各
不相干的类的方法,在这些众多方法中要加入某种系统功能的代码,例如,加入日志,加入
权限判断,加入异常处理,这种应用称为 AOP。实现 AOP 功能采用的是代理技术,客户端
程序不再调用目标,而调用代理类,代理类与目标类对外具有相同的方法声明,有两种方式
可以实现相同的方法声明,一是实现相同的接口,二是作为目标的子类在,JDK 中采用 Proxy
类产生动态代理的方式为某个接口生成实现类,如果要为某个类生成子类,则可以用 CGLI
B。在生成的代理类的方法中加入系统功能和调用目标类的相应方法,系统功能的代理以
Advice 对象进行提供,显然要创建出代理对象,至少需要目标类和 Advice 类。spring 提供
了这种支持,只需要在 spring 配置文件中配置这两个元素即可实现代理和 aop 功能,例如,
<bean id=”proxy” type=”org.spring.framework.aop.ProxyBeanFactory”>
<property name=”target” ref=””></property>
<property name=”advisor” ref=””></property>

</bean>

4Spring的七大核心

(1)Spring Core:Core封装包是框架的最基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。 
(2)Spring Context: 构建于Core封装包基础上的Context封装包,提供了一种框架式的对象访问方法,像JNDI注册器。 Context封装包的特性得自于Beans封装包,并添加了对国际化(I18N)的支持(例如资源绑定),事件传播,资源装载的方式和Context的透明创建,比如说通过Servlet容器。 
(3)Spring DAO: DAO(Data Access Object)提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。并且,JDBC封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的POJOs(plain old Java objects)都适用。 
(4)Spring ORM: ORM封装包提供了常用的“对象/关系”映射APIs的集成层。其中包括JPA、JDO、Hibernate和iBatis。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。 
(5)Spring AOP: Spring的AOP封装包提供了符合AOP Alliance规范的面向方面的编程实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中。 
(6)Spring Web: Spring中的Web包提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servlet listeners进行IOC容器初始化和针对Web的ApplicationContext。当与WebWork或Struts一起使用Spring时,这个包使Spring可与其他框架结合。 
(7)Spring Web MVC: Spring中的MVC封装包提供了Web应用的Model-View-Controller(MVC)实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型,在领域模型代码和Web Form之间。并且,还可以借助Spring框架的其他特性。

5. spring IOC与AOP思想的理解

控制反转(IOC):所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。

依赖注入(DI):在运行期,由外部容器动态地将依赖对象注入到组件中,从而创建用对象之间协作关系(也称为装配)。在代码中的展现形式是在配置文件applicationContext.xml中管理Bean。

面向切面编程被定义为促使应用程序分离关注点的一项技术。系统由许多不同组件组成,每个组件负责一块特定的功能。除了负责实现自身核心的功能之外,这些组件还承担着额外的职责。诸如日志、事务管理和安全此类的系统服务经常融入到有自身核心业务逻辑的组件中去,这些系统通常被称为横切关注点,因为它们总是跨越系统的多个组件。

**依赖注入让相互协作的软件组织保持松散耦合; 
AOP编程把遍布应用各处的功能分离出来形成可重用的组件。**

6. spring aop中的propagation的7种配置的意思 
REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。 
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。


三、SpringMVC

   1、SpringMVC是Struts2后的一个全新的表现层框架,作为一个表现层框架应该解决三个问题

  • URL到框架的映射。
  • http请求参数绑定
  • http响应的生成和输出
当我们在浏览器输入一个网址回车后,浏览器发出一个http请求,请求是先到达你的服务器后,首先被SpringMVC注册在web.xml中的前端转发器DispatcherServlet接收,DispatcherServlet是一个标准的Servlet,它的作用是接收和转发Web请求到内部框架处理单元。

四、Hibernate

1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象、建立对象之
间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程
和操作怎么样,本质上都是要得到一个结果,程序上一个时刻和下一个时刻的运行结果的差
异就表现在内存中的对象状态发生了变化。
2.为了在关机和内存空间不够的状况下,保持程序的运行状态,需要将内存中的对象状态保
存到持久化设备和从持久化设备中恢复出对象的状态,通常都是保存到关系数据库来保存大
量对象信息。从 Java 程序的运行功能上来讲,保存对象状态的功能相比系统运行的其他功
能来说,应该是一个很不起眼的附属功能,java 采用 jdbc 来实现这个功能,这个不起眼的
功能却要编写大量的代码,而做的事情仅仅是保存对象和恢复对象,并且那些大量的 jdbc
代码并没有什么技术含量,基本上是采用一套例行公事的标准代码模板来编写,是一种苦活
和重复性的工作。
3.通过数据库保存 java 程序运行时产生的对象和恢复对象,其实就是实现了 java 对象与关
系数据库记录的映射关系,称为 ORM(即 Object Relation Mapping),人们可以通过封装 JDBC
代码来实现了这种功能,封装出来的产品称之为 ORM 框架,Hibernate 就是其中的一种流行
ORM 框架。使用 Hibernate 框架,不用写 JDBC 代码,仅仅是调用一个 save 方法,就可以
将对象保存到关系数据库中,仅仅是调用一个 get 方法,就可以从数据库中加载出一个对象。
4.使用 Hibernate 的基本流程是:配置 Configuration 对象、产生 SessionFactory、创建 session
对象,启动事务,完成 CRUD 操作,提交事务,关闭 session。
5.使用 Hibernate 时,先要配置 hibernate.cfg.xml 文件,其中配置数据库连接信息和方言等,
还要为每个实体配置相应的 hbm.xml 文件,hibernate.cfg.xml 文件中需要登记每个 hbm.xml
文件。
6.在应用 Hibernate 时,重点要了解 Session 的缓存原理,级联,延迟加载和 hql 查询。

五、mybatis

六、Mybatis和Hibernate的区别

相同点:屏蔽 jdbc api 的底层访问细节,使用我们不用与 jdbc api 打交道,就可以访问数据。
jdbc api 编程流程固定,还将 sql 语句与 java 代码混杂在了一起,经常需要拼凑 sql 语句,细
节很繁琐。
ibatis 的好处:屏蔽 jdbc api 的底层访问细节;将 sql 语句与 java 代码进行分离;提供了将结
果集自动封装称为实体对象和对象的集合的功能, queryForList 返回对象集合,用
queryForObject 返回单个对象;提供了自动将实体对象的属性传递给 sql语句的参数。
Hibernate 是一个全自动的 orm 映射工具,它可以自动生成 sql 语句,ibatis 需要我们自己在 xml
配置文件中写 sql语句,hibernate 要比 ibatis 功能负责和强大很多。因为 hibernate 自动生成
sql 语句,我们无法控制该语句,我们就无法去写特定的高效率的 sql。对于一些不太复杂的
sql 查询,hibernate 可以很好帮我们完成,但是,对于特别复杂的查询,hibernate 就很难适

应了,这时候用 ibatis 就是不错的选择,因为 ibatis 还是由我们自己写 sql 语句。


SpringMVC与Struts2区别与比较总结 

(1)Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应。所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。 
(2)由上边原因,SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量。而Struts2虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个Action对象对应一个request上下文。 
(3)由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。 
(4)拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。 
(5)SpringMVC的入口是servlet,而Struts2是filter(filter和servlet是不同的,以前认为filter是servlet的一种特殊)。 
(6)SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。 
(7)SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。 
(8)Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。 
(9)设计思想上,Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。 
(10)SpringMVC开发效率和性能高于Struts2。 
(11)SpringMVC可以认为已经100%零配置。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值