Spring
1、为什么用Spring,它的核心功能有那些
Spring是一个轻量级的容器,控制反转(IOC)和面向切面编程(AOP),提供对持久层和业务的支持。 IOC控制反转,是Spring的核心,贯穿始终,对于Spring框架来说就是Spring来负责控制对象的生命周期和对象间的关系,比如一个对象需要另一个对象,那就new一个,用完后还要销毁。AOP切面编程,几个类共有的代码,抽取到一个切片中,在项目中经常使用(声明时事务和权限用到来切面编程)
2、Spring框架中用到了那些设计模式
1). 简单工厂
又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。
Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。
2). 工厂方法(Factory Method)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
Spring中的FactoryBean就是典型的工厂方法模式。
3). 单例(Singleton)
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为Spring管理的是是任意的Java对象。
4). 适配器(Adapter)
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
5).包装器(Decorator)
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。
6). 代理(Proxy)
为其他对象提供一种代理以控制对这个对象的访问。
从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责。
Spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。
7).观察者(Observer)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
Spring中Observer模式常用的地方是listener的实现。如ApplicationListener。
8). 策略(Strategy)
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
Spring中在实例化对象的时候用到Strategy模式
9).模板方法(Template Method)
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
3、解释一下依赖注入和控制反转作用
控制反转(IoC/Inverse Of Control): 调用者不再创建被调用者的实例,由spring框架实现(容器创建)所以称为控制反转。
依赖注入(DI/Dependence injection) : 容器创建好实例后再注入调用者称为依赖注入。
4、Spring底层数据结构
首先用Spring中的IOC划分了事务处理单元,对事务的各种配置放到了IOC容器中(设置事务管理器,设置事务的传播特征及隔离机制)。AOP拦截需要进行事务处理的类(比如事务实行的配置和读取,事务对象的抽象)对事物处理实现(生成、提交、回滚、挂起)形成一个Spring声明式事务处理
5、为什么使用Spring
AOP开发可以创建横切关注点,把它们插入到应用程序代码中。使用AOP后,公共服务(比如日志、持久性、事务等)就可以分解方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性
6、Spring AOP的代理
CGLIB动态代理:动态代理类的字节码在程序运行时由java反射机制动态生成,无需程序员手工编写它的源代码
静态代理:创建或特定工具自动生成源代码,在编译。在程序运行前,代理类的.class文件就已经存在了
7、Spring设置单例模式的几种方法
1)<bean id="date" class="java.util.Date"/>Spring默认就是单例模式
2)<bean id="date" class="java.util.Date" scope="singleton"/> (仅为Spring2.0支持)如果每次获得新的对象scope设置prototype
3)<bean id="date" class="java.util.Date" singleton="true"/>
MVC(模型视图控制器),基于MVC模式的框架(Struts1,Struts2,SpringMvc)
Struts2
1、Struts2是什么,其工作原理是什么(执行流程)
Struts2是一个优秀的MVC框架,基于WEBWORK,吸收了STRUTS1的优点.
工作原理:
一个请求在Struts2框架中的处理大概分为以下几个步骤
1)、客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2)、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3)、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action ,FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心doFilter
4)、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5)、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。
6)、ActionProxy创建一个ActionInvocation的实例。
7)、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8)、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。
2、Struts中接收数据时有那些方式
属性驱动和模型驱动
3、Strtus2中拦截器和过滤器的区别是什么
拦截器主要拦截的是对ACTION的请求,而过滤器是对项目所有资源的请求都可以拦截
4、Struts2比JSP+Servlet有什么好处
1).首先,最重要的一点是多个视图能共享一个模型。同一个模型可以被不同的视图重用,大大提高了代码的可重用性。
2).由于MVC的三个模块相互独立,改变其中一个不会影响其他两个,所以依据这种设计思想能构造良好的松耦合的构件。
3).此外,控制器提高了应用程序的灵活性和可配置性。控制器可以用来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段
5、Struts2中的默认包有什么用
Struts-defualt Package包含了STRUTS2内置的Result的类型和拦截器
Result:dispathcer,redirect,chain,redirectAction等
拦截器:文件上传拦截器,为Action属性赋值的拦截器等
6、至少说出5个Struts2的内置拦截器
fileUpload 文件上传
modelDriven 模型驱动
validation 验证
exception 异常
cookie COOKIE
createSession 创建会话
i18n 国际化
7、Struts2生命周期
客户端每次发送请求action都会创建一个新的实例,至于这个实例何时销毁,由xwork来控制
8、Struts2标签:表单标签、非表单标签、ajax标签、流程控制标签、数据访问标签
SpringMVC
1、SpringMVC的工作原理
1). 客户端请求提交到DispatcherServlet
2). 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
3). DispatcherServlet将请求提交到Controller
4). Controller调用业务逻辑处理后,返回ModelAndView
5). DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
6). 视图负责将结果显示到客户端
2、SpringMVC用过的注解
1). @Controller:用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象
2). @RequestMapping:用于处理请求地址映射的注解,用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
3).@Resource和@Autowired:都是做bean的注入使用,两个都可以写在字段和setter方法上
4).@RequestParam:请求参数去数据映射到功能处理方法的参数上
5). @SessionAttributes:值放到session作用域中,写在class上面
6). @ModelAttribute:Contorller的所有方法在调用前,先执行此@ModelAttribute方法,用于注解和方法参数中
7). @ResponseBody:Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Ressponse对象的body数据区。(使用时机:返回的数据不是html标签页面,而是如jsp、xml等使用)
3、谈谈你觉得springMVC和其他MVC框架的区别
1). 机制:spring mvc的入口是servlet,而struts2是filter。
2). 性能:spring会稍微比struts快。spring mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性.而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3 mvc中,一个方法对应一个request上下文。 而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通过setter getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。
3). 参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
4). 设计思想上:struts更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展。
5). intercepter的实现机制:struts有以自己的interceptor机制,spring mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。
SSH的整合和各自分工
通过STRUTS和SPRING 及HIBERNATE的整合,可以让项目的MVC持久层及对象的创建都得到控制.
Struts2的整合主要负责MVC方面,所有的ACTION实例的产生不在由STRUTS2框架负责而是交给Spring来负责,Spring管理的Bean默认是单例