框架

JAVA三大框架SSH的各自作用


使用框架的优点:使项目结构清晰、易于维护;可以提高工作效率


Struts是一个MVC框架;主要负责视图层、控制层,在视图层提供了大量的标签库,提高视图层的开发效率,在控制层使用中央控制器(Actionsupport)和配置文件(struts.xml),实现拦截用户请求、封装请求参数及页面导航。


Hibernate应用于数据持久化层,是对JDBC的轻量级封装。是一个对象关系映射(ORM)框架,使得我们能通过面向对象的方式操作数据库,大大减少数据访问的复杂度。
在项目中的主要作用就是1、解决程序与数据库的依赖,即使用了Hibernate之后,以后更改数据库不需要更改代码,因为Hibernate会根据数据库方言来生成对应的SQL语句;2、是对JDBC的轻量级封装,简化持久层的代码,提高开发速度。


Ibatis是应用于数据持久化层,是轻量级的、半自动方式的关系映射(ORM框架),sql写在xml中,结构清晰,灵活配置。


Spring是一个全方位的整合框架,在项目中对hibernate和struts进行整合,解决层与层之间的耦合问题。
Spring的作用贯穿了整个中间层,将Web层、Service层、DAO层及PO无缝整合。
Spring的IoC来实现组件之间的依赖关系注入,上层组件不会渗透到下层组件,提高组件移植性和重用性,使得程序更灵活,上层组件不依赖实现而是依赖于接口、使得实现类的变化不会影响上层组件,解决了层与层之间的藕合带来的维护或升级困难SpringAOP 是面向切面编程,实现事务处理、日志服务等与业务无关的系统服务,实现插件式编程。


Ibatis原理:
1. 根据JDBC规范与数据库建立连接;
2. 通过反射打通Java对象与数据库交互之间相互转化关系。


ibatis是一种半自动化的ORM, 需要手工编写sql ;hibernate不需要手工编写sql


事务失效情况:
springmvc的配置中,扫描controller但不要扫描service,
spring的配置中,不扫描controller。
因其加载顺序问题,会导致service的事务无效。

 

 

1.struts2大概执行流程

   1 客户端发送请求;
   2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
   3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action。FilterDispatcher的功能如下:
        (1)执行Actions
        (2)清除ActionContext
        (3)维护静态内容
        (4)清除request生命周期内的XWork的interceptors

   4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
   5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
   6 ActionProxy创建一个ActionInvocation的实例。
   7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
   8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

   action配置例子:
   <package name="login" extends="baseAction" namespace="/">
<action name="login_*" class="loginAction" method="{1}">
<result name="userLoginSuccess">/res/templet/user/templet/new/index.jsp</result>
<result name="userLoginFail">/res/templet/user/templet/new/login.jsp</result>
<result name="userLoginExitSuccess">/res/templet/user/templet/new/login.jsp</result>
</action>
   </package>

   拦截器配置例子:
   <interceptors>
        <interceptor name="userActionInter" class="com.tfl.shop.common.UserActionInterceptor"></interceptor>
       
        <interceptor-stack name="userActionInterStack">
        <interceptor-ref name="userActionInter"></interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
        </interceptor-stack>
       
   </interceptors>
----------------------
--------
web.xml可以配FilterDispatcher(从Struts 2.1.3开始,它已不推荐使用)和StrutsPrepareAndExecuteFilter这两个过滤器
FilterDispatcher是struts2.0.x到2.1.2版本的核心过滤器! StrutsPrepareAndExecuteFilter是自2.1.3开始就替代了FilterDispatcher的!
--------

默认解析的.xml文件
[struts-default.xml, struts-plugin.xml, struts.xml],如果不想使用默认名称的xml文件,可以直接在web.xml中配置config初始化参数即可。

--------
看了源代码后初步总结流程:
请求-->StrutsPrepareAndExecuteFilter.doFilter方法-->PrepareOperations.findActionMapping方法得到ActionMapping(此类存放action名、命名空间、方法名等)-->Dispatcher.serviceAction方法-->ConfigurationManager.getConfiguration方法-->创建DefaultActionProxyFactory对象-->StrutsActionProxyFactory.createActionProxy方法创建StrutsActionProxy对象-->StrutsActionProxy.execute方法-->DefaultActionInvocation.invoke方法-->递归执行所有拦截器类-->DefaultActionInvocation.invokeAction方法-->自定义的Action类中的方法-->PreResultListener(执行Result操作前的监听器)-->执行Result-->递归执行所有拦截器类-->根据配置文件返回相应的view

请求-->FilterDispatcher.doFilter方法-->ActionMapper.getMapping方法ActionMapping(此类存放action名、命名空间、方法名等)-->Dispatcher.serviceAction方法-->ConfigurationManager.getConfiguration方法-->创建DefaultActionProxyFactory对象-->StrutsActionProxyFactory.createActionProxy方法创建StrutsActionProxy对象-->StrutsActionProxy.execute方法-->DefaultActionInvocation.invoke方法-->递归执行所有拦截器类-->DefaultActionInvocation.invokeAction方法-->自定义的Action类中的方法-->PreResultListener(执行Result操作前的监听器)-->执行Result-->递归执行所有拦截器类-->根据配置文件返回相应的view

注意:
1. 流程提到的Default开头都是实现类,例如:DefaultActionProxyFactory是ActionProxyFactory(接口类)实现类;
2. StrutsActionProxy类继承DefaultActionProxy类,StrutsActionProxyFactory类继承DefaultActionProxyFactory类;
3. DefaultActionProxyFactory创建StrutsActionProxy对象而不创建DefaultActionProxy对象,整个流程不调用DefaultActionProxy.execute方法,而是调用       StrutsActionProxy.execute方法,StrutsActionProxy.execute方法中调用DefaultActionInvocation.invoke方法。

--------

拦截器可以在action方法执行前后执行一些逻辑

拦截器执行顺序:
第一个拦截器action前逻辑
第二个拦截器action前逻辑
action方法
第二个拦截器action后逻辑
第一个拦截器action后逻辑

--------

ActionMapper
ActionMapper其实是HttpServletRequest和Action调用请求的一个映射,它屏蔽了Action对于Request等javaServlet类的依赖。Struts2中它的默认实现类是DefaultActionMapper,ActionMapper很大的用处可以根据自己的需要来设计url格式,它自己也有Restful的实现,具体可以参考文档的docs\actionmapper.html。

ActionProxy&ActionInvocation
Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程。而ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。

ConfigurationProvider&Configuration
ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是尤其实现类XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。

——————————————————————

2.springMVC大概执行流程
   1.spring mvc将所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作。
   2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
   3.DispatcherServlet请请求提交到目标Controller
   4.Controller进行业务逻辑处理后,会返回一个ModelAndView
   5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
   6.视图对象负责渲染返回给客户端。

——————————————————————

3.拦截器与过滤器区别
   1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
   2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
   3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
   4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
   5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

——————————————————————

4.Hibernate大概执行流程
   1、应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息,
   2、并用这些信息生成一个SessionFactory对象,
   3、然后从SessionFactory对象生成一个Session对象,
   4、并用Session对象生成Transaction对象;
    A、可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作;
    B、在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。
   5、关闭Session
   6、关闭SesstionFactory

   hibernate工作原理:
   1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件
   2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息
   3.通过config.buildSessionFactory();//创建SessionFactory
   4.sessionFactory.openSession();//打开Sesssion
   5.session.beginTransaction();//创建事务Transation
   6.persistent operate持久化操作
   7.session.getTransaction().commit();//提交事务
   8.关闭Session
   9.关闭SesstionFactory

——————————————————————

5.spring工作原理
   1.内部最核心的就是IOC了,依赖注入,又叫控制反转,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调用对象里的方法的。  
   2.有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的模块)从而达到对一个模块扩充的功能。这些都是通过配置类达到的。

   Spring目的:
   就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置 内部通过反射去动态的组装对象)要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。Spring里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了,是一个很常用的设计模式)

——————————————————————

6.Open Session in View的作用

答:允许在每次的整个request的过程中使用同一个hibernate session,可以在这个request任何时期lazy loading数据(例如:one-many中一类中又有其他类,如果其他类数据都加载效率低)。
    注意:如果是singleSession=false的话,就不会在每次的整个request的过程中使用同一个hibernate session,而是每个数据访问都会产生各自的seesion,等于没有Open Session in View。OpenSessionInViewFilter默认是不会对session 进行flush的,并且flush mode 是 never 。

——————————————————————

7. Hibernate的get与load区别

答:区别1:如果数据库中,没有userId的对象。如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException;

区别2:load支持延迟加载,get不支持延迟加载。

——————————————————————


8. spring的IOC、AOP的使用场景
答:IOC:一般用来通过配置文件给参数赋值,比如数据源,类的一些属性等
    AOP:事务、权限管理、日志管理

——————————————————————


9. aop是什么,什么时候用aop
答:AOP是面向切面编程,是通过代理的方式为程序添加统一功能,集中解决一些公共问题
    AOP的应用:Spring声明式事务管理、日志、权限管理
    AOP通知的类型有:前通知,后通知,环绕通知,异常通知
    好处:代码比较清晰,减少了代码的重复
——————————————————————

10. Spring的AOP是用什么原理实现的?
答:动态代理和反射(个人是这么理解的)

——————————————————————

11.什么是Web Service
答:从表面上看,Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API;跨平台性,开放性!
    Web Service是一项新技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。

    从详细上看:Web Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。Web Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL等,所以Web Service可以在任何支持这些标准的环境(Windows,Linux)中使用。注:SOAP协议(Simple Object Access Protocal,简单对象访问协议),它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议。在此协议下,软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性,这有助于大量异构程序和平台之间的互操作性,从而使存在的应用程序能够被广泛的用户访问。  

  优势:  
      (1)数据交换
Web Service使数据交换更加方便,实现跨防火墙的通信。以一种最简单的方式实现异构系统之间的互通信和数据交换,且跨平台。通过Web Service把应用程序的逻辑和数据“暴露       ”出来,还可以让其它平台上的客户重用这些应用程序。
      (2)数据封装
WebService使用了XML对数据封装,对于使用者而言,他能且仅能看到该对象提供的功能列表。
      (3)应用程序集成
把用不同语言写成的、在不同平台上运行的各种程序集成起来,通过Web Service,应用程序可以用标准的方法把功能和数据“暴露”出来,供其它应用程序使用。
      (4)低成本
在实际项目开发中的开发成本是最低的,无论从软件开发人员的培训和web service产品的购买都是廉价的
   缺点:
      (1)使用了XML对数据封装,会造成大量的数据要在网络中传输。  
      (2)缺少安全性。

   Web Service执行过程 
     (1)客户通过wsdl的描述生成soap,通过http发送到服务器 
     (2)服务器解析soap,提取输入数据,执行请求的函数,返回数据 
     (3)把第2步骤的返回数据封装成soap,发送给客户端 
     (4)客户端解析soap,并根据wsdl的描述封装成响应对象 

   WSDL:Web Service 描述语言(Web Service Description Language),是一种接口定义语言,用于描述Web Service的接口信息等
   SOAP:简单对象访问协议(Simple Object Access Protocol),是一种轻量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息

   WSDL是服务接口,从外部看它就是服务提供者,没有WSDL就相当于没有服务提供者
   SOAP是服务者和消费者建立的双向通信通道,服务方提供给消费方WSDL,这是两者达成的共识。SOAP是在解析并遵守WSDL文档格式基础之上开发的
   没有WSDL文档,就无法开发SOAP

   cxf 的执行速度感觉很慢,可能的原因是 
     (1)第一次生成wsdl 
     (2)每次请求都生成soap 解析soap, 响应也要生成soap 再解析 (可能耗时比较多) 
   
   难道cxf没有缓存吗? 
      wsdl可以缓存, soap实际上也是可以缓存的,只需要合并请求参数即可 
——————————————————————
 

以下是我精心整理的文章:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值