SSH三大框架Struts Spring Hibernate.docx
《SSH三大框架Struts Spring Hibernate.docx》由会员分享,可在线阅读,更多相关《SSH三大框架Struts Spring Hibernate.docx(16页珍藏版)》请在冰豆网上搜索。
SSH三大框架StrutsSpringHibernate
struts
0、Struts1工作流程:
(1)检索和用户请求匹配的ActionMapping实例。
如果不存在此示例,就返回用户请求路径无效。
(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。
(3)根据配置信息决定是否需要表单验证,如果需要验证,就调用ActionForm的validate()方法。
(4)如果ActionForm的validate()方法返回null或返回的ActionErrors对象里不包含ActionMessage对象,就表示表单验证成功。
(5)ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。
如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。
(6)Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象所指向的JSP组件。
(7)通过ActionForward对象指向的JSP组件生成动态网页,返回给客户端。
1、Struts2工作流程:
(包含拦截器处理部分,详细描述)
•1、客户端向Servlet容器(如Tomcat)提交一个请求
•2、请求经过一系列过滤器(如ActionContextCleanUp(已被JVM和WEB容器废弃的空对象)过滤器等)
•3、核心控制器被调用,询问ActionMapper来决定请求是否需要调用某个Action
•4、如果ActionMapper决定需要调用某个Action,核心控制器把控制权委派给ActionProxy(备注:
JSP请求无需调用Action)
•5、ActionProxy通过ConfigurationManager询问框架的配置文件(struts.xml),找到需调用的Action类
•6、ActionProxy创建一个ActionInvocation的实例,(ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的)
•7、ActionInvocation负责调用Action,在此之前会依次调用所有配置的拦截器
•8、Action执行完毕,ActionInvocation负责根据结果码字符串在struts.xml的配置中找到对应的返回结果
•9、拦截器被再次执行
•10、过滤器被再次执行
2、Struts1和Struts2区别:
•1、Action的实现方面:
Struts1要求必须统一扩展自Action类,而Struts2中可以是一个普通的POJO
•2、线程模型方面:
Struts1的Action工作在单例模式,一个Action的实例处理所有的请求。
Struts2的Action是一个请求对应一个实例。
没有线程安全方面的问题
•3、Servlet依赖方面:
Struts1的Action依赖于ServletAPI,比如Action的execute方法的参数就包括request和response对象。
这使程序难于测试。
Struts2中的Action不再依赖于ServletAPI,有利于测试
•4、封装请求参数:
Struts1中强制使用ActionForm对象封装请求的参数。
Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性
•5、表达式语言方面:
Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL
•6、绑定值到视图技术:
Struts1使用标准的JSP,Struts2使用“ValueStack”技术
•7、类型转换:
Struts1中的ActionForm基本使用String类型的属性。
Struts2中使用OGNL进行转换,可以更方便的使用
•8、数据校验:
Struts1中支持覆盖validate方法或者使用Validator框架。
Struts2支持重写validate方法或者使用XWork的验证框架。
4、在Struts2中下面的xml文件的加载顺序:
struts-default.xml—>struts-plugin.xml—>struts.xml—>web.xml
5、怎么调用Ation中的指定方法(使用两种方式),文字描述:
(1).动态方法调用例:
userAction!
enroll
(2).通配符(*)的使用例:
method{*}
6、常用结果的类型:
(写出三种)
dispatcher,redirect,redirectAction
7、使用什么标签来完成其它xml配置文件的包含?
8、Result标签中name的五个常量:
success、input、error、login、none
9、如何实现一个拦截器的功能?
Struts通过和定义拦截器
在action标签中,我们使用子元素引用已经定义的拦截器
10、说说ActionMapper,ActionProxy,ActionInvocation作用:
(1)根据请求的URI查找是否存在对应Action调用
(2)在XWork和真正的Action之间充当代理
(3)表示Action的执行状态,保存拦截器、Action实例
11、请说出10个系统自带的拦截器:
(写出名字,描述功能)
(1)Params拦截器:
负责将请求参数设置为Action属性
(2)servletConfig拦截器:
将源于ServletAPI的各种对象注入到Action
(3)fileUpload拦截器:
对文件上传提供支持
(4)exception拦截器:
捕获异常,并且将异常映射到用户自定义的错误页面
(5)validation拦截器:
调用验证框架进行数据验证
(6)workflow拦截器:
调用Action类的validate(),执行编码验证
(7)Timer拦截器:
记录Action执行的时间,并做为日志信息输出;
(8)I18n拦截器:
国际化
(9)Logger拦截器:
在日志信息中输出要执行的Action信息;
(10)Token拦截器:
核对当前Action请求(request)的有效标识,防止重复提交Action请求(request)
13、Struts2中的ActionSupport基类
基类中定义了五个标准的返回值,当然我们可以自己随意定义返回的名字。
StringSUCCESS="success";//默认是SUCCESS类型
StringNONE="none";
StringERROR="error";
StringINPUT="input";
StringLOGIN="login";
14、Struts2框架的大概处理流程如下
1、加载类(FilterDispatcher)
2、读取配置(struts配置文件中的Action)
3、派发请求(客户端发送请求)
4、调用Action(FilterDispatcher从struts配置文件中读取与之相对应的Action)
5、启用拦截器(WebWork拦截器链自动对请求应用通用功能,如验证)
6、处理业务(回调Action的execute()方法)
7、返回响应(通过execute方法将信息返回到FilterDispatcher)
8、查找响应(FilterDispatcher根据配置查找响应的是什么信息如:
SUCCESS、ERROER,将跳转到哪个jsp页面)
9、响应用户(jsp--->客户浏览器端显示)
10、struts2标签库(相比struts1的标签库,struts2是大大加强了,对数据的操作功能很强大)
Hibernate
1.openSession和getCurrentSession
在hibernate.cfg.xml中配置
thread
openSession:
永远打开新session
需要close
getCurrentSession:
(必须在事务中运行)
可能会打开新的session,可能拿到原来存在的
提交事务后自动关闭。
Sessionsession=HibernateSessionFactory.getSessionFactory().openSession();
Sessionsession2=HibernateSessionFactory.getSessionFactory().openSession();
System.out.println(session==session2);
2.Set集合配置(无序)
Teacher.hbm.xml
Student.hbm.xml
1.什么是持久化
a)就是将程序数据在瞬时状态和持久状态之间转换的机制
2.什么是ORM
a)对象关系映射。
是一种解决面向对象与关系数据库存在的不匹配技术
3.为什么要使用Hibernate
a)Hibernate对JDBC进行了轻量级的封装,可以使用面向对象的思想操作数据库
b)开发工作量小,可以将精力集中在业务逻辑的处理上
4.hibernate操作三个准备、7个步骤
a)三个准备:
1.添加Hibernate库
2.添加Hibernate配置文件
3.添加对应表的实体类和映射文件
b)七个步骤:
(1).读取配置文件
[Configurationcfg=newConfiguration().configure()]
(2).创建会话工厂[SessionFactory]
(3).创建会话[Session,相当于JDBC中的Connectio]
(4).开启事务[Transaction、session.beginTransaction()]
(5).持久化操作[save(),update()]
(6).提交事务[commit()]
(7).关闭session
5.主键生成器方式
native
6.Hibernate中实体对象的三种状态
(1).瞬时状态:
没有持久化标识,仅为一个对象,与数据库无任何关联。
(2).持久状态:
拥有持久化标识,并且在数据库中存在与之对应的记录。
(3).游离状态:
拥有持久化标识,在数据库中存在与之对应的记录。
但由于session的关闭处于脱管状态。
7.inverse、cascade,lazy、fetch区别
a)inverse和cascade
1.Inverse是反转,表示关联关系的控制权。
为true,表示由对方负责关联关系的添加和删除;为false,表示由自己负责维护关联关系。
2.cascade是自动级联。
有4个属性:
i.all:
对所有操作都进行级联
ii.none:
对所有操作都不进行级联
iii.save-update:
执行更新操作时级联
iv.delete:
执行删除操作时级联
b)lazy和fetch
1.lazy懒加载:
只有真正使用该对象时,hibernate才会发出查询语句,并且lazy策略只有在session打开状态下有效。
2.fetch抓取策略:
(join、select、subselect)
8.get和load区别
(1).执行时
get():
迫切加载。
会马上发出查询语句
load():
延迟加载。
不会立刻发出查询语句,由于支持lazy,只有当需要访问被加载实体属性的时候才发出查询语句。
(2).异常时(没查到数据时)
get():
会引发空指针(java.lang.NullPoniterException)
load():
会引发异常(org.hibernate.ObjectNotFoundException)
9.list和iterator区别
a)List:
返回的是一个集合对象,可以按照索引位置来随机访问结果集中的对象。
查询过程中不会读取缓存,尤其是一级缓存,而是直接执行SQL语句,执行结果会被保存在一级缓存中。
b)Iterate:
返回的是一个Iterate对象,只能按照从前向后的顺序一次读取数据库中的记录。
它每次访问均查询一级缓存,但Query.iterator记载数据的方式不是完整的SQL语句,而是N+1条SQL语句
10.CRUD代表什么
a)Create、Read、Update、Delete
11.HQL和QBC区别(并说明QBC中使用了什么类和接口的功能)
HQL:
HibernateQueryLanguage(面向对象的查询语言)
QBC:
QueryByCriteria(它将数据的查询条件封装成一个对象)
Restrictions类主要生成Criteria接口执行数据库查询条件
Order类设置查询结果的排序规则(asc()、desc())
Projections类帮助Criteria接口完成数据的分组查询
12.实体间关系有几种,分别用什么标签
a)一对一:
b)一对多:
c)多对一:
d)多对多:
14.复合主键配置步骤
步骤一:
创建数据库表,设定联合主键约束
步骤二:
编写持久化类及主键类;编写主键类时,必须满足以下要求:
(1)实现Serializable接口
(2)覆盖equals()和hashCode()方法
(3)属性必须包含主键的所有字段
步骤三:
编写*.hbm.xml配置文件
15.HQL中?
号和:
参数名占位符的区别
问号占位符:
通过?
号占位符如果改变,影响到其他操作
参数名:
可以自己定义名字,参数改变不影响其他操作
16.hibernate怎么实现分现分页功能,比方我要取第2页,显示10条记录
setFirstResult((pageNum-1)*PageSize)
setMaxResult(PageSize)
17.事务所具备的四个特性
(1).Atomic原子性
(2).Consistency一致性
(3).Isoloation隔离性
(4).Durability持久性
18.请分别谈下JDBC事务和JTA事务
(1).JDBC:
单个连接,单个事务
(2).JTA:
提供各种分布式事务服务
19.事务并发的5种情况
(1).第一类更新丢失:
撤消一个事务时,把其它事务已提交成功的数据覆盖了
(2).第二类更新丢失:
不可重复读的特例,一个事务覆盖了另一个事务已提交更新的数据
(3).不可重复读:
一个事务两次读取同一行数据,两次读到的数据不一致
(4).脏读:
一个事务读到另一个事务没有提交更新的数据
(5).幻读:
一个事务执行两次查询操作,第二次查询比第一次查询多出了一些数据(插入和更新时)
20.hibernate锁的种类,并分别说明其实现方式
(1).悲观锁:
指在应用程序中显式地为数据资源加锁,先锁定资源再进行操作。
实现方式:
①在程序中显式指定采用数据库系统的独占锁来锁定数据资源;
②在数据库表中增加一个表明记录状态的LOCK字段。
(2).乐观锁:
完全依靠数据库的隔离级别来自动管理锁的工作,应用程序采用版本控制手段来避免可能出现的并发问题。
实现方式:
version版本控制。
在配置文件中要有:
其必须紧跟在元素的后面。
数据库中的version(int)字段与version属性映射。
21.请分别谈谈一级缓存和二级缓存:
(1).一级缓存:
是Session级别的缓存,它同session绑定。
其生命周期随着session关闭而销毁
①它是线程不安全的,因此在设计软件架构时,应尽量避免多个线程共享一个Session实例。
②Session实例是轻量级的,这意味着在程序可以经常创建和销毁Session对象,例如为每个客户请求分配单独的Session实例。
原则:
一个线程一个Session;一个事务一个Session。
(2).二级缓存:
是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存
Spring
1.你一般用spring做什么?
控制反转IOCAOP
2.spring中的哪个类的哪个方法可用于获取bean
3.spring是什么?
根据你的理解详细谈谈你的见解。
◆目的:
解决企业应用开发的复杂性
◆功能:
使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:
任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
◆轻量——从大小与开销两方面而言Spring都是轻量的。
完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。
并且Spring所需的处理开销也是微不足道的。
此外,Spring是非侵入式的:
典型地,Spring应用中的对象不依赖于Spring的特定类。
◆控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。
当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。
你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
◆面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务()管理)进行内聚性的开发。
应用对象只实现它们应该做的——完成业务逻辑——仅此而已。
它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
◆容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。
然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
◆框架——Spring可以将简单的组件配置、组合成为复杂的应用。
在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。
Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。
它们也为Spring中的各种模块提供了基础支持。
4.项目中如何体现Spring中的切面编程,距离说明。
面向切面编程:
主要是横切一个关注点,将一个关注点模块化成一个切面。
在切面上声明一个通知(Advice)和切入点(Pointcut);通知:
是指在切面的某个特定的连接点(代表一个方法的执行。
通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。
)上执行的动作。
通知中定义了要插入的方法。
切入点:
切入点的内容是一个表达式,以描述需要在哪些对象的哪些方法上插入通知中定义的方法。
项目中用到的Spring中的切面编程最多的地方:
声明式事务管理。
a、定义一个事务管理器
b、配置事务特性(相当于声明通知。
一般在业务层的类的一些方法上定义事务)
c、配置哪些类的哪些方法需要配置事务(相当于切入点。
一般是业务类的方法上)
5.spring中可以用注入获得属性值,还有其他的方式吗?
读取配置文件
6.spring在项目中如何充当粘合剂
1、在项目中利用spring的IOC(控制反转或依赖注入),明确地定义组件接口(如UserDAO),开发者可以独立开发各个组件,然后根据组件间的依赖关系组装(UserAction依赖于UserBiz,UserBiz依赖于UserDAO)运行,很好的把Struts(Action)和hibernate(DAO的实现)结合起来了。
2、spring的事务管理把hibernate对数据库的操作进行了事务配置。
7.spring的事务如何配置
spring的声明式事务配置:
1.
--配置sessionFactory-->
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
/WEB-INF/classes/hibernate.cfg.xml
2.配置事务管理器
--配置事务管理器-->
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
3.配置事务特性
adviceid="txAdvice"tran