A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

270261733

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 270261733 初级黑马   /  2015-3-15 16:28  /  4314 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

20黑马币
谈谈你对Struts   Hibernate       Spring的理解。

最佳答案

查看完整内容

struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。我们可以在web.xml文件中将符合某种特征的所有请求交给这个Servlet处理,这个Servlet再参照一个配置文件(通常为/WEB-INF/struts-config.xml)将各个请求分别分配给不同的action去处理。 一个扩展知识点:struts的配置文件可以有多个,可以按模块配置各自的配置文件,这样可以防止配置文件的过 ...

7 个回复

倒序浏览
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. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象、建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一个结果,程序上一个时刻和下一个时刻的运行结果的差异就表现在内存中的对象状态发生了变化。

     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查询。

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>

回复 使用道具 举报
在SSH框架中spring充当了管理容器的角色。我们都知道Hibernate用来做持久层,因

为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语

句。Struts是用来做应用层的,他它负责调用业务逻辑serivce层。所以SSH框架的流程大致

是:Jsp页面----Struts------Service(业务逻辑处理类)---Hibernate(左到右)struts

负责控制Service(业务逻辑处理类),从而控制了Service的生命周期,这样层与层之间的

依赖和强,属于耦合。这时,使用spring框架就起到了控制Action对象(Strus中的)和

Service类的作用,两者之间的关系就松散了,Spring的Ioc机制(控制反转和依赖注入)正

是用在此处。

Spring的Ioc(控制反转和依赖注入)

控制反转:就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直

接操控。

依赖注入:组件之间的依赖关系由容器在运行期决定 ,由容器动态的将某种依赖关系注

入到组件之中。

从上面我们不难看出:从头到尾Action仅仅是充当了Service的控制工具,这些具体的

业务方法是怎样实现的,他根本就不会管,也不会问,他只要知道这些业务实现类所提供的

方法接口就可以了。而在以往单独使用Struts框架的时候,所有的业务方法类的生命周期,

甚至是一些业务流程都是由Action来控制的。层与层之间耦合性太紧密了,既降低了数据访

问的效率又使业务逻辑看起来很复杂,代码量也很多。,Spring容器控制所有Action对象和

业务逻辑类的生命周期,由与上层不再控制下层的生命周期,层与层之间实现了完全脱耦,

使程序运行起来效率更高,维护起来也方便。

使用Spring的第二个好处(AOP应用):

事务的处理:

在以往的JDBCTemplate中事务提交成功,异常处理都是通过Try/Catch 来完成,而在

Spring中。Spring容器集成了TransactionTemplate,她封装了所有对事务处理的功能,

包括异常时事务回滚,操作成功时数据提交等复杂业务功能。这都是由Spring容器来管理,

大大减少了程序员的代码量,也对事务有了很好的管理控制。Hibernate中也有对事务的管

理,hibernate中事务管理是通过SessionFactory创建和维护Session来完成。而Spring对

SessionFactory配置也进行了整合,不需要在通过hibernate.cfg.xml来对

SessionaFactory进行设定。这样的话就可以很好的利用Sping对事务管理强大功能。避免

了每次对数据操作都要现获得Session实例来启动事务/提交/回滚事务还有繁琐的

Try/Catch操作。这些也就是Spring中的AOP(面向切面编程)机制很好的应用。一方面使

开发业务逻辑更清晰、专业分工更加容易进行。另一方面就是应用Spirng  AOP隔离降低了

程序的耦合性使我们可以在不同的应用中将各个切面结合起来使用大大提高了代码重用度。
回复 使用道具 举报
首先hibernate是一个持久层框架,轻量级(性能好),orm映射灵活,对表与表的映射关系处理的很完善,对jdbc做了良好的封装,使得我们开发时与数据库交互不需要编写大量的sql语句。
     而struts是一个mvc的web层框架,底层是对servlet的大量封装,拥有强大的拦截器机制,主要负责调用业务逻辑Service层。  

      三大框架的大致流程jsp->struts->service->hibernate。因为struts负责调用Service从而控制了Service的生命周期,使得层次之间的依赖加强,也就是耦合。
      所以我们引用了spring,spring在框架中充当容器的角色,用于维护各个层次之间的关系。通过IOC反转控制DI依赖注入完成各个层之间的注入,使得层与层之间实现完全脱耦,增加运行效率利于维护。
       并且spring的AOP面向切面编程,实现在不改变代码的情况下完成对方法的增强。比较常用的就是spring的声明式事务管理,底层通过AOP实现,避免了我们每次都要手动开启事物,提交事务的重复性代码,使得开发逻辑更加清晰。
回复 使用道具 举报
Struts工作机制
   Struts的工作流程:
  在web应用启动时就会加载初始化ActionServlet,ActionServlet从
  struts-config.xml文件中读取配置信息,把它们存放到各种配置对象
  当ActionServlet接收到一个客户请求时,将执行如下流程.
    1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;
    2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
    3)根据配置信息决定是否需要表单验证.如果需要验证,就调ActionForm的validate()方法;
    4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象,就表示表单验证成功;
    5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;
    6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给                               ActionForward对象指向的JSP组件;
    7)ActionForward对象指向JSP组件生成动态网页,返回给客户;

spring工作机制

1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负

责负责对请求进行真正的处理工作。
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
3.DispatcherServlet请请求提交到目标Controller
4.Controller进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6.视图对象负责渲染返回给客户端。

Hibernate工作原理

1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory

为什么要用:

1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作。
3.hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4.hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
回复 使用道具 举报
貌似很那解决阿
回复 使用道具 举报

有点难。。。。
回复 使用道具 举报
我的回答还可以吧,兄弟   给分咯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马