欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

struts2、hibernate、spring的工作原理[简明易懂]

程序员文章站 2023-11-10 14:17:22
简单地说,这三者不过把一些常用的功能方法进行封装,使得这些方法规范化,避免像在jsp开发中重复而零散地编写类似代码。 再详细一点就是说,struts2负责处理客户的请求并转发到特定...
简单地说,这三者不过把一些常用的功能方法进行封装,使得这些方法规范化,避免像在jsp开发中重复而零散地编写类似代码。 再详细一点就是说,struts2负责处理客户的请求并转发到特定action方法去执行,这个过程用到的是struts2的转转器、过滤器、拦截器等功能。struts2标签功能等同于jsp标签,struts2标签的优势在于利用struts2框架的运作机制,让数据在页面的展示更加便捷。hibernate干啥呢?它负责action方法里面的逻辑实现(CRUD操作),这些实现包括与数据库打交道——如何连接数据库,如何把数据表里面的数据映射为普通的java类等等。那么spring干嘛用的?先看下文,到最后你就明白了。

下面说明它们各自的功能角色:struts2侧重于控制器功能,当客户端发送一个地址请求,Struts(通过配置文件)根据请求代码做出反映,并进行页面调用或转发。比如:/login 请求很可能是一个登录请求,那么Struts2应该回复一个login.jsp页面给客户端进行登录,然而地址栏不会看到/login.jsp样式,具体地址被隐藏了,只看到请求地址样式。struts2的标签类似于jstl标签,它们在本质上是一致的,都是为视图层方便编码以及为更好地与控制器融合。不是一定要使用Struts2标签才能使用它的控制器功能。可以选择其他标签,如jsp或jstl标签等。标签只是皮毛。其实spring它也有一套自己的标签,哪能用那么多啊。熟悉使用一种标签即可。

 

hibernate框架主要是负责连接数据库,把每个数据表转化为一个类,表中的每行数据相当于类的一个对象,hibernate通过对象的方式进行读取操作。

 

说到spring,不得不说控制反转,有关控制反转,请搜索“java设计模式”。然而,控制反转不能说是spring的功能,而只是他的设计思想,也就是说spring是由“控制反转”和”切面编程”这些设计模式开发出来的。spring包有许多类和方法,有像hibernate那样操作底层数据库功能的方法,有可以操作复杂的业务操作,这要看调用它什么样的接口和方法。由于它特殊的设计模式,使得它可以灵活地与其它框架整合,主要是通过配置文件的方式来完成。spring和hibernate整合在实际上替代了hibernate,因为它对hibernate的方法进行了包装。

 

三者整合的话,由spring来统领全局。spring和strut2整合不过是为struts2的action类提供容器管理,也就是说,当要实例化一个action类的时候,根据spring配置,spring容器会负责生成该action的对象。什么时候要实例化action类呢?也就是说何时生成action类的对象(实例)?答案是当客户端请求的时候。客户请求的目的是调用action中的方法,以便获取数据或操作数据。action类里面定义的方法,一般都是实例方法,因此需要得到action实例去调用这些方法。对于每个action类,实例化方式有2类:单例方式,原型方式。单例方式是说spring对该action类只实例化一次,即new一次而已,得到该类的一个对象,以后每一个客户端请求都是调用该对象的方法去响应客户。另外的话,像tomcat这样的web容器,它为每一次请求新建一个线程,如何以单例模式实例化的action类中没有类变量,则没有临界资源问题,相反,action类中定义的类变量则可能变成临界资源。如果在spring配置中,对某action类以原型方式实例化,则每一次新请求,都会新实例化一次,并为该请求新建一个线程。也就是说在这个新的线程里面,用这个新的实例去响应客户的这次请求。同样,如果action实例方法存在操作action类变量的行为,则可能引发线程问题,即对临界资源的访问问题。

实际上,我们一般把那些响应用户请求的action方法定义为无参数的形式,但是这并不能妨碍方法内部与外界与的交流,这是有其它途径,那就是通过在action方法中访问action的实例变量来获取用户给它发生的信息,也可以通过调用其他action实例方法得到信息,当然也可以是调用类变量和类方法获得信息,但这需要处理线程问题,因为类变量和类方法被所有的线程执行。