SSHSQAjax总述

Struts1.x

简述一下Struts是什么?

Struts是MVC模式的一个优秀的实现。Struts定义了通用的Controller(控制器),通过配置文件 (一般是struts-config.xml)隔离了Model(模型)和View(视图),以Action的概念对用户请求做了封装,使代码更清晰更易读。Struts提供了自动将请求的数据填充到对象中以及页面标签等简化编码的工具。Struts使开发大型JavaWeb项目成为可能.

简述一下为什么要使用Struts?

用JSP、Servlet、JavaBean技术构建的系统非常的繁乱,所以我们需要一个规则把这些技术组织起来,Struts便应运而生。 基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件。

简述一下Struts框架的组件?

控制器组件(ActionServlet和自定义的Action)、 视图组件(JSP文件、ActionForm和Struts标签)。

简述一下过滤器?

    过滤器是向Web应用程序的请求和响应处理添加功能的Web服务器组件。

通常过滤器可以执行以下操作:

1.授权请求。

2.修改请求标题和数据。3.修改响应标题和数据

    过滤器的生命周期:1.实例化2.初始化3.过滤4.销毁

简介一下Struts中的标签库?

    Struts提供了五个标签库,即:HTML、Bean、Logic、Template和Nested。

  1. HTML 标签 用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单。
  2. Bean 标签 在访问JavaBeans 及其属性,以及定义一个新的bean 时使用。
  3. Logic 标签 管理条件产生的输出和对象集产生的循环。
  4. Template 标签 随着Tiles框架包的出现,此标记已开始减少使用。
  5. Nested 标签 增强对其他的Struts 标签的嵌套使用的能力

属性说明:

Id:命名自定义标签创建时的脚本变量名。
name:指出关键字值,在该关键字下可以找到一个存在的bean 。如果给出了scope属性,则仅仅在scope中查找。否则,根据标准的顺序在各种scope中查找:(page, request, session, or application)。
property:指出bean 中的某个属性,可以在其中检索值。如果没有标明,则使用对象本身的值。
scope:定义了Bean在哪个范围(page, request, session, or application)中被查找。如果没有标明按顺序查找。脚本变量将在相同的范围中创建。

简述一下Struts的validate框架是如何验证的?

在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。

简述一下Struts的缺点?

  1. Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现。
  2. 对Servlet的依赖性过强. Struts处理Action时必需要依赖ServletRequest 和ServletResponse,所有它摆脱不了Servlet容器。
  3. Struts 的Action仅仅允许一个实例去处理所有的请求,用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。
  4. 因为转到展示层jsp时,需要配置forward,所以添加一个展示层的jsp,就需要配置一次Struts配置文件,每次修改配置之后,要求重新部署整个项目,很不方便。
  5. 很难在Action 执行前和后的处理进行相应的处理,对事件支持也不够。

简述一下Struts的工作流程?

  1. 当客户端浏览器发送请求到ActionServlet时,ActionServlet会根据请求的路径和配置信息找到对应的ActionBean和FormBean。
  2. 然后将请求中的值填充到FormBean中,并准备ActionMapping中的Action的配置信息。
  3. 接着将请求分发至相应的ActionBean处理(ActionMapping、ActionForm、request、response)做为参数。
  4. 调用业务逻辑后,返回ActionForward对象。
  5. 最后ActionServlet根据返回的ActionForward对象转发到相应的JSP页面。

简述一下Struts的设计模式?

Struts使用了面向对象设计而且采用MVC设计模式。MVC即Model-View-Controller的缩写,是一种常用的设计模式。MVC 减弱了业务逻辑与显示逻辑之间的耦合,以及让视图层更富于变化。

简述一下Struts的错误处理机制?

  1. 编辑属性文件(在项目中添加ApplicationResources.properties资源文件,并在struts-config.xml中配置对该文件的引用)。
  2. 修改对应的Action代码(new ActionMessages对象,添加ActionMessage对象来保存错误信息,调用saveErrors()方法保存错误)。
  3. 在页面上显示报错信息(在页面上使用<html:errors>来显示错误信息,proprerty来指定错误对应的键)。

 

Struts2

简述一下 Struts2 是什么?

Struts2 是 struts 社区 和 Web Work 社区的共同成果,也可以说是:Web Work 的升级版,它采用的正是Web Work 的核心,虽然Struts2 并不是一个成熟的框架,但它构建在Web Work 的基础之上是一个 运行稳定、性能优异、设计成熟的 Web 框架。

简述一下 Struts2 的工作流程?

  1. 客户端初始化一个指向Servlet 容器的请求;
  2. 该请求经过一系列的过滤器(Filter),(这些过滤器中有一个叫做 ActionContextCleanUp 的可选过滤器,此过滤器对Sturs2与其它框架集成有很大的帮助);
  3. 接着FilterDispatcher, FilterDispatcher询问ActionMapper 来决定这个请求是否需要调用某个Action ;
  4. 如果需要调用 Action,FilterDispatcher把请求处理交给ActionProxy;
  5. ActionProxy 通过 Configuration Manager 询问框架的配置文件,找到需要调用的 Action 类;
  6. ActionProxy 创建一个 Actionlnvocation的实例;
  7. Actionlnvocation 实例使用命名模式来调用,在调用Action 的过程前后,涉及到相关的拦截器(lntercepter)的调用;
  8. 一旦Action 执行完毕,Actionlnvocation 负责根据 struts.xml 中的配置找到对应的返回结果。返回结果通常是(但也不总是,也可能是另外的一个Action 链)一个需要被表示的JSP 或者 FreeMarker的模板。

简述一下 为什么要用Struts2?

Struts2吸取了Struts1.x和WebWork的各种优点,更改了一些不足的地方,基于pojo 使我们能够更方便的针对Action编写单元测试,与Spring的集成, 基于插件的框架,大量的拦截器, 多种视图的支持。

简述一下 Struts1 。X和struts2有什么区别?

  1. Struts1要求Action类继承一个抽象基类。Struts 2 Action类可以实现一个Action接口或其他接口,也可不必实现其他接口或类。任何有execute标识的POJO对象都可以用作Struts2的Action对象。Struts2提供一个ActionSupport基类去实现常用的接口。
  2. Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。Action资源必须是线程安全的或同步的。Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)。
  3. Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。
  4. Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。Struts2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。
  5. Struts1 整合了JSTL。Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL). 
  6. Struts 1使用标准JSP机制把对象绑定到页面中来访问。Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
  7. Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。
  8. Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性。
  9. Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。

简述一下 struts2 的拦截器?

拦截器是Struts2的一个重要特性,Struts2框架的大多数核心功能都是通过它来实现的。是可以在Action被执行前和执行后拦截调用的代码。

拦截器必须实现Interceptor接口,定义了如下三个方法:

  1. init():在拦截器执行之前调用,主要用于初始化系统资源。
  2. destroty():与init()对应,用于拦截器执行之后销毁资源。
  3. intercept():拦截器的核心方法,实现具体的拦截操作。与action一样,该方法也返回一个字符串作为逻辑视图。如果拦截器成功调用了action,则返回一个真正的,也就是该action中execute()方法返回的逻辑视图,反之,则返回一个自定义的逻辑视图。

 

简述一下 struts2 如何进行数据验证的?

Strtus2在方法类定义方法进行验证,valudateXxx()方法是能进行验证,缺点:使得Action类的代码变得很繁杂不堪,其次是某些验证规则无法复用。

验证框架通过读取验证文件中定义的验证规则对输入的数据进行验证的。

验证文件必须满足以下条件:

  1. 验证文件和Action类放在相同的包中。
  2. 命名:ClassName-validation.xml或者ClassName-alias-validation.xml,

alias表示在Struts2中配置的action名字。

Struts2提供了13个内置的常用验证器(必填,必填字符串,整数(2个数字之间),日期,表达式,字段表达式,正则表达式,邮件地址验证,网址验证,visitor验证,转换验证,双精度数浮点数验证)

 

附上一段验证文件的代码,具体自己去说

<validators>
<validator>
   <!-- 验证字符串不能为空 -->
     <param>user.password==verifyPassword</param>
    <!-- 错误提示信息 -->
    <message>密码不能为空</message>
   </ validator>
<!—2种写法-->
   <!-- 验证字符串长度 -->
   <field-validator>
    <param>2</param>
    <param>20</param>
    <message>用户名长度应在2到18个字符间</message>
   </field-validator>
</field>

</validators>

简述一下 struts2 如何实现国际化?

Sturts2是通过读取资源包文件(xx.properties)来实现国际化的。

有四种方式访问资源包文件中的本地化消息:

  1. Action中访问本地化信息getText(“资源包中定义的名字”)
  2. jsp页面访问本地化信息<s:text name=”资源包中定义的名字”/>
  3. 表单标签的属性访问本地化信息<s:textfield name=”user.username” label=”%{getText(‘资源包中定义的名字’)}”/>
  4. 在资源文件中访问本地化信息。

Email=”邮件地址”;

error.email.invalid=${getText(“email”)}格式错误;

简述一下 struts2 的标签库?

Struts 2框架的标签库可以分为以下3类。

  1. 用户界面标签(UI标签):主要用来生成HTML元素的标签。
  2. 非用户界面标签:主要用于数据访问、逻辑控制等。
  3. AJAX标签:AJAX是Web 2.0阶段系列技术和相关产品服务中非常重要的一种技术,其全称是异步JavaScript和XML(即Asynchronous JavaScript and XML)。该标签用来支持AJAX技术。

其中,用户界面标签(UI标签),可以分为下面两类。

1)表单标签:表单标签主要用于生成HTML页面的Form元素,以及普通表单元素的标签。

2)非表单标签:非表单标签主要用于生成页面上的tree、Tab页等。

非界面标签,即非UI标签,也可以分为以下两类。

1)数据访问标签:主要包含用于输出值栈(ValueStack)中的值、完成国际化等功能的标签。

2)流程控制标签:主要包含用于实现分支、循环等流程控制的标签。

 

简述一下 struts2 的类型转换?

一、局部类型转换

  1. 名称格式:action类名+conversion.properties
  2. 位置:放在与之相对应action类的同包下
  3. properties文件内容格式:转换属性=转换处理类
  4. 转换处理类:继承StrutsTypeConverter实现convertFromString方法和convertToString方法
  5. 具体处理流程:

1)       输入:HTML表单提交—>Action类处理—>执行属性setter方法—>如果需要类型转换—>找到properties文件—>按照properties设置找到对应的转换类,调用其中convertFromString转换方法—>把返回值通过setter方法给action中属性赋值。

2)       输出:Action类处理—>执行属性getter方法—>如果需要类型转换—>找到properties文件—>按照properties设置找到对应的转换类,调用其中convertToString转换方法—>把返回值通过getter方法输出到页面。

二、全局类型转换(页面中所有用到改bean的都会被类型转换)

  1. 名称格式:xwork-conversion.properties
  2. 位置:src根目录下
  3. properties文件内容格式:bean类=转换处理类

 

简述一下 struts2 的OGNl?

OGNL是一种表达式语言,通过一致性的表达式语法来读取和设置JAVA对象的属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能。

OGNL中的#、%和$

Spring

简述一下什么是Spring?

Spring是一个开源框架,是为了解决企业应用程序开发复杂性和臃肿性而创建的。Spring 技术能构建轻量级的、强壮的 J2EE 应用程序,它主要的原理是:动态代理。核心是控制反转和AOP面向切面编程。

Spring包含七个组件:Spring AOP,Spring ORM,Spring DAO,Spring Web,Spring Context,Spring MVC,Spring Core

简述一下为什么要用spring?

Spring即是一个AOP框架,也是一个IOC容器。Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。

简述一下Spring中 AOP 和IOC的概念以及在spring中是如何应用的?

AOP Aspect Oriented Programming,面向方面编程。更大程度上的降低程序调用者和被调用者之间的耦合性。如Spring的 TransactionInterceptor可以实现数据库库操作中事务的容器管理,而不用开发人员关心这些重复性的工作。

IoC  Inversion of Control,控制反转。将自己模块交给容器去控制,而不是由模块本身去处理。如Spring中的Bean的概念,开发人员将自己开发的Bean能过配置通知容器,容器可帮开发者加载、实例化,而不用开发者手动进行。

说说为什么要用AOP和IOC?

AOP 让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务  (比 如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。

IOC 允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词 倒置 所表明的,IOC 就像反 过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每一个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaborator)。

介绍一下spring依赖注入?

依赖注入是控制反转实现的一种,其实说白了spring中的Ioc就是通过配置文件完成对Bean的统一管理,依赖注入就是把原先在一起但没必要在一起的两样东西分开,但是他们毕竟还是有关系的,所以我们就用胶水把他们再粘到一起。整个就是没事找事。

介绍一下 Spring 声明式事务?

Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。

我们在使用Spring声明式事务时,有一个非常重要的概念就是事务属性。

事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成。我们在进行事务划分时,需要进行事务定义,也就是配置事务的属性。

Spring在TransactionDefinition接口中定义这些属性,以供PlatfromTransactionManager使用, PlatfromTransactionManager是spring事务管理的核心接口。

简述一下Spring事务管理的原理及实现?

Spring 中进行事务管理的通常方式是利用AOP(面向切片编程)的方式,为普通java类封装事务控制,它是通过动态代理实现的,由于接口是延迟实例化的, spring在这段时间内通过拦截器,加载事务切片。

简述一下Spring事务代理方式?

一种是类代理方式,另一种是接口代理方式。在Spring的配置文件中可以指定代理方式,目前我们使用的都是类代理方式。

简述Spring的事务传播行为?

  1. PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  2. PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
  3. PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
  4. PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
  5. PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  6. PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

简述一下Spring 隔离级别?

  1. ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应。
  2. ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
  3. ISOLATION_READ_COMMITTED 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
  4. ISOLATION_REPEATABLE_READ 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
  5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

Spring 提倡面向接口编程,请讲一下你对它的理解,它有什么好处?

在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。

简单描述Spring Framework与Struts的不同之处,整合Spring与Struts有哪些方法,哪种最好,为什么?

Spring是完整的一站式框架,而Struts仅是MVC框架,且着重于MVC中的C。Spring有三种方式整合Struts:使用 Spring 的 ActionSupport 类整合 Struts;使用 Spring 的 DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor;将 Struts Action 管理委托给 Spring 框架,动作委托最好。

 

Hibernate

Hibernate 是什么?

Hibernate是一个开源的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装;

Java程序员可以以面向对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,来完成数据持久化的重任。

它是连接 Java 应用程序和关系数据库的中间件;

在分层的软件架构中它位于持久化层,封装了所有数据访问细节,使业务逻辑层可以专注于实现业务逻辑。

Hibernate 工作原理?

  1. 服务器一启动加载Hibernate.cfg.xml配置文件
  2. 加载对象关系映射文件(ORM),创建SessionFacoty(初始化Hibernate)
  3. 打开Session(建立与数据库的连接);
  4. 开启事务(Hibernate的增删改(CRUD中除R)都是由事务来管理的)
  5. 持久化操作
  6. 提交事务
  7. 关闭连接Session
  8. 关闭SessionFacoty

为什么要用Hibernate?

它可大大减少我们Dao层(重复代码)的编写。Hibernate提供了缓存机制,延迟加载,性能好。它的一个最大的好处就是我们可以已面向对象的方式去系统分析,系统设计。其中最重要的一点就是它是采用对象关系映射机制,支持多种关系型数据库。

Hibernate 如何延迟加载?

分为属性延迟,实体延迟,集合延迟。

  1. 首先,通过设置Class的lazy属性为true,来开启实体的延迟加载特性。
  2. 当我们在执行session.load()方法查询数据的时候,此时并没有真正的查询数据,而是返回该实体的代理类对象,并没有存到内存中。
  3. 而当我们要得到该对象的某些数据时看该属性是否有值,如果没有才去执行相应的Sql语句,再把查出来的对象付给代理类对象,此时内存中就存在。

Hibernate 的缓存机制?

缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。

缓存的介质一般是内存,所以读写速度很快. 但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。

Hibernate的缓存包括Session缓存和SessionFactory的缓存, 其中SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。SessionFactory的外置缓存也被称为Hibernate的第二级缓存.

Hibernate 的事务管理?

Hibernate有三种事务
1. JDBC 2. JTA事务 3. CMT事务
在这三种事务中,JDBC事务是默认的。这就意味着如果未设置hibernate.properties文件中的hibernate.transaction_factory的键值,beginTransaction将返回一个JDBC事务。 虽然一个会话中可以包含多个事务,但并不需要人为地对这些事务进行分割,而是由会话中的一些方法对多个事务进行管理的。下面将详细描述这些方法:

commit()方法是结束事务的两个方法。在这方法在内部调用了会话对象的save()方法。当调用这个方法时,如果这个事务已经被初始化,那么这个事务将成功提交。

Hibernate 的查询方式?

自带的通过主键得到对象get()和load();

原生Sql、,object comptosition
Hql:
1、 属性查询
2、 参数查询、命名参数查询
3、 关联查询
4、 分页查询
5、 统计函数

Criteria

如何优化Hibernate?

  1. 使用双向一对多关联,不使用单向一对多
  2. 灵活使用单向一对多关联
  3. 不用一对一,用多对一取代
  4. 配置对象缓存,不使用集合缓存
  5. 一对多集合使用Bag,多对多集合使用Set
  6. 继承类使用显式多态
  7. 表字段要少,表关联不要怕多,有二级缓存撑腰

Hibernate 的核心接口?

一共有5个,分别为:Session、SessionFactory、Transaction、Query和Configuration.这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。

  1. Session接口:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession.这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSesion对象称为用户session.
  2. SessionFactory接口:SessionFactroy接口负责初始化Hibernate.它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory.
  3. Configuration接口:Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory.
  4. Transaction接口:Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。
  5. Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。继承HibernateDaoSupport类来简化操作,调用getHibernateTemplate()方法来返回HibernateTemplate。

Spring 事务 与 Hibernate事务的区别?

  1. Spring 事务:

对于传统的基于特定事务资源的事务处理而言(如基于JDBC的数据库访问),Spring并不会对其产生什么影响我们照样可以成功编写并运行这样的代码。同时Spring还提供了一些辅助类可供我们选择使用,这些辅助类简化了传统的数据库操作流程,在一定程度上节省了工作量,提高了编码效率。

对于依赖容器容器的参数化事务而言,Spring表现出了极大地价值。Spring也是一个容器,只是相对EJB而言,Spring显得更加轻巧。我们无需付出其他方面的代价,即可通过Spring 实现基于容器的事务管理(从本质上,Spring的事务管理师基于动态AOP)。

  1. Hibernate 事务:

Hibernate是基于JDBC 的轻量级对象封装,Hibernate 本身不具备Transaction 处理功能,Hibernate的事务 实际上是 JDBC 的 Transaction封装或者 JTATransaction 的封装。

具体分析如下:

Hibernate Transaction 可以配置 JDBC Transaction 或者JTATransaction这取决与你在Hibernate.properties中的配置。

 

Ajax

介绍一下Ajax?

AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。

是基于多种技术集成衍变过来的。它主要用于异步获取数据,实现页面局部刷新。

xmlHttpRequest=createXmlHttpRequest();

xmlHttpRequest.onreadystatechange=function haolejiaowo(){

    if(xmlHttpRequest.readyState==4&&xmlHttpRequest.status==200)

{

    Alert(xmlHttpRequest.responseText);

}

}

xmlHttpRequest.open(“GET”,url,true)—true代表异步

xmlHttpRequest.send(null)

由于其具有异步的数据请求和Web页面数据的无刷新改变特性,广泛应用于Web 应用程序。

缺点 :它可能破坏浏览器后退按钮的正常行为。在动态更新页面的情况下,用户无法回到前一个页面状态。

原理 :使用XMLHttpRequest 再配合XML进行异步数据接收与操作,然后再使用DOM对象模型动态显示和交互.

 

MS-SQL 数据库

如何设计数据库,数据库设计的三大范式?

  1. 确保每列的原子性,就是每列都是不可再分的最小数据单元。
  2. 确保表中的除主键以外每列都和主键相关。
  3. 确保每列都和主键列直接相关,而不是间接相关。

数据库如何优化查询?

  1. 合理使用索引。在经常进行连接,但是没有指定为外键的列上建立索引。在频繁进行排序或分组的列上建立索引。
  2. 应当简化或避免对大型表进行重复的排序。
  3. 避免相关子查询,而采用联接查询。
  4. 使用临时表加速查询,把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。

什么是存储过程?用什么来调用?

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。

调用存储过程语法:exec 存储过程名 [@接收参数 output],输入值1,输入值2

索引的作用?和它的优点缺点是什么?什么情况下需要建立索引?

索引是一个数据结构,用来快速访问数据库表格或者视图里的数据。

优点是大大加快数据的检索速度,加速表和表之间的连接。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

当该列用于频繁搜索或该列用于对数据进行排序,可考虑建立索引。

什么是事务?什么是锁?

事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

锁:在所有的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?

我会尽可能先使用约束,如主键,外键,check,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。

你能向我简要叙述一下SQL Server 2000中使用的一些数据库对象吗?

表格、视图、用户定义的函数,以及存储过程,触发器

什么是触发器?

触发器是一种特殊的存储过程,并且具有事务的功能,能在多表之间执行特殊的业务规则或保持复杂的数据逻辑关系。在对表进行插入、更新、删除操作时自动执行的存储过程,当出现@@ERROR时,会自动回滚。不能直接调用。

触发器的特殊表?

每个触发器有两个特殊的表:inserted表(保存被插入或被更新后的记录)、deleted表(保存被删除或被更新前的记录),属于系统表,只读的。更新语句将类似于先删除再插入。

自定义函数与存储过程的区别?

自定义函数:有且只有一个返回值,就像普通的函数一样,可以直接在表达式中嵌入调用。 存储过程:可以没有返回值,也可以有任意个输出参数,必须单独调用。

今天面试通知的一道题目:

请编程解决如下难题:

前提:
1、有五栋五种颜色的房子
2、每一位房子的主人国籍都不同
3、这五个人每人只喝一种饮料,只抽一种牌子的香烟,只养一种宠物
4、没有人有相同的宠物,抽相同牌子的香烟,喝相同的饮料
提示:
1、英国人住在红房子里
2、瑞典人养了一条狗
3、丹麦人喝茶
4、绿房子在白房子左边(不一定挨在一起)
5、绿房子主人喝咖啡
6、抽PALL MALL烟的人养了一只鸟
7、黄房子主人抽DUNHILL烟
8、住在中间那间房子的人喝牛奶
9、挪威人住第一间房子
10、抽混合烟的人住在养猫人的旁边
11、养马人住在抽DUNHILL烟的人旁边
12、抽BLUE MASTER烟的人喝啤酒
13、德国人抽PRINCE烟
14、挪威人住在蓝房子旁边
15、抽混合烟的人的邻居喝矿泉水
问题是:谁养鱼?

答案:

一 二 三 四 五

黄 蓝 红 绿 白

挪 丹 英 德 瑞

矿 茶 奶 咖 啤

DUN 混 PALL PRI BLUE

猫 马 鸟 鱼 狗

 

首先先排好顺序1到5,然后把挪威人放到1号里,然后可以看出二号房子是蓝的和3号房子的人喝牛奶,然后是绿的在白的左边说明绿的只可能在3号或者4号因为2号是蓝的。

 

又因为绿房子里的人和咖啡所以绿的不是3号房子而是4号,所以白的是5号 然后知道1号是黄色,然后就知道挪威人抽DUNHILL,而且知道2号养马。

 

然后看和啤酒的人抽BLUE MASTER香烟,两个都还空着的这时只剩下5号和2号,如果是2号喝啤酒的话那么抽混合烟的人就没地方放了,因为还剩下茶和矿泉水,而且茶不能放在1号,因为喝茶的是丹麦人,所以混和烟没办法放到矿泉水旁边,所以5号喝啤酒。然后得出2号住丹麦人喝查抽混合烟,挪威人喝矿泉水,然后说明5号是瑞典人因为德国人抽PRINCE,还可以得出住4号绿房子的是德国人,抽的是PRINCE。所以剩下的一种烟PALL MALL就是英国人抽了,而且说明英国人养了鸟,然后得出挪威人养猫,瑞典人养的是狗。

 

所以最后只剩德国人养鱼。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值