五大框架的原理(springMVC,struts2,spring,mybatis,hibernate)
谈谈你对springMVC框架的理解:
Springmvc就是spring框架的一个模块,它是一个基于mvc设计思想的前端web层框架,主要作用就是对前端请求进行处理。Spring的MVC框架主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成 ,他的执行流程是:
- 客户端请求提交到DispatcherServlet
- 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
- DispatcherServlet将请求提交到Controller
- Controller调用业务逻辑处理后,返回ModelAndView
- DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
- 视图负责将结果显示到客户端
谈谈你对struts2框架的理解:
Struts2,它是一个基于mvc设计思想的前端web层框架,主要作用就是对前端请求进行处理。他的核心是拦截器.但是他的前端控制器是一个过滤器。他的执行流程是:
- 页面请求传递到后台, 首先进入Struts2 的核心过滤器 StrutsPrepareAndExecutedFilter .
- 请求进入到struts2 之后, 会根据请求的路径到 struts.xml 文件中根据 package的 namespace 属性 与 action 的 name 属性配置到请求处理的Action 类.
- 匹配到对应 Action 类的对应方法 , 执行该方法进行业务处理, 处理完毕之后会返回一个结果视图(字符串).
- 然后根据返回的结果视图 , 到struts.xml 中对应的Action的result结果集配置中 匹配 对应的视图页面(或action).
- 然后根据 result 的type属性, 转发(或重定向) 对应的页面(或action).
谈谈你对spring框架的理解 :
Spring的核心有很多.其中比较主要也是我们常用的就是AOP,IOC,DI.也就是面向切面编程,控制反转,依赖注入.Spring一般是作为容器管理其他框架.例如常见的web层框架(struts2,springMVC)和持久成框架(mybatis,hibernate).一般都由spring来管理
- aop:面向切面编程,将跟业务逻辑没有关系的代码提取出来,在调用目标方法之前或者之后执行。常用的场景,事务,日志,权限控制,异常处理等方面。
- ioc:创建对象的权利,交给spring容器创建。
谈谈你对mybatis框架的理解:
Mybatis是一个优秀的ORM框架.应用在持久层. 它对jdbc的 操作数据库过程 进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、等jdbc繁杂的过程代码.一般使用mapper代理的方式开发.直接在xml里面写sql(如果对hibernate了解.可以话题转向mybatis和hibernate的对比)
Mybatis的工作流程 :
- mybatis配置 SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。 mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
- 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
- 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession(DefaultSqlSession)进行。
- mybatis底层自定义了Executor(BaseExecutor)执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
- Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
- Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
- Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
谈谈你对hibernate框架的理解 :
Hibernate是轻量级的持久层解决方案,是一个关系数据库ORM框架, 对JDBC访问数据库的代码做了封装.我们可以很容易的对数据库进行增删改查操作.
hibernate查询方式?
- 导航对象图检索方式。根据已经加载的对象,导航到其他对象。
- OID检索方式。使用get或者load加载对应的对象
- HQL检索方式。
- QBC检索方式。
- SQL检索方式。
sql与hql的区别?
- sql是直接操作数据库的
- hql是通过操作对象操作数据库,对大小写敏感。
一级缓存和二级缓存的区别?
一级缓存是session级别的缓存,二级缓存是sessionFactory级别的缓存。
hibernate中get和load的区别? get和load都是根据id获取数据。
- get先查询session中对应id是否有数据,如果有则直接返回,有查询数据库,如数据库中没有则返回为null;
- load方式查询session中对应id是否有数据,如果没有生成代理对象,查询数据库。如没有对应的id则抛出异常
SpringMVC和Struts2两个框架对比一下:
- springmvc入口是一个servlet前端控制器,struts2入口是一个filter过虑器。
- struts2通过在action类中定义成员变量接收请求参数,struts2只能使用多例模式管理action。 springmvc通过在controller方法中定义形参接收请求参数,springmvc可以使用单例模式管理controller。
- springmvc是基于方法开发的,注解开发中使用requestMapping将url和方法进行映射,如果根据url找到controller类的方法生成一个Handler处理器对象(只包括一个method)。 struts2是基于类开发,每个请求过来创建一个action实例,实例对象中有若干的方法。 开发中建议使用springmvc,springmvc方法更类似service业务方法。
- Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数绑定器是将request请求内容解析,并给方法形参赋值。
Hibernate和mybatis对比:
- 在移植性方面hibernate配置一下方言即可.而一般情况下mybatis则需要修改sql语句
- hibernate是一个完全的ORM框架.完全的面向对象.更符合我们开发者的思维模式.mybatis需要我们手动写sql语句
- hibernate的优化成本比较高.因为hibernate的sql语句是自动生成的,所以在优化方面一般的新手无从下手.而mybatis只要修改sql就可以了.更加容易上手
servlet的生命周期:
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。
J2EE是技术还是平台还是框架:
J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。
J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。
解释Spring框架中bean的生命周期
- Spring容器读取XML文件中bean的定义并实例化bean
- Spring根据bean的定义设置属性值
- 如果该bean实现了BeanNameAware接口,Spring将bean的id传递给setBeanName()方法。
- 如果该Bean事项了BeanFactoryAware接口,Spring将beanfactory传递给setBeanFactory()方法
- 如果任何bean BeanPostProcessors和该bean相关,Spring调用postProcessBeforeInitialization()方法。
- 如果该Bean实现了InitializingBean接口,调用Bean中的afterPropertiesSet方法,如果bean有初始化函数声明,调用相应的初始化方法。
- 如果任何bean BeanPostProcessors和该bean相关,调用postProcessAfterInitialization()方法
- 如果该bean实现了DisposableBean,调用destory()方法。
j2ee常用的设计模式?说明工厂模式。
Java中的23种设计模式:
Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式),
Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),
Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),
Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),
Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),
Observer(观察者模式), State(状态模式), Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
什么是java序列化,如何实现java序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
如何在Spring中注入Java集合类?
Spring提供如下几种类型的集合配置元素:
1、list元素用来注入一系列的值,允许有相同的值。
2、set元素用来注入一系列的值,不允许有相同的值。
3、map用来注入一组“键-值”对,键、值可以是任何类型的。
4、props也可以用来注入一组“键-值”对,这里的键、值都是字符串类型
Spring支持的事务管理类型:
1、编程式事务管理类型:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
2、声明式事务编程:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。
Spring框架的事务管理有哪些优点:
1、它为不同的事务API(如JTA,JDBC,Hibernate,JPA和JDO)提供了统一的编程模型。
2、它为编程式事务管理提供了一个简单的API而非一系列复杂的事务API。
3、它支持声明式事务管理。
4、它可以和Spring的多种数据访问技术很好的融合。
创建线程的常见方式 :
(1)第一种方法:继承Thread类,重写run方法,实例化线程,调用start方法启动线程
(2)第二种方法:实现runnable接口,实现run方法,创建线程,将runnable的实例传入并启动线程(Runnable的实例需要借助Thread类)
Sleep(),wait()的区别 :
sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.
而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是thisOBJ.wait(),这里的暂停是阻塞,
其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题
Cookie的存储容量:
cookie是目前前端市场上最常用的本地存储方式,它兼容所有的浏览器 存储的大小有限制:一般浏览器规定同源下最多只能存储4KB大小 cookie有过期时间,时间我们自己设置,一般不超过一个月 cookie不稳定,因为我们可以使用安全卫士或者浏览器的垃圾清理功能把cookie存储的信息移除掉 用户可以根据自己的需求,开启无痕或者隐身模式,这样cookie就不能进行存储了 cookie不是严格意义上的本地存储,它和服务器之间是有关联的
一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。
一个文件中可以只有非public类,如果只有一个非public类,此类可以跟文件名不同
Java有没有goto?
java中的保留字,现在没有在java中使用
说说&和&&的区别:
&和&&都可以用作逻辑与的运算符,&&为短路与,&不是短路与。另外&可以做为整数的位运算符
switch语句能否作用在byte,long和String上?
作用在byte, short, char, int, enum上,
封装类对象,其它基本数据类型及引用数据类型都不能做为case的条件
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
对于short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译
char型变量中能不能存贮一个中文汉字?为什么?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字
补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
引用变量不能重新赋值,但是引用指向的对象的内容可以变化
"=="和equals方法究竟有什么区别?
他们的区别主要存在在引用数据类型上
==为比较两侧的对象是否同一对象,是用内存地址来比较的
equals是方法,默认是用内存地址比较,重写后,主要是用来比较两侧的对象的值是否相同,和equals方法中的实现有关
==可以两侧都为null,但equals左侧的引用指向的对象不能空,不然有NullPointerException
除非需要比较两个引用指向的对象是同一对象,一般都使用equals方法进行比较。尤其是String之类的值对象,另外,常量尽量放在比较的左侧
静态变量和实例变量的区别?
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。
总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
是否可以从一个static方法内部发出对非static方法的调用?
不可以。因为非static方法(实例方法)是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。
Integer与int的区别:
int是java提供的8种原始数据类型之一,意思整型,占用4字节。
Integer是java为int提供的封装类,是引用数据类型。
int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
Overload是重载的意思,Override是覆盖的意思,也就是重写。
Overload和Override有共同之处,两个方法的方法名都必须相同,如果不同,既不构成Overload,也不构成Override。
- Override必须发生在父子类之间,Overload可以不在父子类之间
- Override的特点:
- 参数列表完全相同:个数相同、类型相同、顺序相同
- 子类的返回值不能比父类的返回值范围大
- 子类方法抛出的异常不能比父类方法抛出的异常范围大
- 修饰符只能为public、protected、friendly,不能为private
- 父子类方法不能使用static修饰
- 重载发生在同一个类或父子类之间,重载中参数列表至少满足个数不同、类型不同、顺序不同中的一个条件,不包含父子类之间的static方法
接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?抽象类中是否可以有静态的main方法?抽象类是否可有以内部类?接口是否可以有内部类?
接口可以继承接口;抽象类可以实现(implements)接口;抽象类可以继承具体类;抽象类中可以有静态的main方法;抽象类可有以内部类;接口可以有内部类,但必须是static内部类,但不一定是final的。
只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。
写clone()方法时,通常都有一行代码(不是必须有),是什么?
clone 有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员。
面向对象的特征有哪些方面
- 封装,隐藏内部实现,只暴露公共行为
- 继承,提高代码的重用性
- 多态,体现现实生活中相似对象的差异性
- 抽象,抽取现实世界中相似对象的共同点
java中实现多态的机制是什么?
通过继承父类或实现接口。不同子类或实现类对同一父类方法有不同的实现。根据对象调用相应的实现方法。另外对于相似的方法,可以使用重载。
String是最基本的数据类型吗?
基本数据类型包括byte、int、char、long、float、double、boolean和short。
String是引用数据类型。
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer/StringBuilder类
是否可以继承String类?
String类是final类故不可以继承。
String s = new String("xyz");创建了几个String Object?二者之间有什么区别?
两个对象。一个是"xyz",为缓冲区对象。另一个是new出来的String对象。
这两个对象的值相同,但不是同一个对象。
补充,新建对象有几种方式?
- 使用new关键字
- 使用反射,调用newInstance
- 使用clone方法
- 使用序列化与反序列化
- 动态代理(Proxy类和CGLIB)
数组有没有length()这个方法? String有没有length()这个方法?JS的字符串有没有length()方法?
数组没有length()这个方法,有length的属性。String有有length()这个方法。JS中只有length属性,没有length方法。
final, finally, finalize的区别。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成final类型
finally是异常处理语句结构的一部分,表示总是执行,用来释放资源。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用
运行时异常(Runtime)与检查异常(Checked)有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
error和exception有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出,不可能指望程序能处理这样的情况。exception表示一种设计或实现问题,也就是说,它表示如果程序运行正常,从不会发生的情况。
同步和异步有何异同,在什么情况下分别使用他们?举例说明。
同步是指所有操作串行化执行,顺序不能改变,前一操作未完成,后个操作不执行。
异步是指所有操作可以并行执行,顺序无关。
例如寄信
同步:如果没有寄完,不能吃饭,邮递员10天后送到,发送人被饿死
异步:寄出后可以立即吃饭,邮递员送完后,通知发送人送信结果。
如果强调执行顺序的话,用同步。如果顺序无关,则可以用异步。
异步执行效率比同步高。
启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码
线程的基本概念、线程的基本状态以及状态之间的关系:
在多任务操作系统中,为了提高CPU的利用率,可以使用多进程编程。但对进程通信比较困难,进程间数据不能共享,因此可以使用多线程编程。一个进程至少包含一个主入口线程。
单个CPU,在同一时间只能处理一个线程的数据,但是操作系统的任务调度非常快,人眼无法识别,感觉上是多个线程同时执行。有的线程可以已经用完CPU,正在作磁盘操作,此时并不使用CPU,可以让出CPU资源给其它线程使用,提高效率。
Collection和 Collections的区别:
Collection是集合类的上级接口,继承与他的接口主要有Set和List.
Collections是针对集合类的一个工具类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?它们有何区别?
Set里的元素是不能重复的,元素重复与否视具体情况而定:
1. HashSet使用equals比较
2. TreeSet使用compareTo进行比较
字节流与字符流的区别:
字节流是按字节读取或写入设备,但字符流是以字符为单位读取或写入设备。
如果是二进制文件,需要用字节流读取。一般来说,字符流只处理文本文件。在设备中,大多数情况是以字节形式存储数据的,因此字符流通过需要传入字节流当参数。
HTTP与HTTPS有什么区别:
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的区别主要如下:
1.https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3.http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4.http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
spring 事务隔离级别:
- read_uncommitted:(读未提交) 这是事务最低的隔离级别,他允许另外一个事务可以看到这个事务未提交的数据,这种隔离级别会产生脏读,不可重复读和幻读
- read_committed(读已提交) 保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据.这种事务隔离级别可以避免脏读,但是可能会出现不可重复读和幻读
- repeatable_read(可重复读) 这种事务级别可以防止脏读,不可重复读.但是可能出现幻读.他除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读
- Serializable (串行化 )这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。防止了脏读、不可重复读、幻读
事务的传播行为:
- requierd 如果有事务那么加入事务,没有的话新建一个
- not_supported 不开启事务
- requires_new 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完,继续执行老事务
- mandatory 必须在一个已有的事务中执行,否则抛出异常
- never 必须在一个没有的事务中执行,否则抛出异常 6.supports 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务那就不用事务
java 中抽象类和接口的五点区别:
1.一个类可以实现多个接口 ,但却只能继承最多一个抽象类。
2.抽象类可以包含具体的方法 , 接口的所有方法都是抽象的。
3.抽象类可以声明和使用字段 ,接口则不能,但接口可以创建静态的final常量。
4.接口的方法都是public的,抽象类的方法可以是public,protected,private或者默认的package;
5.抽象类可以定义构造函数,接口却不能。