struts2、hibernate、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实例方法得到信息,当然也可以是调用类变量和类方法获得信息,但这需要处理线程问题,因为类变量和类方法被所有的线程执行。
下一篇: PS中标尺工具在哪里?标尺快捷键是什么?