1. struts2运行原理
(1)客户端向Servlet容器(例如Tomcat)发送一个请求;
(2)这个请求经过一系列的过滤器(Filter);
(3)接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;
(4)如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
(5)ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;
(6)ActionProxy创建一个ActionInvocation的实例;
(7)ActionInvocation在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用;
(8)一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是jsp或者FreeMarker的模版。(体系结构图见下一页)
2. Hibernate 中get 和 load的区别
get():会马上执行sql语句,返回的是对象;数据不存在返回null
load():懒加载为true的时候,用的时候才会执行sql 语句(延迟加载),否则(lazy="false")立即执行sql。返回的是一个代理对象,如果类被final修饰,懒加载就会失效,数据不存在就会抛出异常ObjectNotFoundException
createQuery()
createCriteria()
get和load的区别:
加载方式 返回值 如果数据不存在
---------------------------------------------------------
get 立即加载 真实对象或null 返回null
load 延迟加载 代理对象 抛异常
3. Spring MVC运行原理
(1)发起请求到前端控制器(DispatcherServlet)
(2)前端控制器请求HandlerMapping查找 Handler
可以根据xml配置、注解进行查找
(3)处理器映射器HandlerMapping向前端控制器返回Handler
(4)前端控制器调用处理器适配器去执行Handler
(5)处理器适配器去执行Handler
(6)Handler执行完成给适配器返回ModelAndView
(7)处理器适配器向前端控制器返回ModelAndView
ModelAndView是springmvc框架的一个底层对象,包括 Model和view
(8)前端控制器请求视图解析器去进行视图解析
根据逻辑视图名解析成真正的视图(jsp)
(9)视图解析器向前端控制器返回View
(10)前端控制器进行视图渲染
视图渲染将模型数据(在ModelAndView对象中)填充到request域
(11)前端控制器向用户响应结果
4. Struts1.x与Struts2.x的区别
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,struts1严重依赖于servletAPI,属于侵入性框架,struts2不严重依赖于servletAPI,属于非侵入型框架。
线程模型方面:
Struts1的Action是单实例的,一个Action的实例处理所有的请求。
Struts2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),没有线程安全方面的问题
封装请求参数:
Struts1中强制使用ActionForm对象封装请求的参数。
Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
struts1的前端总控制器(核心总控制器)为ActionServlet,
struts2的前端总控制器(核心总控制器)为FilterDispatcher
5. Spring MVC、struts1和struts2区别
(1)spring mvc 单例 非线程安全
struts1单例 非线程安全
struts2线程安全对每个请求都产生一个实例
(2)spring mvc的入口是servlet,而struts2是filter
spring 的前端总控制器为 DispatcherServlet
struts2 的前端总控制器为 FilterDispatcher
struts1 的前端总控制器为 actionServlet
(3)参数传递:
struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
springmvc 用方法来接受参数
(4)spring mvc是基于方法的设计,而sturts是基于类
6. Hibernate、Ibatis、Jdbc三者的区别
Hibernate属于全自动, Ibatis属于半自动,Jdbc属于手动;
从开发效率上讲hibernate较高,ibatis居中,jdbc较低;
从执行效率上讲hibernate较低,ibatis居中,jdbc较高。
因为jdbc是手工写sql语句,程序员对sql的控制能力更大,可以根据业务需要进行优化,而ibatis虽然也可以对sql进行优化,但是他里面将resultset封装为实体的过程中采用了反射机制所以一定程度上影响了性能,而hibernate因为高度封装所以开发效率相对较高,但正因为这个原因,所以程序员在对sql语句的控制和优化方面相对比较弱,而且在将resultset封装成实体的过程中也采用了反射机制,所以在性能方面较低。
7. Hibernate的运行原理
首先通过configuration去加载hibernate.cfg.xml这个配置文件,根据配置文件的信息去创建sessionFactory;
sessionFactory是线程安全的,是一个session工厂,用来创建session;
session是线程不安全的,相当于jdbc的connection;
最后通过session去进行数据库的各种操作;
在进行操作的时候通过transaction进行事务的控制。
8. hibernate中对象的状态
临时状态:Transient
与数据库没有对应,跟Session没有关联。一般是新new出的对象。
持久化状态:Persist
对象在Session的管理之中,最终会有对应的数据库记录。
特点:
1> 有OID
2> 对对象的修改会同步到数据库。
游离状态:Detached
数据库中有对应记录,但对象不在Session管理之中。
修改此状态对象时数据库不会有变化。
删除状态:Removed
执行了delete()后的对象。
9. spring框架的特点
低侵入式设计
Spring的Ioc容器降低了业务对象替换的复杂性,提高了组件之间的解耦
Spring的Aop支持允许将一些通用的任务事务,日志等进行集中处理
Spring的ORM和DAO提供了第三方的持久层的框架的良好整合,并简化了底层数据库的访问
Spring的开发性,并不强制应用完全依赖于Spring,开发者可以选择框架的部分或全部
10. 应用上下文是如何实现的?
FileSystemXmlApplicationContext 容器加载XML文件中beans的定义。XML Bean配置文件的完整路径必须传递给构造器。
ClassPathXmlApplicationContext 容器也加载XML文件中beans的定义。注意,你需要正确的设置CLASSPATH,因为该容器会在CLASSPATH中查看bean的XML配置文件。
WebXmlApplicationContext:该容器加载xml文件,这些文件定义了web应用中所有的beans。
11. Bean Factory 和 ApplicationContext 有什么区别?
ApplicationContext提供了一种解决文档信息的方法,一种加载文件资源的方式(如图片),他们可以向监听他们的beans发送消息。另外,容器或者容器中beans的操作,这些必须以bean工厂的编程方式处理的操作可以在应用上下文中以声明的方式处理。应用上下文实现了MessageSource,该接口用于获取本地消息,实际的实现是可选的。
12. 总结一下什么是RESTful架构
(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。