高级Java工程师面试题
1)Session与Cookie的区别是什么?
Session存储在服务器端;cookie存储在客户端
2) Filter和Listener的作用和区别是什么?
监听器(listener):
用于监听事件的发生,与swing中的监听器类似。可以监听客户端的请求、服务端的操作等。
通过监听器,可以自动激发一些操作如监听在线用户数量,当增加一个HttpSession时,
给在线人数加1。编写监听器需要实现相应的接口,编写完成后在web.xml文件中配置一下,
就可以起作用了,可以在不修改现有系统基础上,增加web应用程序生命周期事件的跟踪。
用于对服务器请求的过滤,它与监听器最大的不同是:监听器只能够监听请
求而无法改变原来的请求、而过滤器可以改变任何请求。所有的过滤器都实现了
filter接口中的doFilter方法来实现对请求的过滤,doFilter方法又使用了
FilterChain这个传入的值实现过滤链,来进行层层的过滤。过滤器也同样需要
对web.xml进行设置。Servlet过滤器的适用场合:
A.认证过滤
B.登录和审核过滤
C.图像转换过滤
D.数据压缩过滤
E.加密过滤
F.令牌过滤
G.资源访问触发事件过滤
3)forward 和redirect的区别:
使用forward的时候浏览器不知道它所请求的具体资源来源,所以地址栏不会变;
使用redirect,服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址
栏显示的是新的URL。forward,转发页面和转发到的页面可以共享request里面的数据.
redirect,不能共享数据.
4)说出解析XML和读取Excel常用的框架有哪些:
XML—>JDOM,dom4j
Excel—>POI
5)Spring中事务管理支持哪两种方式,并说明他们的优缺点?列举几个Spring事务管理
器,列举几种Spring事务管理的配置方法
1.Spring可以通过程序控制和声明两种方式管理事务。程序控制可以精确的控制事务回
滚的节点,但是程序与业务代码耦合在一起:声明方式低耦合,但是在对于复杂事务的
控制上不如程序控制的方式。
2.jdbc做事务管理器,hibernate事务控制管理器,JdoTransactionManager,
JtaTransactionManager,OJB事务管理器
3.有五种配置方法
第一种:每个bean都有一个代理
第二种:所有bean共享一个代理基类
第三种:使用拦截器
第四种:使用tx标签配置管理器
第五种:全注释
6)Struts2如何处理一表单多提交?
Struts2 Action类需要实现一个Struts2自带的拦截器,
org.apache.struts2.interceptor.ServletRequestAware,并且在action中实现多个提
交的方法名称,如果没有相应的方法名称,否则会抛出
java.lang.NoSuchMethodException异常。
例如:JSP页面
<s:form action="submit.action">
<s:textfield name="msg"label="输入内容"/>
<s:submit name="save" value="保存" align="left" method="save"/>
<s:submit name="print" value="打印" align="left" method="print"/>
</s:form>
在action类中必须包含如下方法:
public String save()throws Exception{
request.setAttribute("result","save["+msg+"]");
return "save";
}
public String print() throws Exception{
request.setAttribute("result","print["+msg+"]");
}
配置文件如下:
<action name="submit" class="action.MoreSubmitAction">
<result name="save">/result.jsp</result>
<result name="print">/result.jsp</result>
</action>
7)hibernate中缓存等级及其区别应用
1. 内部缓存存在Hibernate中,又叫一级缓存,属于应用事物级缓存
2. 二级缓存
a) 应用级缓存
b) 分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统
频繁使用、非 关键数据
c) 第三方缓存的实现
8)Spring生成的bean对象的生命周期有哪些种类,并分别列举这些类型在实
际项目中应用。
1、singleton
当一个bean的作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实
例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。
换言之,当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定
义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该
bean的后续请求和引用都将返回被缓存的对象实例,这里要注意的是singleton作用域和GOF
设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中只有一个class存在,
而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton
时候, spring的IOC容器中只会存在一个该bean。
2、prototype
prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的
方式调用容器的getBean()方法)都会产生一个新的bean实例,相当一个new的操作,对于
prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整
个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交
给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对
象的初始化生命周期回调方法,而对prototype而言任何配置好的析构生命周期回调方法
都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资
源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种
可行方式是,通过使用 bean的后置处理器,该处理器持有要被清除的bean的引用。)
3、request
request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP
request内有效。
4、session
session作用域表示该针对每一次HTTP请求都会产生一个新的bean同时该bean仅在当
前HTTP session内有效配置实例:
5、global session
global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web
应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个 portlet web
应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局
portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,
那么web会自动当成session类型来使用。
9)Struts2页面开发中常用标签使用说明,列举至少3个
1.往action里传值的使用方式:
<input name="userName" type="text" class="input6" size="15">
a. userName属性需要在访问的action中提供相应的属性,并有SET/GET方法。
b. 可以不在访问的action中提供相应的属性用request.getParameter(“userName”);显
示标签 ,property 用于输出指定值。
2.<s:property value=" userName "/> 当action返回到指定页面是,可以通过该标签显示action
中的属性信息。(注 userName必须在action中存在,并有GET方法)。
3.往对象中传值<s:textfield> 用于从页面往action中的对象内传值:
<s:text name="user. userName " id="username"/>
该标签可以在页面中向action中的实体对象内直接传值。(注:在action中要存在user对象,
并有SET/GET方法。)
4.判断<s:if> </s:if> 用于在页面中判断指定数据
<s:if test="userName == admin">…. </s:if>
<s:else>…. </s:else>
该标签用于对指定的数据进行判断,但指定的数据必须在action中存在。
5.迭代<s:iterator>用于将List、Map、ArrayList等集合进行循环遍历
<s:iterator value="userList" id="user" status="u">
<s:property value="userName"/></a>
</s:iterator>
该标签用于将userList集合中的元素进行循环,用property进行显示集合中的指定元素值。
6.URL地址标签<s:url>用于生成一个URL地址,可以通过URL标签指定的<s:param>子元
素向URL地址发送请求参数
<s:url action=" ">
<s:param name=" " value=""></s:param>
</s:url>
其中action为请求地址,param子元素为地址后面所带的参数。
7.超链接 <a href >一般和<s:url>标签一起使用,用于带多个参数。
<a href="
<s:url action=" ">
<s:param name=" " value=""></s:param>
<s:param name=" " value=""></s:param>
<s:param name=" " value=""></s:param>
</s:url>">
超链接</a>
8.set标签,用于将某个值放入指定的范围内。例如application,session等。
<s:set name="user" value="userName" scope=”request”/>
将user值放入request范围内
9)数据库部分
(1) 有如下关系模式实例,并根据问题写出完整SQL语句
S(SNO,SNAME, SCITY);
P(PNO,PNAME,COLOR,WEIGHT);
J(JNO,JNAME,CITY);
SPJ(SNO,PNO,JNO,QTY);
其中:
S为供应商表,SNO:供应商号,SNAME:供应商名称,SCITY:供应商所
在城市。
P为零件表,PNO:零件号,PNAME:零件名称,COLOR:零件颜色,WEIGHT:
零件重量。
J为工程项目表,JNO:工程项目号,JNAME:项目名,CITY:项目所在城
市
SPJ为供应情况,SNO:为供应商号,PNO:零件号,JNO:工程项目号,
QTY:供应数量
问:
1.写出没有使用天津供应商生产的红色零件的工程号JNO?
2.写出至少使用了S1(SNO)供应商所提供的全部零件的工程号JNO?
3.统计每种零件的供应总量?
4.建立视图VSJ它记录了给“北京城建”工程项目的供应零件的情况,
包括供应商号、零件号和零件数量
1. 有如下关系模式实例,并根据问题写出完整SQL语句:
supplier (SNO,SNAME, SCITY);
product (PNO,PNAME,COLOR,WEIGHT);
project(JNO,JNAME,CITY);
orders (SNO,PNO,JNO,QTY);
其中:
supplier为供应商表,SNO:供应商号,SNAME:供应商名称,SCITY:供应商所在城市。
product为零件表,PNO:零件号,PNAME:零件名称,COLOR:零件颜色,WEIGHT:零件重量。
project为工程项目表,JNO:工程项目号,JNAME:项目名,CITY:项目所在城市
orders为供应情况表,SNO:为供应商号,PNO:零件号,JNO:工程项目号,QTY:供应数量 。
问:
1) 写出没有使用天津供应商生产的红色零件的工程号JNO?
2) 统计每种零件的供应总量?
3) 建立视图VSJ,它记录了给“北京城建”工程项目的供应零件的情况,包括供应商号、零
件号和零件数量
答题要点:SQL伪代码:
1.
select distinct jno from orders ord where ord.sno not in (select p.sno
from supplier p where p.scity='天津') or ord.pno not in (select pt.pno
from product pt where pt.color='红色')
)
2.select PNO,SUM(QTY) from SPJ where PNO IS NOT NULL GROUP BY PNO
3.create view VSJ as select SNO,PNO,QTY from SPJ,J where SPJ.JNO = J.JNO AND J.JNAME = ‘北京城建
1. select sname from s where s.sno not in (select sc.sno from sc,c where
sc.cno=c.cno and c.cname='王老师')
2. select s.sname, b.avgnum
from s,
(select sc.sno,
avg(sc.scgrade) avgnum,
sum(case
when sc.scgrade < 60 then
1
else
0
end) ux
from sc
group by sc.sno) b
where s.sno = b.sno and b.ux > 2
3.select sname
from s
where '数学' in (select c.cteacher
from sc, c
where sc.sno = s.sno
and sc.cno = c.cno)
and '化学' in (select c.cteacher
from sc, c
where sc.sno = s.sno
and sc.cno = c.cno)
10) 写出常用的优化网站性能和优化数据库常用的方法
优化网站性能:
1. 使用weblint或者其他HTML 检查工具来检查HTML内容是不是符合HTML 4.0规范
符合HTML 4.0规范的页面会加载的更快。
2. 最小化Javascript和Style Sheets的使用Javascript是不标准HTML内容的最大
来源虽然实现了很多非常炫的效果但是却放缓了页面加载的时间Style Sheets是需要
在页面显示之前单独下载的所以也会放缓页面的加载速度。
3. 关闭DNS的反向解析DNS反向解析会记录客户端的计算机名而不仅仅是IP地址 这
样就增加消耗。
4. 使用统计工具来检查你的web系统的性能瓶颈是出在DNS,网络连接内容大小或者是
服务器端这样就可以从瓶颈处着手提高性能。
5. 使用简单的servlet或者CGI, 在系统不需要的话使用分布式程序反而会减低性能。
6. 加内存 跟我们使用的电脑一样加内存往往是成本最低效果最好的提高性能的方法。
要知道内存速度比硬盘速度要搞一个数量级的。
7. 合理的给你的数据库加索引当根据关键字进行全表查询时加索引会有效的提高查询
性能。
8. 最小化数据库查询如果能把数据缓存到中间层或者servlet的话just do it, 数据库
连接往往是系统的性能瓶颈。
9. 使用网络工具检查网络丢包和重发 断断续续的系统性能问题一般是因为网络丢包或者
干扰。因为丢包和重新发送数据之间有一个时间间隔这样就会使系统变得缓慢。
10. 使用工具来实时监视网站的性能。
11)
多态:包括重载和重写。重载为编译时多态,重写是运行时多态。重载必须是同类中名称相同参数不同(包括个数不同和类型不同),但返回类型不同不构成重载;重写发生于子类对父类的覆盖,子类继承父类方法名相同、参数列表相同、返回类型相同才构成重写。
12)说出数据连接池的工作机制是什么?
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端
程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空
闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池
连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

浙公网安备 33010602011771号