框架总结
一、Struts2的总结
1、Struts 2的工作流程,从请求说起
(1)客户端浏览器发出HTTP请求。
(2)根据web.xml配置,该请求被FilterDispatcher接收。
(3)根据struts.xml配置,找到需要调用的Action类和方法,经过一系列的拦截器(Interceptor)执行后,程序执行到action中的指定的方法, 并且从前台接收的参数通过IoC方式,将值注入给Aciton。
(4)Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
(5)Action执行完毕,根据struts.xml中的配置result找到对应的返回结果result,并跳转到相应页面。
(6)返回HTTP响应到客户端浏览器。
2、拦截器Interceptor和过滤器Filter的区别
(1)拦截器是基于Java反射机制的,而过滤器则可以对几乎所有请求起作用
(2)过滤器依赖于servlet容器,而拦截器不依赖servlet容器。
(3)拦截器只能对执行到Action中的请求起作用,而过滤器可以对任意请求起作用,比如直接跳转到jsp的请求
(4)拦截器可以访问action中上下文值栈里面的对象,过滤器不能。
(5)在action的生命周期中,拦截器可以多次调用,而filter只能在servlet容器初始化的时候调用。
3、在请求中将数据发送到action的方法有几种
(1)url中用问号加上参数名等于参数值(url?name=value)
(2)form表单提交
(3)ajax中传递参数
4、action中如何接收请求request中传递的参数
(1)使用request.getParameter("parametername")
(2)在action中定义一个参数,然后分别给它添加setter方法
5、action中的对象数据如何传递到jsp
(1)request.setAttribute("name",value);
(2)将对象赋值给action中的某一个有getter方法的属性
(3)request.getSession().setAttribute("name",value);
6、jsp中如何接收action设置的参数数据
(1)request.getAttribute("parametername")
(2)EL表达式直接获取
(3)request.getSession().getAttribute("parametername")
7、谈一下对struts的认识和理解(优点和好处)
(1)struts框架简化了基于MVC的web应用程序的开发。
(2)struts可以清晰地区分控制,事务逻辑和外观,从而简化了开发应用程序的过程。struts提供的类使得开发工作更加简单,这些类包括:
控制程序流程的类 ActionServlet 控制struts的程序流程
实现和执行程序事务逻辑的类 : ActionClass 包含事务逻辑
ActionForm 显示模块数据
ActionMapping 帮助控制器将请求映射到操作
ActionForward 用来指示操作转移的对象
ActionError 用来存储和回收错误Struts标记库
(3)struts2框架是为了减少在运用MVC设计模型来开发Web应用的时间,而且它确实是达到了这个效果
MVC包含三个基础部分:Model、View和Controller,这三个部分以最小的耦合协同工作,以增加程序的可扩展性和可维护性。各个部分的实现技术可以总结如下:
1)Model:JavaBean、EJB的EntityBean
2)View:JSP、Struts的TagLib
3)Controller:Struts的ActionServlet、Action
概括起来MVC的优点主要有一下方面:
1)多个视图可以对应一个模型。按MVC设计模式,一个模型对应多个视图,可以减少代码的复制及代码的维护量,一旦模型发生改变,也易于维护
2)模型返回的数据与显示逻辑分离。模型数据可以应用任何的显示技术,例如,使用JSP页面、Velocity模板或者直接产生Excel文档等
3)应用被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性
4)控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起,完成不同的请求。因此,控制层可以说是包含了用户请求权限的概念
5)MVC更符合软件工程化管理的精神。不同的层各司其职,每一层的组件具有相同的特征,有利于通过工程化和工具化产生管理程序代码
10、JSP的内置对象及方法
request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie,header,和session数据的有用的方法。
response表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)
out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息
applicaton表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息
config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。
page表示从该页面产生的一个servlet实例
exception对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件,该对象中几乎定义所有的异常信息。
二、hibernate的总结
1.常见的ORM框架有哪些
hibernate mybatis jpa
2.hibernate从加载配置到到关闭session的整个过程中设计的核心类有哪些
//加载默认的hibernate配置文件,默认名为hibernate.cfg.xml
final StandardServiceRegistry registry=
new StandardServiceRegistryBuilder().configure().build();
//使用MetadataSources(registry)创建sessionFactory
SessionFactory sessionFactory=
new MetadataSources(registry).buildMetadata().buildSessionFactory();
//创建session
Session session = sessionFactory.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
transaction.commit();
//关闭session
session.close();
//关闭SessionFactory
sessionFactory.close();
3.请解释hibernate方言的概念
针对不同的数据库,hibernate可以使用统一的hql,在hibernate和具体的数据库交互的时候,就通过与具体数据库种类和版本匹配的方言将hql解析称sql去执行。(扩展性很强)
4.常用的主键生成策略
自增长:identity
sequence
native:支持自增长increment就采用自增长
uuid:hibernate生成的32的字符串
assigned:自己指定或设置
foreign:使用外键字段作为主键
5.hibernate的实体对象有哪几种存在状态和特点
临时状态(瞬态):对象由new操作符创建,且尚未与Hibernate Session关联的对象被认为处于瞬态(session缓存中没有该对象)。瞬态对象不会被持久化到数据库中(也不存在于数据库中),也不会被赋予持久化标识(OID)。如果程序中失去了瞬态对象的引用,瞬态对象将被垃圾回收机制销毁。使用Hibernate Session可以将其变为持久化状态。
持久化状态:持久化实例在数据库中有对应的记录,并拥有一个持久化标识(identifier,有OID,持久化对象的ID不能被修改)。持久化的实例可以是刚刚保存的,也可以是刚被加载的。无论哪一种,持久化对象都必须与特定的Hibernate Session关联。并且每条记录在同一个session对象中有且仅有一个缓存对象,Hibernate会检测到处于持久化状态对象的改动,在当前操作完成时将对象数据写回数据库。开发者不需要手动执行UPDATE。
游离(脱管)状态:某个实例曾经处于持久化状态,但随着与之关联的Session被关闭,该对象就变成脱管状态。脱管状态的引用依然有效,对象可继续被修改。如果重新让脱管对象与某个Session关联,这个脱管对象会重新转换为持久化状态,而脱管期间的改动也不会丢失,也可被写入数据库。
6.请描述下session的load()和get()的区别。
get()每次执行都会执行sql语句,不会延迟。load()方法只是会在我们对拿到的实体对象进行操作的时候才去执行查询,拿到相应的实体信息。load方法返回的是一个代理对象。无论是get还是load首先都会查一级缓存(session)中有没有相应的对应值,如果没有,再去数据库进行查找。另外,使用get方法时,如果指定的id在数据库在不存在则返加null,使用load方法时,如果指定id不存在则会报异常。
7.hibernate中实体类、类实例以及类中的属性和数据库表的对应关系。
持久化(实体)类对应关系型数据库表,类实例对应表中记录,类属性对应表字段。
8.hibernate中实体对象之间的对应关系有哪三种,请简单描述这三种关系的使用方法和场景。
一对一、一对多、多对多。
9.session对象的evict()和clear()的区别、refresh()和flush()的区别。
flush() flush只会操作持久化状态的对象,或者说只会操作一级缓存中的对象。flush只是执行了sql语句,但没有执行commit方法。对于临时对象和游离对象不做任何操作。
refresh() 和flush类似,只不过是方向相反。flush是把session缓存中的对象往数据库中更新,而refresh是把数据库中的对象往session缓存中更新。
evict() 该方法是从一级缓存中把持久化对象移除。
clear() 清理session中的所有缓存。
三、spring的总结
1、简单介绍对spring IOC的理解和依赖注入实现方式
在平时的java应用开发中,我们要实现某一个功能或者说是完成某个业务逻辑时至少需要两个或以上的对象来协作完成,在没有使用Spring的时候,每个对象在需要使用他的合作对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上,自己需要哪个合作对象,就主动去创建,创建合作对象的主动权和创建时机是由自己把控的,而这样就会使得对象间的耦合度高了,A对象需要使用合作对象B来共同完成一件事,A要使用B,那么A就对B产生了依赖,也就是A和B之间存在一种耦合关系,并且是紧密耦合在一起,而使用了Spring之后就不一样了,创建合作对象B的工作是由Spring来做的,Spring创建好B对象,然后存储到一个容器里面,当A对象需要使用B对象时,Spring就从存放对象的那个容器里面取出A要使用的那个B对象,然后交给A对象使用,至于Spring是如何创建那个对象,以及什么时候创建好对象的,A对象不需要关心这些细节问题(你是什么时候生的,怎么生出来的我可不关心,能帮我干活就行),A得到Spring给我们的对象之后,两个人一起协作完成要完成的工作即可。
其主要总用是解耦和提高性能(单例模式)
在Java中注入有以下三种实现方式:
构造器注入
Setter方法注入
接口注入
2、Spring Bean的作用域之间有什么区别?
singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。
prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。
下面是基于spring mvc的可不做回答
request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。
全局作用域与Servlet中的session作用域效果相同。
3、Spring有几种配置方式?
将Spring配置到应用开发中有以下三种方式:
基于XML的配置
基于注解的配置
基于Java的配置(其实就是注解,用语实现无配置文件的spring开发)
简谈对aop的理解
AOP(Aspect-Oriented Programming)其实是OOP(Object-Oriented Programming)
思想的补充和完善。我们知道,OOP引进"抽象"、"封装"、"继承"、"多态"等概念,对万事万物进行抽象和封装,来建立一种对象的层次结构,它强调了一种完整事物的自上而下的关系。但是具体细粒度到每个事物内部的情况,OOP就显得无能为力了。比如日志功能。日志代码往往水平地散布在所有对象层次当中,却与它所散布到的对象的核心功能毫无关系。对于其他很多类似功能,如事务管理、权限控制等也是如此。这导致了大量代码的重复,而不利于各个模块的重用。
而AOP技术则恰恰相反,它利用一种称为"横切"的技术,能够剖解开封装的对象内部,并将那些影响了多个类并且与具体业务无关的公共行为 封装成一个独立的模块(称
为切面)。更重要的是,它又能以巧夺天功的妙手将这些剖开的切面复原,不留痕迹的融入核心业务逻辑中。这样,对于日后横切功能的编辑和重用都能够带来极大
的方便。
AOP技术的具体实现,无非也就是通过动态代理技术或者是在程序编译期间进行静态的"织入"方式。下面是这方面技术的几个基本术语:
1、join point(连接点):是程序执行中的一个精确执行点,例如类中的一个方法。它是一个抽象的概念,在实现AOP时,并不需要去定义一个join point。
2、point cut(切入点):本质上是一个捕获连接点的结构。在AOP中,可以定义一个point cut,来捕获相关方法的调用。
3、advice(通知):是point cut的执行代码,是执行“方面”的具体逻辑。
4、aspect(方面):point cut和advice结合起来就是aspect,它类似于OOP中定义的一个类,但它代表的更多是对象间横向的关系。
5、introduce(引入):为对象引入附加的方法或属性,从而达到修改对象结构的目的。有的
4、Spring和struts集成需要的配置要点以及集成使用的意义
(1)首先web.xml中用filter的方式引入struts,以listener的方式引入spring
(2)相应集成包的引入
(3)struts.xml中添加
(4)action类可以配制成Bean同时使用spring依赖注入
集成使用的意义是由spring来管理struts的action类的实例化,和依赖注入,要注意的是action的scope是单例模式
5、Spring和hibernate集成的配置要点以及集成使用的意义
(1) 引入spring中的orm依赖
(2)在spring中配置datasource
(3)在spring中配置sessionfactory并将datasource注入
(4)配置spring管理hibernate事务管理类并注入sessionfactory
(5)配置aop,设置在service(业务逻辑层)
(6)讲aop切面和事务管理advice绑定
(7)可以从spring容器中获取hibernatesupport类来使用hibernate操作数据库
好处
(1)由IOC容器来管理Hibernate的SessionFactory
(2)使用spring的aop来管理hiberante的事务声明和提交,简化开发过程。