javaweb理论

final、finally、finalize区别

final关键字可以用于类,方法,变量前,用于表示该关键词修饰的类,方法,变量具有不可变的特性。

  • final关键字用于基本数据类型前:这事表明该关键字修饰的变量是一个常量,在定义后该变量的值不能被修改
  • final关键字用于方法声明前:这时意味着该方法是最终方法,只能被调用,不能被覆盖,但是可以被重载
  • final关键字用于类名前:此时该类被称为最终类,不能被其他类继承

finally 当代码抛出一个异常的时候,就会终止方法中剩余代码的处理,并退出这个方法的执行,这个时候如果资源文件被打开没有关闭,就会产生资源回收问题,这个时候我们就可以把关闭语句放在finally中,无论是否遇到异常退出,都会执行关闭语句,保证了资源的合理回收

fnalize方法来自于java.lang.Object,用于回收资源

运行时异常和编译时异常区别?

运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指异常)IndexOutOfBoundsException(下标越界异常),这些异常是不检查异常,程序中可以选择捕获异常,也可以不处理,这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生,java编译器不会检查它,当程序出现这类异常的时候即使灭有进行处理,编译也会通过
编译时异常:是RuntimeException以外的异常,类型上都属于Exception类及其子类,是必须处理的异常,如果不处理就编译不通过无法运行程序

throw和throws区别

throw是语句抛出的一个异常,抛出的是一个对象
语法:throw(异常对象)
throws是方法可能抛出的异常的声明
语法:[(修饰符)(返回值类型)(方法名)([参数列表])[thows(异常类)]{…}
public void doA(int a) throws Exception1,Exception3{……}

String和StringBuffer和StringBuilder区别

String 字符串常量,是不可变的一个对象
StringBuffer是字符串变量(线程安全)是可变长度的字符串,缓冲区默认为16位,主要操作是append和insert方法,可重载这些方法,以接受任何类型的数据,通过append添加字符串,通过insert在指定位置添加字符,
StringBuilde是字符串常量(非线程安全),这个比StringBuffer效率快,两者的方法基本相同

如何获取随机整数?如何获取随机小数?

java.util.Random: //获取随机整数 :nextint(int i)
java.lang.Math.random();获取0-1之间随机小数

线程和进程区别?

  • 一个程序至少有一个进程,一个进程至少有一个线程
  • 线程的划分尺度小于进程,使得多线程程序的并发性高
  • 进程的执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序运行的效率
  • 每个独立的线程有一个程序的运行入口,顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程控制
  • 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行,但操作系统并没有多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配

如何开启一个线程?

方法一: 继承Thread类
步骤:

  • 定义一个类A继承于java.lang.Thread类
  • 在A类中覆盖Thread类中的run方法
  • 在run里面写入要执行的代码
  • 创建一个线程对象,调用线程对象的start方法

方法二:实现Runnable接口*
步骤与继承Thread类一样
注意start()是启动一个线程,当调用start()方法时,系统才会开启一个新的线程,如果调用run()启动线程,并未真正的开启线程,反而会阻塞线程

wait() sleep()区别?

wait()是等待,Object中的方法,只能在同步方法或者同步块中使用,如果不调用notify()或者notifyAll()方法唤醒指定的线程,则不会进入运行状态
sleep()是线程类的方法,调用会暂停此线程指定的时间,到时间之后会自动恢复继续执行下面的代码

ArrayList、Vector、LinkedList区别?

ArrayList是一个可以改变大小的数组内部的元素可以直接通过get与set方法进行访问
LinkedList是一个双链表,在添加,删除,修改元素是,比ArrayList性能高,但是在get与set方面比ArrayList低
Vector属于强同步类,与ArrayList基本完全相同,线程安全但效率低

Collection和Collections区别:

Conllection是一个集合的接口,它提供了对集合对象进行基本操的通用接口方法,它的意义是为各种集合提供最大化的统一操作方法
Conllections是一个包装类,它包含了各种有关集合操作的静态多态方法,它无法实例化,相当于一个工具类

HashMap 和Hashtable 区别?

HsahMap未经同步,可以为null值
Hashtable的方法是同步的,不允许为null值

char型变量中能不能存贮一个中文汉字?为什么?

char型变量是用来存储Unicode编码的字符的,Unicode编码字符集中包含了汉字,所以char型变量中可以存储汉字,但是如果一些特殊的字符没有在Unicode编码字符集中,则不能存储这个特殊的汉字。

Get和Post的区别

  • get传送的数据量小,不能大于2kb。post数据量较大,一般不受显示,上传文件是,只能用post不能用get
  • get安全性比post安全性低,但是执行效率比post方法高
  • get是把参数数据队列加到提交表单的action属性所指的URL中,post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到action属性所指的URL地址

Forword(请求转发)与Redirect(重定向) 的区别

从地址栏显示说:
请求转发是一次请求,重定向是两次请求
从数据共享说:
转发页面和转发到的页面可以共享request里面的数据
重定向不能共享数据
从运用地方说
请求转发一般用于用户登录的时候,根据角色转发到相应的模块
重定向一般用于用户注销登录返回主页面和跳转到其他的网站等
从效率来说
请求效率高,重定向效率低

request.getSession()reqeust.getSession(false)request.getSession(true) 的区别

getSession()/getSession(true):当session作用域存在的时候,就返回一个session,如果不存在,就新建一个session并返回该对象
getSession(false)当session存在时返回一个session,不存在则返回null

Page和PageContext的区别

page对象是当前页面转换后的servlet类的实类,作用返回是同一页面
pageContext该对象表示jsp页面的上下文,使用该对象可以访问页面中的共享数据,可以通过setAttribute()和getAttribute来设置和存放对象的值

java 反射 getDeclaredField()和getField()的区别

getDeclaredField是可以获取一个类的所有字段.
getField只能获取类的public 字段.

JSP9大隐视对象中四个作用域的大小与作用范围

pageContext作用域仅限当前页面对象,可以近似于理解为java的this对象,离开当前jsp页面则pageContext中的所有属性值就会丢失。
request作用域是同一个请求之内,在页面跳转是,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值,如果通过redirect方式进行页面跳转,由于redirect相当于重新发出的请求,此种情境下,request中的属性值会丢失
session的作用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失
application最用域是最大的,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享

JDBC连接数据库步骤

  • 加载JDBC驱动程序
    通过Class类的forName方法实现,并将驱动地址放进去,成功加载后,会想Driver类的实例注册到DriverManager类中

  • 提供JDBC连接的URL,创建数据库的链接
    要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接
    使用DriverManager的getConnection()方法传入指定的欲连接的数据库的路径,数据库的用户名和密码
    Connection con = DriverManager.getConnection(url,username,password);

  • 创建一个Statement
    要执行sql语句,必须获得java.sql.Statement实例
    执行静态sql语句,通常通过Statement实例实现
    执行动态sql语句,通常通过PreparedStatement实例实现

  • 执行sql语句
    Statement接口提供了executeQuery、executeUpdate、execute三种方法
    executeQuery 执行select语句,返回ResultSet 结果集
    executeUpdate 执行insert update delete 语句

主键和唯一索引的区别

  • 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
  • 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
  • 唯一性索引列允许为控制,主键不允许为空值 主键在创建是,已经默认为空值+唯一性索引了
  • 主键可以被其他表引用为外键,而唯一索引不能 一个表最多只能创建一个主键,但可以创建多个唯一索引
  • 主键更舍和那些不容易更改的唯一标识,如自动递增,身份证号等
  • 在RBO的模式下,主键的执行计划优先级要高于唯一索引,两者可以提高查询速度

Prepared statement和statement的区别

PreparedStatement提高了代码的灵活性和执行效率,它是Statement接口的子接口,他继承了Statement接口的所有功能,主要是那列解决我们使用Statement对象多次执行同一个Sql语句的效率问题,ParperStatement接口可以支持预编译
还可以提高程序的安全性 防止sql注入,因为Prepared statement是用‘?’传参,具有安全性,而statement用的是‘+’字符串拼接,安全性较低。

数据库三范式

第一范式:数据库表中的所有字段值都是不在分解的原子性
第二范式:需要确保数据库表中的每一行记录都和主键相关,而不能只与主键的某一部分相关
第三范式:表之间如果有关联关系需要在字表建立外键

存储过程概述

可以包含逻辑判断的slq语句集合
是经过预编译,存在于数据库中
通过调用指定存储过程的名字(可有参,可无参)来执行

事务的概述

 在数据库中,所谓的事务是指一组逻辑操作单元即一组slq语句,当这个单元中的一部分操作失败,整个事务回滚,只有全部正确才完成提交
  • 原子性 事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
  • 一致性 事务必须使数据库从一个一致性状态转换到另一个一致性状态
  • 隔离性 一个事务的执行不能被其他事务所干扰
  • 持久性 一个事务一旦被提交,它对数据库中的数据改变将是永久性的

Class.forName的作用?为什么要用?

加载类:
返回与给定的字符串名称相关联类或接口的Class对象 一般使用这个方法是反射方式创建Class对象,从而可以将一些信息写在文件中,避免硬编码,增加灵活性

cookie被禁止后怎样使用session?

url重写,对所有页面涉及到的连接都是用url重写方式,从而将jsessionId以参数的方式连接到url后面,保证每次页面提交时服务器都能获得sessionID,从而维持和客户端的状态

数据库连接池的原理。为什么要使用连接池

  • 数据库连接是一件费时的操作,连接池可以使多个操作共享一个连接
  • 数据库连接池的饿基本思想就是为数据库连接建立一个缓冲池,预先在缓冲池中放入一定连接数量,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去,我们可以通过设定连接池最大连接数来防止系统无尽的雨数据库连接。
  • 使用连接池是为了提高对数据库连接资源的管理

jsp是如何被容器调用和执行的?

  • 有jsp引擎将jsp页面翻译成java代码
  • 将java代码编译成class字节码文件
  • 加载到容器
  • 由容器实例化成对象
  • 初始化阶段相关的方式是jspInit()
  • 请求到达,调用服务阶段相关方法是jspService()
  • 销毁阶段相关方法是jspDestroy()

编写一个servlet的步骤

  • 新建一个类继承与HttpServlet
  • 重写其中的doGet 和 doPost方法
  • 完成servlet的注册 在web.xml中加入标记

为什么要为servlet配置URL映射?

Servlet注册包括两部分,第一,容器如何找到Servlet,利用

Servlet名字
Servlet类的全路径

完成。
第二,客户端如何找到当前的Servlet。利用

Servlet名字
客户端请求路径

完成。
配置URL的主要作用是客户端通过什么路径能去找到Servlet

谈谈servlet的生命周期?

  • 容器装载并实例化servlet
  • 调用init()方法完成servlet初始化
  • 当请求到达时,调用service()方法处理请求,产生响应
  • 销毁阶段调用destroy()方法完成清理工作

servlet是线程安全的吗?为什么?

不安全。因为Servlet对象在整个过程中,至始至终只有一个对象。以节约服务器资源的消耗,这就意味着很多个线程会同时访问一个Servlet对象。所以线程不安全。

你是如何处理servlet线程安全问题的?

解决Servlet线程安全问题方法有三种
1)编写Servlet类的时候,实现SingleThreadModel接口,将Servlet变成单线程机制。
2)涉及对共享资源访问的时候,使用synchronized同步加锁,实现共享资源的保护。
3)尽量不在Servlet中定义成员变量,使用局部变量。
在三种方法中,最好使用第三种,这样线程安全,并且性能最高。

如何得到客户端的请求参数?

request.getParameter()单个数据
request.getParameterValues()一组数据

request.getParameter和request.getParameterValues的区别,它们的返回值是什么类型?

request.getParameter获得单个表单的数据。返回值是String类型。而request.getParameterValues()是获得表单元素名相同的一组数据。返回值是String[]数组。

response对象的作用?

Response对象是对服务器的响应信息作出的一个封装对象。主要作用有:
1)可以从response中获得输出流对象,从而可以向客户端输出信息
2)可以实现重定向,response.sendRedirect();
3)可以实现URL重写

session和cookie有什么区别

  • session保存在服务器中,客户端不知道它的信息,而cookie保存在客户端中,服务器知道其中的信息
  • session中保存的是对象,而cookie中保存的是字符串
  • session是不能区分路径的,而一个客户在访问web服务器之间,在任何地方都能访问到session中保存的信息,而cookie如果设置了路径参数,同一个网站下的不同路径cooke互相访问不到

在servlet中定义成员变量(全局变量),有线程安全问题吗?

有,避免使用实例变量是保证servlet线程安全的最佳选择,每个线程有自己私有的栈空间,方法中的临时变量实在栈上分配空间,他们不会影响线程的安全。

MVC设计模式的概念,好处!

M 模型层:专注于处理业务逻辑和业务数据,它可以为多个视图准备数据,提高了应用的可重用性。
V 视图层:用户看到的并与系统交互的界面,接受用户数据,向用户显示相关的数据。
C 控制层:是模型层和视图层联系的纽带,接收视图层提交的请求,调用模型层的业务逻辑,根据业务逻辑的调用结果,控制系统转发的页面
好处:实现了业务逻辑和页面显示处理的分离,J2EE架构实现了业务逻辑和数据存储的分离,界面显示和业务逻辑的分离,各层之间不受影响

过滤器的作用

过滤器允许你拦截请求,还可以允许你控制响应,,还可以能够对请求头,响应头,消息体的数据进行更改,同时,还可以对返回的流信息进行压缩,项目中使用字符编码格式的处理使用了过滤器,过滤器需要在web.xml容器中进行注册,才能被web容器识别

说明Struts2框架的工作原理。

(1)客户端向服务器端提交请求,容器初始化HttpServletRequest请求对象。
(2)请求对象被一系列的Servlet过滤器过滤,Struts2中的过滤器有三种。
(3)FilterDispatcher过滤器调用ActionMapper,决定该请求是否需要调用某个Action。
(4)如果请求需要调用某个Action,ActionMapper将通知FilterDispatcher过滤器把请求的对象交给ActionProxy来处理。
(5)ActionProxy通过Configuration Manager 解析框架的配置文件struts.xml,找到需要调用的Action类。
(6)ActionProxy创建一个ActionInvocation实例。
(7)ActionInvocation实例使用命令模式回调Action中的execute()方法,Action调用业务逻辑类完成业务逻辑处理。在调用Action的前后,将调用该Action实际的相关拦截器(Interceptor)。
(8) Action执行完毕,ActionInvocation根据struts.xml中的配置找到相应的返回结果(成为Result)。

Struts2中有哪三层控制器?分别有什么作用?

(1) 过滤器:过滤器是Struts2控制器的最前端控制器,请求对象首先被过滤器过滤。
(2) 拦截器:拦截器(Interceptor)是Struts2中第二个层次的控制器,能够在Action执行前后运行一些Action类需要的通用功能。
(3) Action: Action 是Struts2的第三个层次的控制器,需要程序员自行开发。Action是Struts2应用中使用数量最多的控制器,调用业务逻辑,执行业务操作,根据执行结果返回结果视图,实现页面导航,被称为业务控制器。

struts2是如何管理action的?

struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的。
主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。

如何设置一个包的默认拦截器引用?

为一个包指定默认拦截器引用,可以在struts.xml中进行如下配置:
< package name=”chapter01”extends=”struts-default”>


其中default-interceptor-ref的name值可以是拦截器的名字,也可以是拦截器栈的名字。

如何编写并配置自定义的拦截器?

自定义拦截器的步骤如下:
(1)创建类实现Interceptor接口。
(2)覆盖Interceptor接口中的方法,重点实现intercept方法,定义拦截功能。
(3)在标签中使用元素定义拦截器,为拦截器类制定一个名字。
(4)在需要使用该拦截器的Action中使用标签引用拦截器的名字即可使用。

拦截器栈和拦截器有什么区别和联系?

拦截器栈是若干个拦截器的集合,如果某些拦截器总是按照一定的顺序一起工作,那么就可以把这些拦截器组织成一个拦截器栈,通过引用拦截器栈,就可以使用到拦截器栈中的所有拦截器。

拦截器和过滤器的区别

1、拦截器是基于java反射机制的。
2、过滤器依赖于servlet容器.
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

Action接口有什么?

Action接口中定义了五个常量和一个方法。五个常量都是字符串类型,分别是ERROR、INPUT、LOGIN、NONE以及SUCCESS,方法的声明形式是public String execute().自定义的Action类可以实现这个接口,使用其中的常量作为execute方法的返回值,实现execute方法实现业务控制逻辑。

Action类中进行业务控制的方法有什么编码规范?

Action类中进行业务控制的方法必须遵守一定的编码规范,即返回值为String,权限为public,没有形式参数。方法的名字默认为execute,可以被自动调用,如果不是execute,则需要进行配置或指定才能使用。

如果一个Action类中需要处理请求范围属性,使用什么方法实现可以与ServletAPI脱耦?

如果要与ServletAPI脱耦,同时又要处理请求属性,那么可以使用Struts2API中的ActionContext类实现。该类中的普通方法可以向请求范围存属性,该类中的get方法可以从请求范围返回属性。

ActionContext类中的哪个方法可以用来处理会话范围内的属性?

ActionContext中的getSession方法可以返回一个与会话对象相关的Map对象,通过使用该Map对象的put方法,可以往会话中存入属性,通过使用Map对象的get方法可以从会话中返回属性。

ActionContext类中的哪个方法可以用来处理上下文范围内的属性?

ActionContext中的getApplication方法可以返回一个与上下文对象相关的Map对象,通过使用该Map对象的put方法可以往上下文中保存属性,通过使用Map对象的get方法可以从上下文中返回属性。

如果一个Action类中需要获得Servlet API 中的对象进行处理,如何解决?

如果Action 类中需要获得Servlet API 中的对象,那么可以使用ServletActionContext类实现。该类中定义可以下四个方法:
(1) public static PageContextgetPageContext(): 获得PageContext对象。
(2) public static HttpServletRequestgetRequest():获得HttpServletRequest对象。
(3) public static HttpServletResponsegetResponse():获得HttpServletResponse对象。
(4) public static ServletContextgetServletContext():获得ServletContext对象

Struts2框架有哪些封装请求参数的方式?

Struts2 中封装请求参数的方式有两种,即Field_Driven,域模型, Model_Driven。其中Field_Driven是属性封装,在Action类中定义域请求参数对应的属性,并为之提供getters和setters,Struts2框架将自动把请求参数封装到这些属性中。Model-Driven 是模型驱动,Action 类需要实现ModelDriven接口,声明一个与表单对应的JavaBean属性,覆盖其中的getModel方法,回JavaBean实力,Struts2框架将自动把请求参数封装到JavaBean 实例中。

ActionSupport类有什么所用?

ActionSupport类定义了一系列与输入校验有关的方法,如果Action需要对输入进行校验,那么Action必须继承ActionSupport类

如果校验失败,Struts2将导航到什么视图上?

如果校验失败,Struts2框架将导航到当前的Action中名字是input的结果视图上,如果Action中的名字为input的结果视图,则查找名字为input的全局结果,如果依然没有,则发生错误。

Hibernate框架主要解决什么问题

Hibernate框架是一个ORM框架,既对象关系映射框架,能够将Java类与关系型数据表进行映射,同时提供面向对象的数据查询机制,能够最大程度缩短程序员在sql和jdbc上的程序时间,从大量的数据持久层编程工作中解脱出来、

Hibernate的运行原理

在初始化Hibernate是,会首先根据configuration接口去加载并读取Hibernate的配置信息(hibernate.cfg.xml)(一个Configeration实例代表Hibernate所有java类到Sql数据库映射的集合,),然后创建SessionFactory实例,把Configeration对象中的所有配置信息拷贝到SessionFactory的缓存中,最后通过调用SessionFactory创建Session对象,通过Session接口提供的何种方法曹庄数据库的访问(Query和Criteria接口)

Hibernate应用中的映射文件(hbm.xml)主要包括哪些内容?

映射文件中所有元素都存在于根元素hibernate-mapping下,其中使用最多的元素是class,class元素下最常用的子元素有id、property、componnent、subclass、joined-subclass、union-subclass等

Hibernate中持久化对象的三种状态,每种状态有什么特征?

  1. 瞬时状态

    当通过new操作符实例化一个对象,二者个对象没有被Session对象操作,也就是该对象没有与一个Session对象联时,也不会被赋予持久化标识(ldentifier)

  2. 持久状态

    如果一个对象与某一个Session对象关联,例如被Session对象刚加载的,刚保存的,刚更新的,那么该对象就成为持久状态对象,持久状态的对象与数据库中一条记录对应,并拥有持久标识(ldentifier)。当持久状态对象有改变时,当前事务提交后,Hibernate会自动检测到对象的变化,并持久化到数据库中

  3. 脱管状态

    当与持久状态对象关联的Session关闭后,该对象就变成托管状态,托管状态的对象引用依然有效,可以继续使用,当托管状态的对象再次与某个Session关联后,托管装填对象将转变为持久状态对象,托管期间进行的修改将被持久化到数据库中。

HQL语言与SQL语言的区别

  • HQL语言中出现的是类名,属性名 SQL语言中出现的是表名,字段名
  • HQL语言严格规范,区分大小写,SQL语言不区分大小写
  • HQL语言理解继承、多态等面向对象的概念

延迟加载的概念,如何设置延迟加载

延迟加载的意思是,当查询某个实例时,默认情况下不查询其关联的实例,使用属性lazy可以设置是否使用延迟加载,lazy=”true”表示使用延迟加载,lazy=“false”表好不使用延迟加载

Hibernate中的get和load的区别

加载方式:
load为延迟加载返回的是一个只有id属性的代理,只有使用该对象属性时,才发出sql语句
get为立即加载,执行时,会立即向数据库发出sql语句,返回结果
load检索不到记录是,会抛出ObjectNotFoundException异常
get检索不到记录时,会返回nul

Hibernate五大核心(类/接口)简述

  • Configuration接口的作用是对Hibernate进行配置,以及对它进行启动(加载hibernate.cfg.xml)并创建一个SessionFactory对象。
  • SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象,SessionFactory是线程安全的。
  • Sessio接口是Hibernate应用使用的主要接口。Session接口负责执行被持久化对象CRUD操作。Session对象是非线程安全的,Session相当于jdbc的Connection
  • Query于Criteria接口,负责执行各种数据库查询,它可以使用HQL语句或SQL语句两种表达方式
  • Transaction接口是一个可选的API,负责操作相关的事务

Hibernate中的两大配置文件

*.hbm.xml:主键生成策略,映射关系。一对多。一对一的关系。
Hibernate.cfg.xml:方言,数据库连接信息,包含*.cfg.xm内容,映射文件,也可以配置事务

Hibernate事务处理

开启事务session。beginTransaction();
执行相关的操作,如果成功则session.getTransaction().commit();
执行操作失败则session.getTransaction.rollback();

Hibernate与JDBC的区别

  • Hibernate和jdbc主要区别就是,Hibernate先检索缓存中的映射对象,而jdbc则是直接操作数据库
  • Hibernate是一个和jdbc的轻量级的对象封装,它是一个独立的对象持久化框架,Hibernate可以用在任何jdbc可以使用的场合
  • Hibernate是一个和jdbc密切关联的框架,所以Hibernate的兼容性和jdbc驱动,和数据库都有一定的关系,但是和使用它的java程序,和Appserver没有任何关系,也不存在兼容性问题
  • 如果正确的使用jdbc技术,它的执行效率一定比hibernate要好,因为hibernate是基于jdbc的技术
  • jdbc使用的SQL语句,Hibernate使用的是HQL语句,但是HQL语句最终还会隐式转换成SQL语句执行

IOC(inversion of control)的理解

一个类需要用到某个接口的方法,我们需要将类A和接口B的实现关联起来,最简单的方法是类A中创建一个对于接口B的实现C的实例,但是这种方法显然两者的依赖(Dependency)太大了,而IOC的方法只在类A定义好用于关联接口B的实现的方法,将类A,接口B和接口B的实现C放入IOC容器中,通过一定的配置由容器来实现类A与接口B的实现C的关联,,把对象的实例交给容器的完成。

两种依赖注入方式

setter注入:一般情况下所有的java bean,我们使用setter方法和getter方法去设置和获取属性的值
构造器方法注入,

Dependency Injetion(DI)和IOC(inversion of control)的理解

依赖注入DI是一个程序设计模式和架构模型,一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:把一个数据库连接已参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接,控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖
应用的控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它,也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转

Spring的优点

  • Spring是分层的架构,你可以选择使用你需要的层而不用管不需要的部分
  • Spring是POJO编程,POJO编程使得可持续构建和可测试能力提高
  • 依赖注入和IOC使得JDBC操作简单化
  • Spring是开源的免费的
  • Spring使得对象管理集中化和简单化

Spring中的applicationContext.xml能不能改为其他名字

ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。 你可以通过定义一个元素名字为”contextConfigLocation”来改变Spring配置文件的位置

Spring框架有哪几部分组成?

  • Spring 核心容器(Core):提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,她是工厂模式的实现。BeanFactory使用控制反转(Ioc)模式将应用程序的配置和依赖性规范与实际的应用代码程序分开。
  • Spring AOP:通过配置管理特性,Spring AOP模块直接面向方面的编程功能集成到了Spring框架中,所以可以很容易的使Spring框架管理的任何对象支持 AOP。Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用Spring AOP,不用依赖于EJB组件,就可以将声明性事务管理集成到应用程序中。
  • Spring ORM:Spring框架集成了若干ORM框架,从而提供了ORM的对象关系工具,其中包括 JDO、Hibernate、iBatis和TopLink。所有这些都遵从Spring的通用事务和DAO异常层结构。
  • Spring DAO:JDBC DAO抽象层提供了有意义的异常层次的结构,可用该结构来管理异常处理和不同数据供应商抛出的异常错误信息。异常层次结构简化了错误处理,并且大大的降低 了需要编写的异常代码数量(例如,打开和关系连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层结构。
  • Spring WEB:Web上下文模块建立在上下文模块(Context)的基础之上,为基于Web服务的应用程序提供了上下文的服务。所以Spring框架支持 Jakarta Struts的集成。Web模块还简化了处理多部分请求及将请求参数绑定到域对象的工作。
  • Spring上下文(Context):Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化校验和调度功能。
  • Spring MVC:Spring的MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的,MVC容纳的大量视图技术,包括JSP、Velocity、Tiles、iText和Pol

猜你喜欢

转载自blog.csdn.net/dearshajing/article/details/78407300