1.谈谈你对MVC的理解
MVC是一种设计模式,它强制的将应用程序的输入、处理、和输出分开。
使用了MVC的应用程序被分为3个核心部件:试图(View)、模型(Model)、控制器(Controller)。它们各司其职,既分工明确又相互合作。
首先视图接受用户输入请求,然后将请求传递给控制器,控制器再调用某个模型来处理用户的请求,在控制器的控制下,再将处理后的结果交给某个视图进行格式化输出给用户.这是经典的MVC设计执行的基本流程。MVC不仅实现了功能模块和显示模块的分离,同时它还提高了系统的可维护性、可扩展性和组件的可复用性,是一个优秀的创建软件的途径。
J2EE把MVC引入了web领域,并在此基础上架构出了一套称为Model2的体系。Model2体系及jsp作为视图显示输出和接受用户输入数据,Servlet作为控制器处理用户请求并根据用户请求选择相应的jsp返回给用户,javaBean作为模型组件用作业务逻辑处理、管理数据的存储和一致性。
2.Struts1.0 和 Struts2.0 哪个是单实例,哪个是多实例
单例多例需要搞明白两个问题:
1. 什么是单例多例;
2. 如何产生单例多例;
3. 为什么要用单例多例
4. 什么时候用单例,什么时候用多例;
1. 什么是单例多例:
所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action;
2. 如何产生单例多例:
在通用的SSH中,单例在spring中是默认的,如果要产生多例,则在配置文件的bean中添加scope="prototype";
3. 为什么用单例多例:
之所以用单例,是因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存;
之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
用单例和多例的标准只有一个:
当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),则多例,否则单例;
4. 何时用单例?何时用多例?
对于struts2来说,action必须用多例,因为action本身含有请求参数的值,即可改变的状态;
而
3.update()和saveOrUpdate()区别?
Hibernate的对象有3种状态,分别为:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。
update和saveOrUpdate是用来对跨Session的PO进行状态管理的。
你的User user传过来的时候不是在session中管辖的PO 执行update方法是没用的
saveOrUpdate会先判断user是否在session中管理 如果不在会先save到session然后执行update 所以就更新了
User u是session的 直接set这个PO就可以更新了 无需调用update。
4.Hibernate的三种状态之间如何转换
在Hibernate中总共有3中对象的状态,分别为瞬时态、持久态、脱管态(游离态)。下面分别介绍下对象在何时处于什么样的状态
瞬时态:
在对象通过new关键在实例化后,所属的状态就是瞬时态。
持久态:
当对象通过session插入或更新到DB的时候,而session并没有关闭时候的状态即为持久态。
脱管态:
当session关闭后,而DB中又有该对象对应的一条数据,及称这种状态为脱管态。
处于不同状态下的特点
瞬时态的特点为并没有被hibernate所监控而且数据库中还没有与该对应的数据。
持久态的特点为被session所监控,也就是说当该对象的某一条属性或者多条属性被更改的时候,在DB中对应的数据也会随之做出更新操作。
脱管态的特点就是无论该对象如何更新,在数据库中对应的数据都不会因该对象的变化而产生更新。
这三种状态之间是可以通过方法进行转换的。
瞬时态转换到持久态 save() saveOrUpdate()
持久态转换到瞬时态 delete()
持久态转换到脱管态 evict() close() clear()
脱管态转换到持久态 update() saveOrUpdate() lock()
5.Hibernate实体之间的关联关系的三种形式
一对一,一对多,多对多
6.spring中<bean>的depends-on属性是什么
depend-on用来表示一个Bean的实例化依靠另一个Bean先实例化。如果在一个bean A上定义了depend-on B那么就表示:A 实例化前先实例化 B。
7.Hibernate中get方法和load方法的区别
一、get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实就hibernate的一级缓存),如果没有,再去二级缓存中去查询,如果再没有,就去数据库中查询,仍然没有找到的话,就返回null
而使用load方法的话,hibernate会认定该id对应的数据一定存在,它也会先去session缓存中去查找,如果没有找到,hibernate会根据lazy属性值来确定是否使用延迟加载。如果lazy=‘true’ ,就使用延迟加载,返回该代理对象,等到真正访问到该对象的属性时才会去二级缓存中查询,如果没有,再去数据库中查询,如果还没有,就抛出org.hibernate.ObjectNotFoundException异常。如果lazy='false' 则不使用延迟加载,这是load的访问机制就和get一样了。
二、对于load和get方法返回类型:虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在 session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是 原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是 返回的还是代理对象,只不过已经加载了实体数据。
总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
8. 什么是IoC?
IoC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。