java面试宝典大全

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Struts2.0
1、struts2框架如何处理用户请求
容器启动,加载web.xml,初始化FilterDispatcher,加载default.properties文件,根据struts.configration.files加载struts的三种配置文件。

客户端将请求提交到web容器,被filterDispatcher过滤到,将请求转发给ActionProxy,获取表示请求的字符串,提交给ActionInvocation;根据解析的字符串找到对应的action映射节点,实例化class属性指定的业务逻辑Action;在执行execute之前,查看action周围是否有拦截器引用,如果有,按照引用的顺序逐个执行;执行execute方法进行业务逻辑处理;处理完毕之后,根据方法的返回值,在action节点下查找对应的result节点,返回匹配的视图给客户端。

2、struts2的Action如何实现和servletAPI的交互、
业务逻辑Action实现特定的接口:ServletRequestAware ServletResponseAware ServletContextAware 。

分别实现特定的setter方法,将容器中的requset,response,servletContext对象注入
ActionContext:该方式只能获取servletAPI对象对应的范围;在该对象中,提供了若干个map对象,每个map表示一种范围,通过向map中添加数据、从map中读取数据实现向map对应范围中添加数据、
读取数据的效果;这是为了实现和servletAPI对象解耦提供的一种方式
ServletActionContext : 弥补ActionContext的不足- 无法获取ServletAPI对象本身。

GetRequest() getResponse() getServletContext()
3、如何实现对default.properties文件中常量的修改
1) 通过FilterDispatcher初始化参数进行修改
<init-param>
<param-name></>
<param-value></>
</init-param>
2) 静态常量库文件 -
内建(default.properties) 、
自定义(struts.properties) 修改内建配置参数
3) struts.xml
<constant name="" value=""/>
4、Struts1和struts2框架的区别
A 底层实现机制不同:struts1采用jsp、servlet实现;struts2采用interceptor实现;
B 业务逻辑Action方面的区别
1) Action实现类的不同:struts1的业务逻辑Action需要继承struts1提供的Action基类,并且覆盖execute方法进行处理;struts2的业务逻辑Action不需要继承任何类或者实现任何接口,只需要一个返回String的execute方法即可;为了编写的规范性,统一让其继承了ActionSupport
2)线程模式方面的对比:struts1框架由于是在servlet基础上发展起来的一个框架,因此他的业务逻辑Action和servlet一直,单例状态并且必须是线程安全的,客户端多个线程提交的请求,struts1只提供一个Action实例进行处理; struts2为每一个请求分配了一个单独的业务逻辑Action进行处理,所有不存在线程安全问题。

3)servletAPI的耦合性:struts1业务逻辑Action执行,需要用到web容器提供的request、response对象提供支持,因此他的执行需要在web容器中,web容器的耦合性高;而struts2的Action提供的execute方法不需要任何参数,web容器不存在依赖性。

4)可测试性,测试的难易程度:struts1的Action由于需要在web 容器才能运行,因此对他的测试同样需要在web容器中才能实现;如果想要脱离web容器进行测试,需要一个第三方的测试工具:struts testCase; strtus2的Action不需要web容器,可以脱离web容器单独进行测试。

5)封装表单项:struts1提供了一个ActionForm对表单项进行封装;struts2直接使用业务逻辑Action封装表单项,减少了开发ActionForm类的繁琐。

5、struts2 方法校验的原理
校验原理:通过向当前action中添加错误信息的方式表示校验失败。

validate方法执行完毕之后,执行execute方法之前,判断当前action中是否添加有错误信息;如果添加-失败;否则成功添加错误信息的方式:
addFieldError(field,msg) 字段级错误信息
addActionError(msg) 表单级错误信息
校验失败,跳过execute执行,直接返回一个'input'字符串给ActionInvocation;调度者根据返回结果找到对应的result节点,返回节点对应的视图 - 显示错误信息。

6、struts2如何实现防止表单重复提交
token令牌机制,将其封装成一个Token拦截器。

在需要提交的表单中,通过s:token标签,为表单以及session添加一个相同的令牌值;
提交请求之后,为处理请求的Action引用一个名为token的拦截器该拦截器负责判断表单及session中的令牌值是否一致,
如果一致,执行action的execute进行业务逻辑处理;拦截器负责将令牌删除
如果不一致,直接从拦截器中返回一个错误字符串
7、struts2迭代器标签的使用方式(对list<Student>进行遍历
{student id name age}) C
<s:iterator name=”#request.list” id=”stu”>
<s:property value=”id”/> <s:property value=”name”/> <s:property value=”age”/>
</s:iterator>
8、简单介绍下struts2的属性驱动和模型驱动;以及封装表单项
时setter、getter方法的作用
属性驱动:在Action中定义属性和表单项匹配的setter方法,实现对表单项的封装
Setter方法:封装时,表单项调用匹配的setter方法进行赋值
Getter方法:如果在转发之后的页面中需要获取封装的表单项值,需要为其提供getter方法,负责将值保存在request和值栈范围中
模型驱动:定义单独的model对象(javaBean),在model中定义和表单项匹配的属性以及setter方法,通过model对表单项进行封装;将封装有表单项的model注入给Action
Setter方法:负责创建一个新的model对象
Getter方法:负责判断model对象是否为空
如何获取web容器范围,并且使用ognl表达式访问web容器范围内的数据( request,session,application,ValueStack 请求参数 ) ActionContext ac = ActionContext.getContext();
Map request = (Map)ac.get(“request”);
Map session =(Map)ac.get(“session”); // ac.getSession();
Map application = (Map)ac.get(“application”); //ac.getApplication();
ValueStack vs = ac.getValueStack();
<s:property value=”#request.value”/>
9、简述struts2中的拦截器
拦截器是struts2框架特有的技术,是使用AOP编程思想实现的一种技术。

可以把struts2框架认为是一个空的容器,其中包含若干个拦截器,每一个拦截器提供框架中的一个功能。

作用:拦截器用于对struts2中的业务逻辑Action进行拦截,在Action的execute方法执行之前或之后添加辅助功能,帮助action 处理用户请求。

Struts2的Interceptor一层一层,把Action包裹在最里面,整个结构就如同一个堆栈,Action位于堆栈的底部。

由于堆栈"先进后出"的特性,如果我们试图把Action拿出来执行,我们必须首先把位
于Action上端的Interceptor拿出来执行。

这样,整个执行就形成了一个递归调用。

Struts2的拦截器结构的设计,实际上是一个典型的责任链模式的应用。

首先将整个执行划分成若干相同类型的元素,每个元素具备不同的逻辑责任,并将他们纳入到一个链式的数据结构中,而每个元素又有责任负责链式结构中下一个元素的执行调用。

效果:这样的设计,从代码重构的角度来看,实际上是将一个复杂的系统,分而治之,从而使得每个部分的逻辑能够高度重用并具备高度可扩展性。

10、Struts2如何实现文件下载
文件下载请求和普通请求的区别在于:普通请求返回给客户端的是一个字符数据,比如视图;而文件下载请求返回给客户端的是一个字节数据,客户端想要的文件内容。

Struts2提供了一个名为stream的返回结果类型;在处理文件下载请求时,设置响应结果类型为stream,同时配置stream-result 中的名为inputName参数,返回需要下载文件的流信息(InputStream)
可选参数: Content-Disposition 用于设置下载文件的打开方式以及在客户端中打开文件的文件名
11、Struts2如何实现和ajax的整合
Struts2和ajax整合方式,如何实现struts2-Action在不造成和
web容器的耦合性前提下将响应数据返回给客户端的js
提供了json插件 (struts2-json-plugin.jar)
该json插件提供了一个struts-plugin.xml的配置文件,该文件中定义了一个json-default的包;该包中有个名为json的resulttype。

Json返回结果类型负责创建一个JSONObject对象,将当前action 中所有包含getter方法的属性封装在json对象中,返回给客户端的js
因此,如果想将某个数据返回给客户端的js,那么就为该数据提供一个getter方法。

13、struts2框架中的三种配置文件分别是
Struts2框架中有个名为default.properties的文件,用于定义struts2框架使用过程中的一些常量参数。

当容器启动时,负责加载该文件,同时将文件中的数据加载到容器中供以后使用。

struts.configuration.files = struts-default.xml,struts-plugin.xml,struts.xml
struts-default.xml struts2核心配置文件,用于配置返回结果类型和拦截器,该配置文件中定义了一个struts-default包,提供给所有自定义的包继承,进而使用该包中提供的拦截器对请求进行处理。

struts-plugin.xml 插件配置文件,单独的struts2框架中不需
要加载该配置文件,当struts2需要和其他框架或者技术实现整合时,需要该类型的配置文件提供插件支持。

struts.xml 自定义配置文件,用于映射请求与处理。

为struts2接受到的请求分配业务逻辑Action进行处理。

14、Struts2默认处理的请求类型是哪种类型?如何修改
default.properties
struts.action.extension=action
修改方式:
1)使用FilterDispatcher初始化参数进行修改
<init-param>
<param-name>struts.action.extension</param>
<param-value>etoak</param-value>
</init-param>
2)自定义静态常量库文件 struts.properties
3)在struts.xml中使用constant节点修改
<constant name=”struts.action.extension”
value=”etoak”/>
AJAX
1、ajax的全称是什么?其中包含有哪些技术?以及ajax请求相
对于普通请求的特点是什么
asynchronous javaScript and xml 异步的javaScript和xml 包含的技术:
javaScript : ajax是通过js触发事件的方式发送请求,以及在js中接受服务器的响应数据
xml :客户端和服务器之间进行数据传输的方式。

对于服务器端的响应数据,如果客户端无法识别或者解析,比如(集合、自定义对象),需要将其转换成客户端能够识别的数据类型进行传输。

Json:新添加到ajax技术中,用于代替xml进行数据传输的技术。

DOM :js中的document对象,用于对使用xml类型返回的数据进行解析
getElementsByTagName(“tag”)
DHTML : 动态的html,对html页面实现动态更新和普通请求的区别:客户端提交普通请求之后,服务器在接受到请求时,客户端的浏览器会处于锁定状态,或者一片空白;客户端的用户必须等待服务器响应完毕,并且将响应数据动态更新到页面之后才能对页面继续进行操作。

也就是一种同步请求–客户端和服务器在同一时间点上有且只有一方在运行。

而ajax类型的请求由于是一种基于事件型的请求,因此当客户端触发事件发送请求之后,客户端的浏览器并不会被锁定,客户端的用于依然可以对浏览器进行操作,而在操作的过程中,js会将请求不知不觉的发送给服务器进行处理。

而这个处理过程,对于客户端的用户不会产生任何延迟影响。

也就是一种异步请求–客户端和服务器在同一个时间点上可以两方同时运行,服务器的处理过程不会影响客户端的用户体验。

同时,ajax请求相对于普通请求来说,不管是请求发送,还是响应数据的接受,都是只传输可用数据,而非整个html页面;同时服务器的响应数据的解析过程放在了客户端的js中,可以有效的减小服务器的负担,同时提高响应的速度。

2、如何使用XMLHttpRequest发送请求以及接收响应 A
A 创建XMLHttpRequest对象
B 使用XMLHttpRequest发送请求的过程:
触发事件–
获取请求表单项 document.getElementById(“”).value –
打开连接 open(“post/get” , url )
设置请求的编码方式setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”)
定义回调函数接受服务器的响应数据: onreadystatechange =
etoak
发送请求 send( null / key=value&key=value)
C 使用XMLHttpRequest接受服务器的响应数据
判断响应数据的完整性 readyState==4 status==200
对数据进行接受
ResponseText 返回字符串类型数据
responseXML 返回document文档对象
3、Get/post方式提交ajax请求时,请求参数如何发送
Get - 请求参数在url地址上设置
xmlHttp.open(“get”,”url?key=value&key=value”)
xmlHttp.send(null)
Post - 请求参数通过send方法进行发送
send(key=value&key=value)
4、Get请求在何种情况下会去读浏览器的缓存,如何防止
如果get方式前后两次请求url地址一致,那么第二次请求不会在服务器中取数据;而是去浏览器的缓存中读取上次请求返回的数据防止:为get请求添加一个可变参; url地址上追加 date=new Date() new Random()
5、服务器如何将响应数据返回给客户端的ajax
设置服务器端的响应数据类型
response.setContentType(“text/html text/plain text/xml”)
通过PrintWriter将数据写回给客户端
PrintWriter out = response.getWriter();
out.print(data)
out.flush();
out.close();
6、如何判断服务器响应数据的完整性
判断ajax请求的状态是否等于4 xmlHttp.readyState==4
判断http状态码是否为200 xmlHttp.status==200
7、Ajax请求有几个状态(readyState取值),分别表示什么
Ajax的readyState提供了0-4 五种状态
0 – xmlHttpRequest实例化之后,会自动为readyState参数赋初值0,表示xmlHttpRequest可用,可以发送请求
1 –当使用xmlHttp的open()方法打开连接之后,readyState 自动设置为1
2 –当使用xmlHttp的send()方法发送请求之后,readyState 自动设置为2
3 –当服务器接受到客户端提交的ajax请求之后,readyState
自动设置为3
4 –当服务器对请求处理完毕,并且返回完整数据之后,readyState自动设置为4
8、ajax请求中,客户端和服务器之间进行数据传输的几种方式?
服务器端如何设置,客户端中如何获取、解析
客户端的js能够识别的数据–基本数据类型、字符串类型 - 直接作为普通文本进行返回- response.setContentType(“text/plain”) - responseText - 字符串
客户端的js无法识别的数据–自定义类型、集合 - 将其封装
成客户端能识别的数据类型 -
Xml - response.setContentType(“text/xml”) - responseXML - document文档
JSON –response.setContentType(“text/plain”) - responseText – json格式的字符串
JSON.parse(字符串) 解析服务器返回的json格式字符串
返回js对象。

9、jquery如何发送ajax请求?需要配置的参数列表及其作用
jquery提供了一个ajax()用于封装ajax的开发流程;通过对该
方法进行调用,实现向服务器发送ajax请求的效果
$.ajax({
url:”” ,
data:””,
type:””,
dataType:””,
success:function(data){},
error:function(xmlHttp){ alert(xmlhttp.status); } });
url ajax请求的url路径
data发送到服务器的数据列表,两种方式,String和Object形式String形式: key=value&key=value
Object形式 : {key:value,key:value}
type发送请求的方式 post / get
dataType预定义服务器的响应数据类型,常用的几种类型 json text xml html
success当请求成功之后,进入该参数对应的回调函数对响应数据进行接收
参数data即为服务器的响应数据
error如果请求失败,进入该参数对应的回调函数
spring
1、简述spring的分层思想,以及每个层提供的功能
Spring框架是一个分层架构,由 7 个定义良好的模块组成。

Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式
组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。

整个spring框架搭建在Core核心模块之上,他是整个框架的基础。

在该模块下,spring提供了一个IOC容器,用来帮助我们以依赖注入的方式管理对象之间的依赖关系。

核心容器的主要组件是BeanFactory,它是工厂模式的实现,IOC容器的基本类型之一。

Spring上下文模块是一个配置文件,向Spring框架提供上下文信息。

AOP模块: 该模块提供面向切面编程。

在面向对象编程之外又提供了一种编程方式,来弥补传统OOP编程的缺陷。

AOP框架采用Proxy设计模式
数据访问模块-DAO模块和ORM模块。

在数据访问层,提供了对JDBC 的集成支持,封装了JDBC的操作流程;除此之外,对当前流行的ORM 产品,如hibernate、ibatis、JPA等提供了形式统一的技术支持。

web模块,在该模块中,提供了spring框架如何添加到web容器中使用,并且spring中容纳了大量的视图技术,包括JSP、Velocity、Tiles、iText 和 POI。

同时spring的web模块并不排斥其他web框架,如struts、JSF、webwork等,spring的web模块都为他们提供了集成支持。

spring提供了自己的一套MVC框架,使得spring可以单独涉足表现层实现开发需求,用于取代其他表现层框架,如struts
2、什么是IOC
Invocation of Controller 控制反转
J2EE中用来创建对象,形成对象依赖关系的方式。

创建对象: IOC作为一种特殊的工厂模式,将需要管理、实例化的对象配置在ioc容器中,通过ioc容器负责创建这些对象;代替传统开发中需要在目标对象中以new的方式创建依赖对象的方式。

这种实现策略,可以在降低代码之间的耦合关系的前提下,实现对象之间的依赖关系。

形成依赖:ioc也可以称为依赖注入,是描述ioc容器创建出的对象之间形成依赖关系的的一种方式。

注入可以分为主动注入以及被动注入两种方式。

主动注入描述了目标对象需要的依赖关系需要由目标对象主动查找或者创建,这也是传统开发的模式。

而ioc以一种被动注入的方式打破了这种模式:通过ioc容器这个第三方组件将目标对象需要的依赖对象以被动的方式注入给目标对象(代替目标对象主动查找依赖)。

Ioc为了实现依赖注入提供了三种注入方式:setter 注入、构造器注入以及接口注入。

总结 : 不创建对象,但是需要在容器中描述创建它们的方式。

在代码中不直接与对象或服务连接,但在容器中描述哪一个组件需要哪一项服务。

容器负责将这些联系在一起。

3、什么是AOP
面向切面编程思想,作为OOP的延续思想添加到J2EE开发中,用于弥补OOP开发中的不足而提出的新编程思想。

AOP编程思想将系统分为两大模块:核心业务逻辑模块(Action Dao)和非核心的通用服务(登陆检查、校验、权限、日志、事务、异常、安全、性能等)
AOP的关注点:系统的非核心通用服务
思想:将非核心通用服务封装成一个AOP组件
执行特点:AOP组件不需要像普通对象那样调用;只需要在配置文件中引用的方式执行
效率 :AOP执行效率比OOP效率低;AOP解决OOP无法解决的耦合性问题
4、介绍下Spring-AOP中的几种通知
before通知 MethodBeforeAdvice
after通知 AfterReturningAdvice
around通知 MethodInterceptor
throws通知 ThrowsAdvice
5、Spring提供的两种IOC类型,及其区别
Ioc是用于用于解析配置文件、实例化Bean对象的工厂模式
a、BeanFactory - XmlBeanFactory
b、ApplicationContext 接口 (工厂模式)
extends BeanFactory
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
WebApplicationContext
两种的工厂的区别:实例化bean对象的时机不同:
ApplicationContext 解析配置文件时,将容器内所有的bean对象全部初始化
BeanFactory 在getBean时,只实例化指定的某个bean对象
6、Spring提供依赖注入的三种方式,如何实现(配置文件设置方
式)
a setter注入
在目标对象中定义依赖关系对象对应的属性和setter方法;通过调用setter方法,将ioc容器创建的依赖对象注入
<property name=”” ref=””/>
b 构造器注入
在目标对象中定义构造方法,在构造方法中定义需要注入的依赖关系对象对应的参数;通过调用构造方法,为构造方法中的参数进行赋值(ioc容器实例化的依赖对象)
<constructor-arg index=”” ref=””/>
c 接口注入
为依赖关系对象提供接口,将接口注入给目标对象;实现将接口的实现类注入的效果。

d 方法注入
在目标对象中定义方法,该方法的返回值即为需要注入的依赖关系对象;通过调用该方法,将ioc实例化的依赖对象注入。

原理: cglib代理方式
<lookup-method name=”” bean=””/>
7、如何配置工厂bean【三种工厂bean】
工厂bean : 调用工厂bean返回的对象类型不再是class属性指定的类型;class属性指定的类型为工厂类;需要的是工厂负责创建的对象.
工厂bean的必要性:当ioc容器无法或者不能直接实例化某个bean对象时,通过一个第三方的工厂负责创建该对象.把工厂配置在ioc容器中. 比如SessionFactory
Spring中提供了三种类型的工厂bean:
静态工厂(工厂模式)
<bean id=”factory”class=”xxx.XxFactory”factory-method=”method”/>
被factory-method指定的方法必须是静态方法,调用该工厂bean时,该工厂会自动调用该静态方法,返回方法负责返回的对象
动态工厂
<bean id=”factory”factory-bean=”beanid”factory-method=”method”/>
Factory-bean属性指定ioc容器中的某个普通bean,factory-method指定该bean中的一个普通方法;调用该工厂bean,返回beanid指定对象调用method返回的对象
实现FactoryBean接口的类
实现FactoryBean,需要实现三个方法,getObject() getObjectType() isSingleton()
调用该工厂bean,返回给工厂bean的getObject()方法返回的对象。

8、如何在ioc容器中配置JdbcTemplate对象
<bean id="ds" class="xx.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/test"></property> <property name="username" value="root"></property>
<property name="password" value="root"></property> </bean>
<bean id="jt" class="xx.JdbcTemplate">
<property name="dataSource" ref="ds"></property> </bean>
9、如何在ioc容器中配置HibernateTemplate对象
<bean id="sf" class="xx.LocalSessionFactoryBean"> <property name="dataSource">
<bean class="xxe.DriverManagerDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver"></property>
<property name="url"
value="jdbc:mysql://localhost:3306/test"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
</property>
<property name="mappingResources">
<list>
<value>com/etoak/bean/Student.hbm.xml</value> </list>
</property>
<property name="hibernateProperties">
<props>
<prop
key="dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop> </props>
</property>
</bean>
<bean id="ht" class="xx.HibernateTemplate">
<property name="sessionFactory" ref="sf"></property> </bean>
10、Hibernate中get、load方法查询数据的区别
Get立即加载查询数据库的顺序:一级缓存–二级缓存–数据库
如果数据库中没有,返回一个null
Load 延迟加载查询数据的过程分两个阶段:查询阶段和使用阶段
查询阶段:在一级缓存中查询,如果没有,返回要查询对象的一个代理(并非查询的对象)
使用阶段:使用查询阶段返回的代理在二级缓存中查,如果没有,在数据库中查,如果依然没有,抛出异常
在使用load时,必须保证load的两个阶段在同一个会话期内
11、Ioc容器中如何配置数据库驱动
<bean id="ds" class="xx.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/test"></property> <property name="username" value="root"></property>
<property name="password" value="root"></property> </bean>
12、如何将spring框架添加到web容器中
<listener>
<listener-class>xx.ContextLoaderListener</listener-class >
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-valu e>
</context-param>
13、Spring中如何定义hibernate mapping
<bean id="sf" class="xx.LocalSessionFactoryBean"> <property name="mappingResources">
<list>
<value>com/etoak/bean/Student.hbm.xml</value> </list>
</property>
</bean>。

相关文档
最新文档