JAVA三大框架面试题-如果你能够撑握保证找到一份好工作_第1页
JAVA三大框架面试题-如果你能够撑握保证找到一份好工作_第2页
JAVA三大框架面试题-如果你能够撑握保证找到一份好工作_第3页
JAVA三大框架面试题-如果你能够撑握保证找到一份好工作_第4页
JAVA三大框架面试题-如果你能够撑握保证找到一份好工作_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Struts2面试题1、struts2工作流程Struts2框架本身大致可以分为3个局部:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。核心控制器FilterDispatcher是Struts2框架的根底,包含了框架内部的控制流程和处理机制。业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。Struts2的工作流程相对于Struts1要简单,与WebWork框架根本相同,所以说Struts2是WebWork的升级版本。根本简要流程如下:1、客户端初始化一个指向Servlet容器的请求;2、这个请求经过一系列的过滤器〔Filter〕〔这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMeshPlugin〕3、接着FilterDispatcher被调用, FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action4、如果ActionMapper决定需要调用某个Action, FilterDispatcher把请求的处理交给ActionProxy5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类6、ActionProxy创立一个ActionInvocation的实例。7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器〔Intercepter〕的调用。8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是〔但不总是,也可能是另外的一个Action链〕一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper9、响应的返回是通过我们在web.xml中配置的过滤器10、如果ActionContextCleanUp是当前使用的,那么FilterDispatecher将不会清理sreadlocalActionContext;如果ActionContextCleanUp不使用,那么将会去清理sreadlocals。2、说下Struts的设计模式MVC模式:web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创立,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate〔〕验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创立这个对象,然后调用Action的execute〔〕方法。Execute〔〕从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。3、拦截器和过滤器的区别1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。

2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。

3、拦截器只能对Action请求起作用,而过滤器那么可以对几乎所有请求起作用。

4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。

5、在Action的生命周期中,拦截器可以屡次调用,而过滤器只能在容器初始化时被调用一次。4、struts1于struts2的比拟1、Action

类:

Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。

Struts

2

Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的效劳成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

2、线程模式:

Struts1

Action是单例模式并且必须是线程平安的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1

Action能作的事,并且要在开发时特别小心。Action资源必须是线程平安的或同步的。

Struts2

Action对象为每一个请求产生一个实例,因此没有线程平安问题。〔实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题〕

3、Servlet

依赖:

Struts1

Action

依赖于Servlet

API

,因为当一个Action被调用时ServletRequest

ServletResponse

被传递给execute方法。

Struts

2

Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2

Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问ServetRequest

ServletResponse的必要性。

4、可测性:

测试Struts1

Action的一个主要问题是execute方法暴露了servlet

API〔这使得测试要依赖于容器〕。一个第三方扩展--Struts

TestCase--提供了一套Struts1的模拟对象〔来进行测试〕。

Struts

2

Action可以通过初始化、设置属性、调用方法来测试,“依赖注入〞支持也使测试更容易。

5、捕获输入:

Struts1

使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创立多余的类捕获输入。动态Bean〔DynaBeans〕可以作为创立传统ActionForm的选择,但是,开发者可能是在重新描述(创立)已经存在的JavaBean〔仍然会导致有冗余的javabean〕。

Struts

2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过

web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种

ModelDriven

特性简化了taglib对POJO输入对象的引用。

6、表达式语言:

Struts1

整合了JSTL,因此使用JSTL

EL。这种EL有根本对象图遍历,但是对集合和索引属性的支持很弱。

Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object

Graph

Notation

Language"

(OGNL).

7、绑定值到页面〔view〕:

Struts

1使用标准JSP机制把对象绑定到页面中来访问。

Struts

2

使用

"ValueStack"技术,使taglib能够访问值而不需要把你的页面〔view〕和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面〔view〕。

8、类型转换:

Struts

1

ActionForm

属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。

Struts2

使用OGNL进行类型转换。提供根本和常用对象的转换器。

9、校验:

Struts

1支持在ActionForm的validate方法中手动校验,或者通过Commons

Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。

Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

10、Action执行的控制:

Struts1支持每一个模块有单独的Request

Processors〔生命周期〕,但是模块中的所有Action必须共享相同的生命周期。

Struts2支持通过拦截器堆栈〔Interceptor

Stacks〕为每一个Action创立不同的生命周期。堆栈能够根据需要和不同的Action一起使用。为什么要使用Struts2Struts2是一个相当强大的JavaWeb开源框架,是一个基于POJO的Action的MVCWeb框架。它基于当年的Webwork和XWork框架,继承其优点,同时做了相当的改良。1.Struts2基于MVC架构,框架结构清晰,开发流程一目了然,开发人员可以很好的掌控开发的过程。2使用OGNL进行参数传递。OGNL提供了在Struts2里访问各种作用域中的数据的简单方式,你可以方便的获取Request,Attribute,Application,Session,Parameters中的数据。大大简化了开发人员在获取这些数据时的代码量。3强大的拦截器Struts2的拦截器是一个Action级别的AOP,Struts2中的许多特性都是通过拦截器来实现的,例如异常处理,文件上传,验证等。拦截器是可配置与重用的,可以将一些通用的功能如:登录验证,权限验证等置于拦截器中以完成一些JavaWeb工程中比拟通用的功能。在我实现的的一Web工程中,就是使用Struts2的拦截器来完成了系统中的权限验证功能。4易于测试Struts2的Action都是简单的POJO,这样可以方便的对Struts2的Action编写测试用例,大大方便了5JavaWeb工程的测试。易于扩展的插件机制在Struts2添加扩展是一件愉快而轻松的事情,只需要将所需要的Jar包放到WEB-INF/lib文件夹中,在struts.xml中作一些简单的设置就可以实现扩展。6模块化管理Struts2已经把模块化作为了体系架构中的根本思想,可以通过三种方法来将应用程序模块化:将配置信息拆分成多个文件把自包含的应用模块创立为插件创立新的框架特性,即将与特定应用无关的新功能组织成插件,以添加到多个应用中去。7全局结果与声明式异常为应用程序添加全局的Result,和在配置文件中对异常进行处理,这样当处理过程中出现指定异常时,可以跳转到特定页面。他的如此之多的优点,是很多人比拟的青睐,与spring,Hibernate进行结合,组成了现在比拟流行的ssh框架,当然每个公司都要自己的框架,也是ssh变异的产品。struts2有哪些优点?1〕在软件设计上Struts2的应用可以不依赖于Servlet

API和struts

API。Struts2的这种设计属于无侵入式设计;2〕拦截器,实现如参数拦截注入等功能;3〕类型转换器,可以把特殊的请求参数转换成需要的类型;4〕多种表现层技术,如:JSP、freeMarker、Velocity等;5〕Struts2的输入校验可以对指定某个方法进行校验;6〕提供了全局范围、包范围和Action范围的国际化资源文件管理实现struts2是如何启动的?struts2框架是通过Filter启动的,即StrutsPrepareAndExecuteFilter,此过滤器为struts2的核心过滤器;StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。struts2读取到struts.xml的内容后,是将内容封装进javabean对象然后存放在内存中,以后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件。struts2框架的核心控制器是什么?它有什么作用?1〕Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。2〕作用:负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,否那么struts2框架将略过该请求的处理。可以通过常量ension"修改action的后缀,如:<constant

name="struts.action.extension"value="do"/>如果用户需要指定多个请求后缀,那么多个后缀之间以英文逗号〔,〕隔开。<constant

name="struts.action.extension"value="do,go"/>

struts2配置文件的加载顺序?struts.xml

——>

perties

常量可以在struts.xml或perties中配置,如果在多个文件中配置了同一个常量,那么后一个文件中配置的常量值会覆盖前面文件中配置的常量值.

struts.xml文件的作用:通知Struts2框架加载对应的Action资源struts2常量的修改方式?常量可以在struts.xml或perties中配置,两种配置方式如下:1〕在struts.xml文件中配置常量<constant

name="struts.action.extension"

value="do"/>

2〕在perties中配置常量〔perties文件放置在src下〕:struts.action.extension=dostruts2如何访问ServletRequest、Session、ServletContext三个域对象?方案一:ServletRequestrequest

=ServletActionContext.getRequest();

ServletResponseresponse

=ServletActionContext.getResponse();

Session

session=

request.getSession();

ServletContextservletContext=ServletActionContext.getServletContext();

方案二:类implements

ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware

注意:框架自动传入对应的域对象struts2是如何管理action的?这种管理方式有什么好处?struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的。主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。struts2中的默认包struts-default有什么作用?1〕struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型,而Struts2很多核心的功能都是通过这些内置的拦截器实现,如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了struts-default包才能使用struts2为我们提供的这些功能。2〕struts-default包是在struts-default.xml中定义,struts-default.xml也是Struts2默认配置文件。Struts2每次都会自动加载struts-default.xml文件。3〕通常每个包都应该继承struts-default包。struts2如何对指定的方法进行验证?1〕validate()方法会校验action中所有与execute方法签名相同的方法;2〕要校验指定的方法通过重写validateXxx()方法实现,validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写;3〕当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败信息〔为了使用addFieldError()方法,action可以继承ActionSupport〕,如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result;4〕在input视图中可以通过<s:fielderror/>显示失败信息。5〕先执行validateXxxx()->validate()->如果出错了,会转发<result

name="input"/>所指定的页面,如果不出错,会直接进行Action::execute()方法struts2默认能解决get和post提交方式的乱码问题吗?不能。struts.i18n.encoding=UTF-8属性值只能解析POST提交下的乱码问题。请你写出struts2中至少5个的默认拦截器?fileUpload

提供文件上传功能i18n

记录用户选择的locale

cookies

使用配置的name,value来是指cookies

checkbox

添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。chain

让前一个Action的属性可以被后一个Action访问,现在和chain类型的result〔〕结合使用。alias

在不同请求之间将请求参数在不同名字件转换,请求内容不变值栈ValueStack的原理与生命周期?1〕ValueStack贯穿整个Action

的生命周期,保存在request域中,所以ValueStack和request的生命周期一样。当Struts2接受一个请求时,会迅速创立ActionContext,ValueStack,action。然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。请求来的时候,action、ValueStack的生命开始,请求结束,action、ValueStack的生命结束;2〕action是多例的,和Servlet不一样,Servelt是单例的;3〕每个action的都有一个对应的值栈,值栈存放的数据类型是该action的实例,以及该action中的实例变量,Action对象默认保存在栈顶;4〕ValueStack本质上就是一个ArrayList;5〕关于ContextMap,Struts

会把下面这些映射压入ContextMap

中:parameters

:

该Map

中包含当前请求的请求参数request

:

该Map

中包含当前request

对象中的所有属性session

:该Map

中包含当前session

对象中的所有属性application

:该Map

中包含当前application

对象中的所有属性attr:该Map

按如下顺序来检索某个属性:

request,

session,

application

6〕使用OGNL访问值栈的内容时,不需要#号,而访问request、session、application、attr时,需要加#号;7〕注意:Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:<s:property

value="name"/>

8〕在struts2配置文件中引用ognl表达式

,引用值栈的值,此时使用的"$",而不是#或者%;

ActionContext、ServletContext、pageContext的区别?1〕ActionContext是当前的Action的上下文环境,通过ActionContext可以获取到request、session、ServletContext等与Action有关的对象的引用;2〕ServletContext是域对象,一个web应用中只有一个ServletContext,生命周期伴随整个web应用;3〕pageContext是JSP中的最重要的一个内置对象,可以通过pageContext获取其他域对象的应用,同时它是一个域对象,作用范围只针对当前页面,当前页面结束时,pageContext销毁,生命周期是JSP四个域对象中最小的。result的type属性中有哪几种结果类型?一共10种:dispatcher

struts默认的结果类型,把控制权转发给应用程序里的某个资源不能把控制权转发给一个外部资源,假设需要把控制权重定向到一个外部资源,

应该使用redirect结果类型redirect

把响应重定向到另一个资源〔包括一个外部资源〕redirectAction

把响应重定向到另一个Action

freemarker、velocity、chain、header、xslt、plainText、stream

拦截器的生命周期与工作过程?1〕每个拦截器都是实现了Interceptor接口的Java

类;2〕init():

该方法将在拦截器被创立后立即被调用,

它在拦截器的生命周期内只被调用一次.

可以在该方法中对相关资源进行必要的初始化;3〕intercept(ActionInvocation

invocation):

每拦截一个动作请求,

该方法就会被调用一次;4〕destroy:

该方法将在拦截器被销毁之前被调用,

它在拦截器的生命周期内也只被调用一次;5〕struts2中有内置了18个拦截器。struts2如何完成文件的上传?1、JSP页面:1〕JSP页面的上传文件的组件:<s:

file

name=〞upload〞

/>,如果需要一次上传多个文件,

就必须使用多个file

标签,

但它们的名字必须是相同的,即:name=“xxx〞的值必须一样;2〕必须把表单的enctype属性设置为:multipart/form-data;3〕表单的方法必须为post,因为post提交的数据在消息体中,而无大小限制。2、对应的action:1〕在Action

中新添加3

个和文件上传相关的属性;2〕如果是上传单个文件,

uploadImage属性的类型就是java.io.File,

它代表被上传的文件,

第二个和第三个属性的类型是String,

它们分别代表上传文件的文件名和文件类型,定义方式是分别是:jsp页面file组件的名称+ContentType,

jsp页面file组件的名称+FileName

3〕如果上上传多个文件,

可以使用数组或List

struts2.0学习总结1:在action中定义的变量,在jsp页面中显示用:<s:propertyvalue="变量名"/>2:在页面中实现自动增加的序号用iterator的statuts的index属性eg:<s:iteratorvalue="#request.inOutAccountList"id="data"status="listStat"><s:propertyvalue="#listStat.index+1"/></s:iterator>3:在action类中取得request和session对象的方法Mapsession=ActionContext.getContext().getSession();

ServletRequestrequest=ServletActionContext.getRequest();设置它们的值的方法session.put("operation","add");

request.setAttribute("name",name);页面中取得它们的值:<s:propertyvalue="#session.operation"/>

<s:propertyvalue="#"/>4:页面中奇偶行样式不一样的控制方法:<trclass="<s:iftest='#listStat.odd==true'>tableStyle-tr1</s:if><s:else>tableStyle-tr2</s:else>">5:单项选择框和复选框的使用方法1):可以设置默认选中值,注意list的值的设置,通过这种方式使key和value不一样,这种方法比拟常用(checkboxlistorradio)<s:radioname="uncarInsPolicy.policyStateCode"

list="#{'5':'通过','2':'不通过'}"

listKey="key"

listValue="value"

value='5'

/>2):这里的key和value的值是一样的(checkboxlistorradio)<s:checkboxlist

list="{'Red','Blue','Green'}"

name="favoriteColor"/>6:struts2中的标签会生成类似由<tr><td></td></tr>构成的字串〔具体什么标签生成什么,可以查看生成后的页面的源代码〕如果不限制这些多余代码的生成,页面将变得无法控制,所以一般我们是不希望它生成多余的代码的,具体的设置方法如果,在struts.xml中统一配置

<constantname="struts.ui.theme"value="simple"/>加上该句即可

也可以通过在页面中将tag的theme属性设为"simple"取消其默认的表格布局

不过最好是:自定义一个theme,并将其设为默认应用到整个站点,如此一来就可以得到统一的站点风格7:jsp页面中格式化日期的方法<s:datename="unCarInsModificationInfo.createTime"format="yyyy-MM-dd"nice="false"/>这样就可以将日期格式化为yyyy-MM-dd的形式8:默认情况下,当请求action发生时,Struts运行时〔Runtime〕根据struts.xml里的Action映射集(Mapping),实例化action对应的类,并调用其execute方法。当然,我们可以通过以下两种方法改变这种默认调用1〕在classes/sturts.xml中新建Action,并指明其调用的方法

比方想调用action类中的publicStringaliasAction(){

message="自定义Action调用方法";

returnSUCCESS;

}

那么在classes/sturts.xml中参加下面代码:

<actionname="AliasHelloWorld"class="tutorial.HelloWorld"method="aliasAction">

<result>/HelloWorld.jsp</result>

</action>

既可用action名调用该方法了2〕〔比拟常用〕访问Action时,在Action名后加上“!xxx〞〔xxx为方法名〕。9:Struts2.0有两个配置文件,struts.xml和perties都是放在WEB-INF/classes/下。

struts.xml用于应用程序相关的配置

perties用于Struts2.0的运行时〔Runtime〕的配置10:在action类中取得web下某一文件夹物理路径〔绝对路径〕的方法

filePath=ServletActionContext.getServletContext().getRealPath("/upLoadFiles")11:要想返回的页面不是一个直接JSP页面而是要先通过返回action中的方法读取相应的数据再返回到jsp页面,有两种方法1〕在struts.xml中这么设置<resultname="list"type="redirect-action">sysmanage/UserBaseInfoAction!findUserBaseInfo.action</result>2〕在action中返回时直接调用这个方法即可returnfindList〔〕;12:设置checkboxlist中默认值的方法<s:checkboxlistname="skills1"

="Skills1"

list="{'Java','.Net','RoR','PHP'}"

value="{'Java','.Net'}"/>

<s:checkboxlistname="skills2"

label="Skills2"

list="#{1:'Java',2:'.Net',3:'RoR',4:'PHP'}"

listKey="key"

listValue="value"

value="{1,2,3}"/>13:二级级连下拉框<s:setname="foobar"

value="#{'Java':{'Spring','Hibernate','Struts2'},'.Net':{'Linq','ASP.NET2.0'},'Database':{'Oracle','SQLServer','DB2','MySQL'}}"/>

<s:doubleselectlist="#foobar.keySet()"

doubleName="technology"

doubleList="#foobar[top]"

label="Technology"/>在Struts1.*中,要想访问request、response以及session等Servlet对象是很方便的,因为它们一直是作为形参在各个方法之间进行传递的,而在Struts2中我们就很难看到它们的芳踪了,因为我们获得表单中的值都是通过预先设置好了的get方法来得到的,那么如果有些参数我们必须通过request.getParametre或者session.getAttribute来得到,那么应该怎么做呢?按照Max的教程上的说法,可以分为两种:IoC方式和非IoC方式,如何理解这两种方式的区别呢?IoC是Spring里面的特征之一,字面意思是反转控制,说白了就是依赖注入,比方说类A依赖类B,那么就主动的给A注入一个类B的对象,下面看一下这两种方法的具体实现。1.非Ioc方式这种方式主要是利用了类以及类,具体的方法如下所示。获得request对象:A.ServletRequestrequest=ServletActionContext.getRequest();B.ActionContextct=ActionContext.getContext()

ServletRequestrequest=(ServletRequest)ct.get(ServletActionContext._REQUEST);获得session对象:在Struts2中底层的session都被封装成了Map类型,我们称之为SessionMap,而平常我们所说的session那么是指Session对象,具体的获得方法如下所示。A.Mapsession=ActionContext.getSession();B.Mapsession=(Map)ActionContext.getContext().get(ActionContext.SESSION);得到这个SessionMap之后我们就可以对session进行读写了,如果我们想得到原始的Session可以首先得到ServletRequest对象,然后通过request.getSession()来取得原始的Session对象。一般情况下SessionMap已经可以完成所有的工作,我们不必再去碰底层的session了。2.IoC方式这种方式相对来说变化就比拟少了,具体流程如下所示。获得request对象:第一步:让action实现ServletRequestAware接口第二步:在action中声明一个ServletRequest类型的实例变量第三步:在action中实现ServletRequestAware接口的setServletRequest方法,实现方式很简单,如下所示。privateServletRequestrequest;publicvoidsetServletRequest(ServletRequestrequest){this.request=request;

}获得Session对象(注意,此时的session是SessionMap类型):第一步:让action实现SessionAware接口第二步:在action中声明一个ServletRequest类型的实例变量第三步:在action中实现SessionAware接口的setSession方法,实现方式很简单,如下所示。Spring面试题1.Spring框架有哪些模块?Spring框架由七个模块组成组成,这7个模块(或组件)均可以单独存在,也可以与其它一个或多个模块联合使用,如下所示:(1)Spring核心容器——IoC容器(2)SpringAOP(3)SpringORM(4)SpringDAO(5)SpringWEB(6)Spring上下文〔Context〕(7)SpringMVC2.为什么要使用Spring框架,它有什么优点?(1)轻量级的框架(2)非侵入性的(3)可以整合其它的框架,比方Struts,Hibernate等(4)可以提供事务管理3.Spring框架的工作机制是什么?(1)SpringMVC将所有的请求都提交给DispatcherServlet,它会委托应用系统的其它模块负责对请求进行真正的处理工作。(2)DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller。(3)DispatcherServlet请请求提交到目标Controller。(4)Controller进行业务逻辑处理后,会返回一个ModelAndView。(5)Dispathcher查询一个或多个ViewResolver(视图解析器),找到ModelAndView对象指定的视图对象。(6)视图对象负责将结果返回给客户端。4.怎么使用Spring配置事务?Spring同时支持编程式事务策略和声明式事务策略,大局部时候都采用声明式事务策略。声明式事务管理的配置方式,通常有以下4种:(1)使用TransactionProxyFactoryBean为目标Bean生成事务代理的配置。此方式是最传统、配置文件最臃肿、最难以阅读的方式。(2)采用Bean继承的事务代理配置方式,比拟简洁,但依然是增量式配置。(3)采用BeanNameAutoProxyCreator,根据BeanName自动生成事务代理的方式。这是直接利用Spring的AOP框架配置事务代理的方式,需要对Spring的AOP框架有所理解。但这种方式防止了增量式配置,效果非常不错。(4)采用DefaultAdvisorAutoProxyCreator,直接利用Spring的AOP框架配置事务代理的方式,效果非常不错,只是这种配置方式的可读性不如第3种方式。5.请你谈谈SSH整合SSH整合:Struts〔表示层〕+Spring〔业务层〕+Hibernate〔持久层〕Struts:Struts是一个表示层框架,主要作用是界面展示、接收请求和分发请求。在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。View:沿用JSP,,Form,Tag,Resourse;Controller:ActionServlet,struts-config.xml,Action。Hibernate:Hibernate是一个持久层框架,它只负责与关系数据库的操作。Spring:Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。6.在Spring框架中如何配置数据库驱动?asource.DriverManagerDataSource数据源来配置数据库驱动。例如:

<beanid=〞dataSource〞>

<propertyname=〞driverClassName〞><value>org.hsqldb.jdbcDriver</value></property>

<propertyname=〞url〞><value>jdbc:hsqldb:db/appfuse</value></property>

<propertyname=〞username〞><value>sa</value></property>

<propertyname=〞password〞><value></value></property>

</bean>7.在Spring框架中applicationContext.xml文件能不能改成其它文件名?ContextLoaderListener是一个ServletContextListener,在启动Tomcat应用效劳器时,它会读取WEB-INF目录下的applicationContext.xml文件,初始化Spring配置。如果你想改变applicationContext.xml文件的名字或改变它的存储位置,可以通过在web.xml文件中定义一个<context-param>元素来解决这个问题。例如ontext.ContextLoaderListener

<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/xyz.xml</param-value>

</context-param></listener-class>

</listener>8.如何在Web应用里配置Spring?在/WEB-INF/web.xml文件中,参加如下内容:<servlet><servlet-name>context</servlet-name><servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class><load-on-startup>1</load-on-startup></servlet>在启动Web应用效劳器(Tomcat)时,将加载/WEB-INF/applicationContext.xml文件中的内容。在应用程序中,可以通过如下方式获取ApplicationContext实例WebApplicationContextUtils.getWebApplicationContext9.Spring里如何定义HibernateMapping?添加hibernatemapping文件到WEB-INF目录下的applicationContext.xml文件中。例如:

<propertyname=〞mappingResources〞>

<list>

<value>org/appfuse/model/User.hbm.xml</value>

</list>

</property>10.解释一下DependencyInjection(DI,依赖注入)和IoC(InversionofControl,控制反转)?依赖注入DI是一种设计模式,通常也称作控制反转,尽管在技术上来讲,依赖注入是一个IoC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一种特殊的能力。例如,把一个数据库连接以参数的形式传到一个对象的构造函数里面而不是在那个对象内部自行创立一个连接。控制反转和依赖注入的根本思想就是把类的依赖从类内部转化到外部以减少依赖。应用控制反转,对象在被创立的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取它依赖的对象的引用,这个责任的反转。11.Spring中的BeanFactory与ApplicationContext的作用有哪些?(1)BeanFactory负责读取Bean配置文档,管理Bean的加载和实例化,维护Bean之间的依赖关系,负责Bean的生命周期。(2)ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:a.国际化支持b.资源访问:Resourcers=ctx.getResource(〞classpath:perties〞);c.事件传递:通过实现ApplicationContextAware接口(3)常用的获取ApplicationContext的方法:FileSystemXmlApplicationContext:从文件系统或者URL指定的xml配置文件创立,参数为配置文件名或文件名数组ClassPathXmlApplicationContext:从classpath的xml配置文件创立,可以从jar包中读取配置文件。WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现

<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<servlet>

<servlet-name>context</servlet-name>

<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

这两种方式都默认配置文件为WEB-INF/applicationContext.xml,也可使用context-param指定配置文件<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/myApplicationContext.xml</param-value></context-param>12.如何在Spring中实现国际化?在applicationContext.xml文件中配置一个bean:

<beanid=〞messageSource〞class=〞org.springframewt.ResourceBundleMessageSource〞>

<propertyname=〞basename〞><value>message</value></property>

</bean>在src目录下建多个properties文件,其命名格式是message_语言_国家。在页面中显示信息时,通过applictionContext.getMessage(“键名〞,〞参数〞,〞区域〞)取出相关的信息。13.Spring中的核心类有那些,各有什么作用?BeanFactory:产生一个新的实例,可以实现单例模式。BeanWrapper:提供统一的get及set方法。ApplicationContext:提供Spring框架的实现,包括BeanFactory的所有功能。14.什么是AOP,AOP的作用是什么?面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的缺乏。除了类(classes)以外,AOP提供了切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。Spring的一个关键的组件就是AOP框架,可以自由选择是否使用AOP,提供声明式企业效劳,特别是为了替代EJB声明式效劳。最重要的效劳是声明性事务管理,这个效劳建立在Spring的抽象事物管理之上。允许用户实现自定义切面,用AOP来完善OOP的使用,可以把SpringAOP看作是对Spring的一种增强。15.使用Spring有什么好处?(1)Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其它的包含了J2EE特有APIs的framework,你会发现Spring关注了遗留问题。(2)Spring能消除在许多工程上对Singleton的过多使用。(3)Spring能消除使用各种格式的属性定制文件的需要,在整个工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。(4)Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。(5)Spring被设计为让使用它创立的应用尽可能少的依赖于它的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。(6)使用Spring构建的应用程序易于单元测试。(7)Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或localEJBs来实现业务接口,却不会影响调用代码。(8)Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。(9)Spring为数据存取提供了一致的框架,不管是使用JDBC或O/Rmapping产品〔如Hibernate〕。16.什么是Spring,它有什么特点?Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。(1)轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布,并且Spring所需的处理开销也是微缺乏道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。(2)控制反转——Spring通过一种称作控制反转〔IoC〕的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创立或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象沉着器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。(3)面向切面——Spring提供了面向切面编程的丰富支持,允许通过别离应用的业务逻辑与系统级效劳〔例如审计〔auditing〕和事务管理〕进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。(4)容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创立——基于一个可配置原型〔prototype〕,你的bean可以创立一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混淆于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。(5)框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多根底功能〔事务管理、持久化框架集成等等〕,将应用逻辑的开发留给了你。17.AOP里面几个重要名词概念的解释(1)切面(Aspect)一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在SpringAOP中,切面可以使用通用类〔基于模式的风格〕或者在普通类中以@Aspect注解来实现。(2)连接点(Joinpoint)在程序执行过程中某个特定的点,比方某方法调用的时候或者处理异常的时候。在SpringAOP中,一个连接点总是代表一个方法的执行。通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知〔Advice〕的主体局部获得连接点信息。(3)通知(Advice)在切面的某个特定的连接点〔Joinpoint〕上执行的动作。通知有各种类型,其中包括“around〞、“before〞和“after〞等通知。通知的类型将在后面局部进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。(4)切入点(Pointcut)匹配连接点〔Joinpoint〕的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行〔例如,当执行某个特定名称的方法时〕。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。引入(Introduction)也被称为内部类型声明〔inter-typedeclaration〕〕。声明额外的方法或者某个类型的字段。Spring允许引入新的接口〔以及一个对应的实现〕到任何被代理的对象。例如,你可以使用一个引入来使bean实现IsModified接口,以便简化缓存机制。(6)目标对象(TargetObject)被一个或者多个切面〔aspect〕所通知〔advise〕的对象。也有人把它叫做被通知〔advised〕对象。既然SpringAOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。(7)AOP代理(AOPProxy)AOP框架创立的对象,用来实现切面契约〔aspectcontract〕〔包括通知方法执行等功能〕。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。注意:Spring2.0最新引入的基于模式〔schema-based〕风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创立是透明的。(8)织入(Weaving)把切面〔aspect〕连接到其它的应用程序类型或者对象上,并创立一个被通知〔advised〕的对象。这些可以在编译时〔例如使用AspectJ编译器〕,类加载时和运行时完成。Spring和其它纯JavaAOP框架一样,在运行时完成织入。*比拟Hibernate的三种检索策略优缺点1立即检索;

优点:对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象;

缺点:1.select语句太多;2.可能会加载应用程序不需要访问的对象白白浪费许多内存空间;

2延迟检索:

优点:由应用程序决定需要加载哪些对象,可以防止可执行多余的select语句,以及防止加载应用程序不需要访问的对象。因此能提高检索性能,并且能节省内存空间;

缺点:应用程序如果希望访问游离状态代理类实例,必须保证他在持久化状态时已经被初始化;

3迫切左外连接检索

优点:1对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便地冲一个对象导航到与它关联的对象。2使用了外连接,select语句数目少;

缺点:1可能会加载应用程序不需要访问的对象,白白浪费许多内存空间;2复杂的数据库表连接也会影响检索性能;*如何在控制台看到hibernate生成并执行的sql在定义数据库和数据库属性的文件applicationConfig.xml里面,把hibernate.show_sql设置为true

这样生成的SQL就会在控制台出现了

注意:这样做会加重系统的负担,不利于性能调优*hibernate都支持哪些缓存策略Read-only:

这种策略适用于那些频繁读取却不会更新的数据,这是目前为止最简单和最有效的缓存策略

*Read/write:这种策略适用于需要被更新的数据,比read-only更消耗资源,在非JTA环境下,每个事务需要在session.close和session.disconnect()被调用

*Nonstrictread/write:这种策略不保障两个同时进行的事务会修改同一块数据,这种策略适用于那些经常读取但是极少更新的数据

*Transactional:这种策略是完全事务化得缓存策略,可以用在JTA环境下*hibernate里面的sortedcollection和orderedcollection有什么区别sortedcollection是在内存中通过java比拟器进行排序的

orderedcollection是在数据库中通过orderby进行排序的*springhibernatestruts的笔试面试题〔含答案〕Hibernate工作原理及为什么要用?

原理:

1.读取并解析配置文件

2.读取并解析映射信息,创立SessionFactory

3.翻开Sesssion

4.创立事务Transation

5.持久化操作

6.提交事务

7.关闭Session

8.关闭SesstionFactory为什么要用:

1.

对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。2.

Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作3.

hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。4.

hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。2.Hibernate是如何延迟加载?

1.

Hibernate2延迟加载实现:a)实体对象b)集合〔Collection〕2.Hibernate3提供了属性的延迟加载功能当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了效劳器的内存开销,从而提高了效劳器的性能。3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)类与类之间的关系主要表达在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、4.说下Hibernate的缓存机制1.内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存2.二级缓存:

a)应用及缓存

b)分布式缓存

条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据

c)第三方缓存的实现5.Hibernate的查询方式

Sql、Criteria,objectcomposition

Hql:

1、属性查询

2、参数查询、命名参数查询

3、关联查询

4、分页查询

5、统计函数6.如何优化Hibernate?

1.使用双向一对多关联,不使用单向一对多

2.灵活使用单向一对多关联

3.不用一对一,用多对一取代

4.配置对象缓存,不使用集合缓存

5.一对多集合使用Bag,多对多集合使用Set

6.继承类使用显式多态

7.表字段要少,表关联不要怕多,有二级缓存撑腰7.Struts工作机制?为什么要使用Struts?工作机制:

Struts的工作流程:

在web应用启动时就会加载初始化ActionServlet,ActionServlet从

struts-config.xml文件中读取配置信息,把它们存放到各种配置对象

当ActionServlet接收到一个客户请求时,将执行如下流程.

-(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;

-(2)如果ActionForm实例不存在,就创立一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;

-(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;

-(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象,就表示表单验证成功;

-(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就先创立这个实例,然后调用Action的execute()方法;

-(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给ActionForward对象指向的JSP组件;

-(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;为什么要用Struts:

JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规那么、一个把这些技术组织起来的规那么,这就是框架,Struts便应运而生。基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件8.Struts的validate框架是如何验证的?

在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。9.说下Struts的设计模式

MVC模式:web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创立,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate〔〕验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创立这个对象,然后调用Action的execute〔〕方法。Execute〔〕从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。10.spring工作机制及为什么要用?

1.springmvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。

2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.

3.DispatcherServlet请求提交到目标Controller

4.Controller进行业务逻辑处理后,会返回一个ModelAndView

5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象

6.视图对象负责渲染返回给客户端。为什么用Spring:

{AOP让开发人员可以创立非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用AOP后,公共效劳

〔比如日志、持久性、事务等〕就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。

IOC允许创立一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词倒置所说明的,IOC就像反过来的JNDI。没有使用一堆抽象工厂、效劳定位器、单元素〔singleton〕和直接构造〔straightconstruction〕,每一个对象都是用其协作对象构造的。因此是由容器管理协作对象〔collaborator〕。

Spring即使一个AOP框架,也是一IOC容器。Spring最好的地方是它有助于您替换对象。有了Spring,只要用JavaBean属性和配置文件参加依赖性〔协作对象〕。然后可以很容易地在需要时替换具有类似接口的协作对象。}*hibernate面试题小集1.Hibernate有哪几种查询数据的方式3种:hql、条件查询QBC(QueryByCriteria)、原生sql〔通过createSQLQuery建立〕2.谈谈Hibernate中inverse的作用inverse属性默认是false,就是说关系的两端都来维护关系。

比方Student和Teacher是多对多关系,用一个中间表TeacherStudent维护。Gp)i

如果Student这边inverse=〞true〞,那么关系由另一端Teacher维护,就是说当插入Student时,不会操作TeacherStudent表〔中间表〕。只有Teacher插入或删除时才会触发对中间表的操作。所以两边都inverse=〞true〞是不对的,会导致任何操作都不触发对中间表的影响;当两边都inverse=〞false〞或默认时,会导致在中间表中插入两次关系。3.说说Hibernate中的update()和saveOrUpdate()的区别,session的load()和get()的区别。saveOrUpdate()方法可以实现update()的功能,但会多些步骤,具体如下:

如果对象在该session中已经被持久化,不进行操作;对象的标识符属性(identifierproperty)在数据库中不存在或者是个暂时的值,调用save()方法保存它;如果session中的另一个对象有相同的标识符抛出一个异常;以上皆不符合那么调用update()更新之。

Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。session的get()和load()其区别在于:

如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException;load方法可返回实体的代理类实例,而get方法永远直接返回实体类;load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法那么仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。*hibernate中对象的三种状态瞬时态(Transient)、持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(PersistenceObject),瞬时对象和脱管对象也称为VO〔ValueObject〕。瞬时态由new命令开辟内存空间的java对象,eg.Personperson=newPerson(〞amigo〞,“女〞);如果没有变量对该对象进行引用,它将被java虚拟机回收。瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联,并将数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论