面试问题列表
1、JS的4种基本数据类型
一下四种:Undefined, Boolean,Number和String
网上答案(js中有5种数据类型:Undefined、Null、Boolean、Number和String)。
2、JS中,请说出==和===的区别
”==”是判断值是否相等,”===”是判断值及类型是否完全相等
3、JS里面有没有重载?
同名的函数最后声明会覆盖前面以声明。Javascript中没有函数重载,当同一个名称的函数定义多次时,最终使用的是最后一个的定义。
4、JS定义变量是不是一定要有关键字var,假如没有var定义变量会怎样?
js中 允许在定义变量的时候 不加var 修饰符。
js会在当前作用域下寻找上下文是否定义了此变量, 如果没有找到则会为这个变量分配内存。
当且将其视为window的成员。 也就是全局变量。
如果加了var 修饰符。 js会重新为这个变量分配内存,不论当前上下文中是否已经定义过了。
这个变量的作用域就为当前上下文。 即局部变量。
不加var的写法是强烈不推荐的。
1. 语义不清楚。
2. 团队开发时,容易覆盖掉其它作用域内的变量,引发异常。
3. 给window对象添加不必要成员。
5、JS中的prototype是什么?
“prototype”字面翻译是“原型”。粗略来说就是:prototype是javascript中的函数(function)的一个保留属性,并且它的值是一个对象(我们可以称这个对象为"prototype对象")。
Prototype注意的细节:
1.prototype是函数(function)的一个必备属性(书面一点的说法是"保留属性")(只要是function,就一定有一个prototype属性)
2.prototype的值是一个对象
3.可以任意修改函数的prototype属性的值。
4.一个对象会自动拥有这个对象的构造函数的prototype的成员属性和方法。
6、说出JS中获取节点元素的3个方法
document.getElementById("html元素的id")
document.getElementsByTagName("标签名")
document.getElementsByName("html元素的name")
7、说出在Java单元测试中@Before和@BeforeClass的区别
@Before:初始化方法 对于每一个测试方法都要执行一次(注意与BeforeClass区别,后者是对于所有方法执行一次)
@BeforeClass:针对所有测试,只执行一次,且必须为static void
8、在XML通过什么方式可以让原始的字符串不改变输出
在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。
遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。
9、请说出什么是XML的SAX解析
SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器:
解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。
解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,
会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
10、请说出什么事XML的DOM解析
DOM(全称叫Document Object Model)基于树或基于对象的XML处理模式。
XML 文档具有一个称为节点的信息单元层次结构;
11、请说出XML中SAX解析和DOM解析各自的优缺点。
基于SAX(事件的处理)的优点和缺点
优点:这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,
因此不需 要将数据存储在内存中。
这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。
缺点:由于应用程序没有以任何方式存储数据,使用 SAX 来更改数据或在数据流中往后移是不可能的。
基于DOM(树)的处理的优点和缺点
优点:
1)由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。
2)它可以在任何时候在树中上下导航,而不是像 SAX 那样是一次性的处理。
3)DOM 使用起来也要简单得多。
缺点:
1)在内存中构造这样的树涉及大量的开销。大型文件完全占用系统内存容量的情况并不鲜见。
2)创建一棵DOM树可能是一个缓慢的过程。
12、请说出HTTP1.0和HTTP1.1的区别
1,HTTP/1.0协议使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象,;
2,HTTP/1.1默认使用持久连接(然而,HTTP/1.1协议的客户机和服务器可以配置成使用非持久连接)。
在持久连接下,不必为每个Web对象的传送建立一个新的连接,一个连接中可以传输多个对象!
13、请说出在html中表单的提交方式get和post的区别
常用的有:POST、GET
不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上,客户端通过这两种方式都可以带一些数据给服务器:
1)如请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:
GET /mail/1.html?name=abc&password=xyz HTTP/1.1
GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量不能超过1K。另一方面,一些用户密码等保密数据不适合以GET方式提交。
2)如请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,例如:
POST /servlet/ParamsServlet HTTP/1.1
Host:
Content-Type: application/x-www-form-urlencoded
Content-Length: 28
name=abc&password=xyz
Post方式的特点:传送的数据量无限制。
14、表单提交方式是不是只有get和post这两种方式
请求方式有:
POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
15、描述Servlet的执行过程
1.将应用部署到应用服务器(每个应用程序必须提供web.xml web描述文件)(用来描述该应用程序所有组件(servlet)的信息,提供给应服务器进行参考)。
2.当客户端(浏览器)发送请求到服务器,服务器分析请求信息在到应用程序(在应用服务器中已经部署)的web.xml文件中找对应的处理组件
(servlet)。
3.应用服务器调用对应Servlet的init()方法初始化Servlet(程序自己实现了Servlet接口的子类),产生对应的Servlet对象。
4.应用服务器调用对应Servlet的services()方法处理请求数据 。如果请求是基于Http协议
a)如果是get请求services()方法调用对应的doGet()方法
b)如果是post请求services()方法调用对应的doPost方法
5.当应用服务器处理完请求数据后(调用完services()方法)接着调用destroy()方法,释放Serlvet对象占用的内存空间。整个Servlet生命周期结束
16、请说出Servlet的生命周期
Servlet是受容器管理的,其生命周期都是由容器负责,包括如下几个阶段:
1)Servlet的类加载与实例化(调用构造方法)
2)Servlet实例的初始化(调用init方法)
3)Servlet提供服务(调用service方法)
4)Servlet的销毁(调用destroy方法)
17、Servlet是单例还是多例的
Servlet在web容器里是单实例多线程的。当多个客户端并发访问同一个Servlet时,
web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,
因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。
(servlet单实例多线程处理原理:
servlet中的init方法只有在启动(例如web容器启动,要看loadOnStartup的设置)的时候调用,也就是只初始化一次,这就是单实例。
servlet在处理请求的时候 调用的是service方法,这个方法可以处理多个客户端的请求。
具体访问时:
JSP 在web容器中"翻译成servlet"由容器执行,web 容器本身就是提供的多线程,A,B,C 3个访问,建立3个独立的线程组,然后运行一个servlet。依次执行。
这就解决了多用户同一实例实行的困惑。
要注意几点:
1:servlet首先不是现成线程的。
2:Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的)
18、Servlet什么时候实例化
默认情况下,第一次访问时加载Servlet类并进行实例化。
在部署时通过ClassLoader直接载入并实例化
19、怎么配置文件,让Servlet在启动tomcat的时候就实例化
<load-on-startup>1</load-on-startup>
load-on-startup: 表示Servlet在部署时通过ClassLoader直接载入并初始化,
数值越低(从0开始计数),载入的优先级越高。否则,用户第一次访问的时候才实例化Servlet。
值相同,一般按在web.xml文件中的出现的顺序执行。
20、请问Servlet的destory方法在什么时候才会执行
destory方法在We服务器停止或Web应用被停止/重新加载时被调用。通常完成一些资源释放,停止后台程序等工作。释放或销毁一些非内存资源。destory只会调用一次。
21、请描述ServletConfig对象
在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,
并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
主要用来读取web.xml中配置的Servlet初始信息,不能被其它Servlet共享。还可以用于访问ServletContext。
该对象的作用:
获得字符集编码
获得数据库连接信息
获得配置文件
22、请描述ServletContext对象
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletContext对象被包含在ServletConfig对象中,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得对ServletContext对象的引用。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
ServletContext应用场景:
1)多个Servlet通过ServletContext对象实现数据共享。
2)获取WEB应用的初始化参数。
3)实现Servlet的转发。
4)利用ServletContext对象读取资源文件。
得到文件路径
读取资源文件
23、请说出request对象获取前台传过来参数的几种方式
getParameter方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法
24、使用Servlet下载时,为什么文件名需要单独编码后才不会出现乱码,是不是编码后一定不会出现乱码。
当文件名出现中文的时候会出现乱码问题,需要把文件名编码转为UTF-8,应为服务器默认是iso-8859-1编码,
而系统默认是jbk编码,所以需要单独转码。
编码后还会出现乱码,需要设置响应头编码,告诉浏览器端用什么编码来解析服务器发送的数据。
25、请说出cookie和session的区别
区别:
1)Cookie保存在客户端
2)只能保存字符串对象,不能保存对象类型
Cookie是把用户的数据写给用户的浏览器。
Session技术把用户的数据写到用户独占的session中。
都是有服务器创建
26、除了使用Java代码,还有没有其他方式清除cookie
//清除cookie,用javascript也可实现。
27、请说出session的默认有效时间和有哪几种方式可以设置session的有效时间
默认有效时间为30分钟
设置Session的有效期
方式一:
public void setMaxInactiveInterval(int interval)
置最大非活动时间间隔,单位秒;
果参数interval是负值,表示永不过时
方式二:
通过配置web.xml来设置会话超时,单位是分钟
28、请说Servlet和JSP的区别和共同点
区别:servletd的应用逻辑是在java文件中,并且完全从html里分离开来。servlet主要用于控制逻辑。
jsp是的是java和HTML可以组合成一个扩展名为jsp的文件。jsp主要用于视图。
相同点:本质上都是java类。
29、请说出JSP的执行原理
1)首先,客户端发出请求(request ),请求访问JSP网页
2)接着,JSP Container将要访问的.JSP文件 转译成Servlet的源代码(.java文件)
3)然后,将产生的Servlet的源代码(.java文件)经过编译,生成.class文件,并加载到内存执行
4)最后把结果响应(response )给客户端
30、请说出JSP的3个指令,和各自的作用
1.Page指令 作用:page指令用于定义JSP页面的各种属性
2.Include指令 作用:include指令用于引入其它JSP页面,
如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
3.taglib指令 作用:让用户能够自定义标签
31、请说出JSP的9个内置对象,和四个域对象,并说出9个内置对象中那几个比较常用
9个内置对象,不用我们手工去创建的对象,由容器根据页面设置而产生直接可以使用
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletcContext
config ServletConfig
exception (特殊情况下使用)
page this(本JSP页面)
out JspWriter(带缓冲的PrintWriter)
pageContext (使普通Java类可访问WEB资源,自定义标签常用)
四大域对象
pageContext(称之为page域)
request(称之为request域)
session(称之为session域)
servletContext(称之为application域)
JSP的9个内置对象中比较常用的几个:request,response,session,pageContext
32、请说出JSP的9个内置对象对应的Servlet的对象
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletcContext
config ServletConfig
exception Throwable(异常)
page this(本JSP页面)
out JspWriter(带缓冲的PrintWriter)
pageContext PageContext
33、请说出JSP中4个域对象的生命周期
page:jsp页面被执行,生命周期开始,jsp页面执行完毕,声明周期结束
request:用户发送一个请求,开始,服务器返回响应,请求结束,生命周期结束
session:用户打开浏览器访问,创建session(开始),session超时或被声明失效,该对象生命周期结束
application:web应用加载的时候创建。Web应用被移除或服务器关闭,对象销毁。[结束]。
34、JSP中哪种情况下用哪种域对象。
四个域对象在选择的时候,能用范围小的绝不用范围大的
page:数据只是暂时存在集合,在jsp页面的其他地方要用,用page(页面中自定义的map)
(什么时候需要用map了,就用page)
Request:数据只是做显示的,看完了就没用了。就存request域,请求转发,
Servlet产生的处理结果(数据)交给jsp显示。 数据转发可以带数据。
Session:数据给用户看完了,一定还要用,会话结束了就没用了
用户登录,用户信息发给客户端看,看完了,一会访问别的页面还要看用户信息。
购物车,购物车成功了,给用户看购物车,待会随时间可以查看购物车
请求重定向,因为是两次请求,每一次请求的数据,第二次请求还要看。
application:数据给一个用户用完了,别人还要用
聊天室,聊天记录,需要给所有的用户看
统计网站在线人数,所有看到的应该是一个数
35、请说出el中的隐藏对象,和对应的servlet中的对象
EL表达式中的11个隐含对象
EL提供了自己的一套隐含对象,方便在页面内对各种常用数据信息的访问.
EL隐藏对象 JSP隐藏对象
pageScope/pageContext pageContext
requestScope request
sessionScope session
applicationScope appication
param request.getParameter()
paramValues 在提交表单里,有多个输入域同名getParameterValues
header request.getHeader(),按照key value的形式取出 value:是一个String类型的值
headerValues 按照key value的方式取出,但headerValues里面的value是一个String类型的数组
cookie request.getCookies()
initParam context param
36、请说出有几种方式可以设置禁止在JSP中使用el表达式
有俩种:
可以自由设置是否支持表达式语言,
1.<%@page isELIgnored="false"%> : 缺省为false,表示可以使用EL
2.配置web.xml也可达到同样的效果(同时存在,那种起作用?)(禁用脚本和EL) 默认都是false
在页面中通过page指令设置isELIgnored属性的优先级比在web.xml中通过<el-ignored>设置的高
37、请说出JSP中常用的动作
<jsp:include>标签
<jsp:forward>标签
<jsp:param>标签
38、请说出<jsp:include>动作与include指令的区别
<jsp:include>与include指令的比较
<jsp:include>标签是动态引入, <jsp:include>标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。
而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。
不管是<jsp:include>标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,
否则输出给客户端的内容将会是一个格式混乱的HTML文档。
<jsp:include>标签:使用page属性指定被引入资源。
include指令:使用file属性指定被引入资源。
39、请说出自定义JSTL标签的步骤
SimpleTag接口的方法:
doTag():执行标签的方法,由web服务器调用
getParent(): 得到父标签。
setJspBody(JspFragment jspBody)传入标签主体内容。由web服务器调用
setJspContext(JspContext pc)传入PageContext。由web服务器调用
setParent(JspTag parent) 传入父标签。由web服务器调用
a) 编写一个java类,实现SimpleTag接口或者继承SimpleTagSupport类。
b) 置这个标签
在项目下的WEB-INF目录下新建一个tld文件。(itcast.tld)
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>itcast</short-name>
<uri>http://gz.itcast.cn/jsp/tags</uri>
<!-- 一个标签的配置 -->
<tag>
<name>showClientIP</name>
<tag-class>gz.itcast.tag.ShowClientIPTag</tag-class>
<!-- 默认empty:表示空标签,么有主体内容 -->
<body-content>empty</body-content>
</tag>
</taglib>
标签
c)使用标签
导入:<%@taglib uri="http://gz.itcast.cn/jsp/tags" prefix="itcast" %>
使用: <itcast:showClientIP/>
40、请说出使用JDBC访问数据获取数据的一个过程。
1.加载注册驱动
2.建立数据连接 DriverManager.getConnection(url user pwd)
3.创建 statement或者PrepareStatement对象,执行sql语句
4.操作Resultset 结果集
5.资源释放
41、请说出Statement和PreparedStatement的区别
一、语法结构不同
1)Statment执行静态sql语句,且sql可以拼接。
2)PreparedStatement可以先执行预编译的sql语句,在预编译sql语句中使用?进行参数占位,后面在进行参数赋值
二、原理不同
1)Statement不能进行sql缓存
2)而PreparedStatement可以进行sql缓存,执行效率会比Statement快!!!
三、安全性不同
1)Statement存在sql注入的风险
2)而PreparedStatement可以有效防止用户注入。
42、mysql的默认端口是多少
3306
43、什么是数据库元数据
指的是基本数据,比如人,人的基本信息,姓名,性别,年龄,身高体重,
与元数据对应的是关系数据
也可以说:元数据就是关于数据的数据
44、什么是数据的悲观锁和乐观锁
数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁。
什么叫悲观锁呢,悲观锁顾名思义,就是对数据的冲突采取一种悲观的态度,
也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。
而乐观锁就是认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,
才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息,让用户决定如何去做。
45、请说出数据库三范式
1、每个字段都必须是不可分割的单元
2、每张表只表达一个意思(确保表中的每列都和主键相关)
3、每张表的主键之外的其他字段都只能和主键有直接的决定依赖关系
46、请简要描述Servlet中的过滤器,Filter
1、过滤器其实就是一个接口
2、过滤器是一个对象,可以在浏览器请求一个资源(动态或者静态),服务器响应资源的时候,执行过滤任务
3、过滤器由服务器运行
47、请说出Filter的生命周期
1、服务器启动时候,调用构造方法创建过滤器,只执行一次
2、init方法初始化
3、doFilter执行过滤方法(多次)
4、destroy方法,服务器停止或者服务器重启,销毁过滤器对象
48、请说Filter做模糊过滤的几种情况
没有明确的名称
/*
/demo/*
*.do
49、什么是过滤器链
过滤器链: 一个目标资源可以被多个过滤器过滤,那么形成一个过滤器链。***
注意:过滤器链中的过滤器执行顺序问题:由web.xml中filter-mapping的配置决定顺序。先配置的优先被执行。
50、怎么确定过滤器的执行顺序
过滤器链中的过滤器执行顺序问题:由web.xml中
-mapping的配置决定顺序。先配置的优先被执行。
51、请说出监听器的作用
web程序在开发的过程中,会频繁的使用到servletContext,servletRequest,httpSession三个对象,
在创建或者销毁这些对象时候,或者在对这些对象进行操作的时候,触发一些事件,
就可以使用web监听器去监听这些事情。
52、请详细说出Struts2的执行流程
1、服务器启动,加载服务器自身的web.xml文件
2、加载部署到服务器项目的web.xml文件
3、创建项目中struts 2的核心过滤器对象:StrutsPrepareAndExecuteFiter
4、执行过滤器初始化方法init
5、加载struts配置文件
6、执行过滤器doFilter方法
7、创建Action对象
8、再执行拦截器
9、执行action的业务方法
53、请说Struts2和Servlet的关系
struts 就是对 servlet 的封装
Servlet开发步骤:
Http --> servlet --> service --> dao 响应 jsp
struts 开发步骤
http --> action --> service --> dao 响应jsp
54、请说出配置Struts2的步骤
1、引入jar包
2、配置web.xml核心过滤器
3、配置struts配置文件,配置action
55、怎么配置Struts2的常量
1、找到default.properties,找到需要配置的属性
2、在struts.xml文件中定义常量
<constant nae="" value="">
56、请说出Struts2配置文件中nameSpace和package的作用
nameSpace 是命名空间,用于action访问时候的路径一部分
Package 管理action或者管理路径的作用,可用于包之间的继承
57、Struts2的action配置中,可不可以不指定class属性,为什么
可以,不写class属性,系统会默认调用com.opensymphony.xwork2.ActionSupport类的execute()方法,该方法代码是:
public String execute() throws Exception {
return SUCCESS;
}
58、请说出struts.properties和struts.xml配置的常量的执行顺序
先执行struts-default.xml,struts-plugin.xml,struts.xml配置的常量,
然后再执行struts.properties的配置文件,属性相同,后者会覆盖前者
59、在struts2中,全局配置的result和局部配置的result,会执行哪一个,为什么
局部优于全局
60、hibernate的handle
61、请问Struts2中的action是单例还是多例的,struts1呢?
Struts2 是多例,每次请求都会创建一个action
struts 1的Action是单实例的,因为它的数据保存在Form类中,
多线程环境下,Action只负责处理一些逻辑,
并没有数据,也就是大家把它当做一个工具使用。
62、请说出Struts2中自定义类型转换器的步骤
1、自定义转换器继承StrutsTypeConverter
2、重写convertFromString和convertToString方法
3、注册转换器
3.1、在Action所在的包中建立
action名-conversion.proprtties
3.2、在3.1文件中添加以下数据
需要转换的字段名=自定义转换器的权限定名
birthday=cn.itcast.convertor.DateTypeConvertor
总结:
以上的转换器注册时候是与action的名字想耦合的。因此只能在自己的action内部使用,
称之为局部转换器注册方式
63、如何定义Struts2中的全局类型转换器
1、自定义转换器继承StrutsTypeConverter
2、重写convertFromString和convertToString方法
3、注册转换器
3.1 在项目src目录下建立以下固定文件
xwork-conversion.properties
3.2 在3.1文件中添加以下数据
需要转换的类类型=转换器类的权限定名
如: java.util.Date= cn.itcast.converter.DateConverter 总结
该拦截器负责对错误信息进行拦截器<interceptor name="conversionError“ class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
64、请说出Struts2中的拦截器的生命周期
当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,
然后串成一个列表(list),最后一个一个地调用列表中的拦截器
struts2拦截器在访问某个action方法之前或者之后实施拦截,struts2拦截器是可插拔的,
拦截器是aop的一种实现
拦截器栈(interceptor Stack):将拦截器按一定的顺序链接成一条链,
在访问被拦截的方法时候,struts2拦截器链就会按 定义的顺序被依次调用
65、请说出Strins2中怎么配置自定拦截器
1、定义一个类实现Interceptor接口
2、实现生命周期的方法
3、声明和引用自定义的拦截器
66、Struts2拦截器能不能编码get请求的数据
可以,i18n编码
67、请详细说出Struts2中ValueStack
ValueStack 实际是一个接口,在struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValue
Stack类,这个类是struts2利用OGNL的基础
ValueStack特点
ValueStack贯穿整个Action的生命周期(每个Action类的对象实例都拥有一个ValueStack对象),其作用相当于一个数据中转站,在其中保存当前的Action对象和其他相关对象
68、请说出ognl表达式和el表达式各自的优缺点
OGNL:
object graph navigation language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。这样可以更好的取得数据。
EL:
Expression Lanhuage 代替jsp页面的java代码块
69、请说说你对Strut2的理解
struts2 是对servlet的封装
struts2 实现了mvc模式,层次结构清晰
struts2 有丰富的标签库,开发上大大方便
struts2 有丰富的过滤器
struts2 异常处理机制
70、请说出hibernate的执行流程
1、应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息
2、并用这些信息生成一个SessionFactory对象
3、然后从SessionFactory对象生成一个Session对象
4、并用Session对象生成Transaction对象;
A、可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作;
B、在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常Transaction对象将提交这些操作到数据库中。
71、请说hibernate中sessionFactory的作用
SessionFactory接口
Configuration对象根据当前的配置信息生成 SessionFactory 对象。SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存)。 Configuration cfg = new Configuration().configure(); SessionFactory sf = cfg.buildSessionFactory(); 是线程安全的。 SessionFactory是生成Session的工厂: Session session = sf.openSession(); 构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory对象。
72、请说出hibernate的session中get()和load()的区别
get()和load()都是读取数据的方法
get()在读取数据,如果为空,会返回null,所以容易导致空指针异常
load()在读取数据的时候,如果数据为空,会直接报错,因为load 认为,使用本方法就一定会有数据
73、请说出hibernate的Query中list()和iterator()的区别
query.list(),一次性查询出所有的数据,但是不会放入二级缓存中
query.iterator()
1、会放入缓存,也会从缓存取
2、容易产生N+1问题
74、请详细说出Hibernate3中持久化对象的几种状态
1、持久状态
2、游离状态
3、临时状态
75、请说出hibernate中缓存的作用,默认开启的是哪一级缓存
作用、减少对数据库的多次查询,提高程序的效率,保证缓存中的对象与数据库记录的保持同步,当
缓存改变以后,session不会立即执行sql,而是将多个sql语句合并为一条sql进行执行,提高效率
默认开启的是一级缓存
76、请说出hibernate开启二级缓存的步骤
方法:(1)在hibernate的properties文件修改配置开启
#hibernate.cache.use_second_level_cache true 二级缓存默认不开启
## enable the query cache
#hibernate.cache.use_query_cache true 是否开启查询缓存!
方法:(2)在hibernate.cfg.xml文件中增加配置文件
<!-- 开启查询缓存
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<class-cache usage="read-write" class="cn.itcast.g_second_cache.User"/>
<class-cache usage="read-only" class="cn.itcast.g_second_cache.Address"/>
-->
<!-- 集合缓存配置 (集合中的对象也要加入二级缓存!)
<collection-cache usage="read-only" collection="cn.itcast.g_second_cache.User.addresses"/>
-->
77、请说出hibernate一级缓存和二级缓存的区别
一级缓存:
由hibernate自动维护的,开发者不能够自行控制,默认开启,并且作用范围只在一个session内,缓存在除了session范围内就失效
二级缓存:
由开发者自定义开启,默认是关闭的,二级缓存的作用范围是基于application,作用时间长,范围大
78、请说出hibernate的配置文件中Inverse属性的作用
inversese 属性作用是控制的反转,例如表关系的维护,一方可以把自己的控制权放弃,交给另一方去维护
79、请说出hibernate的配置文件中lazy和cascade属性的作用。
lazy属性:
作用是延迟加载,默认是开启,当需要查询较大的数据量时候,使用缓存费内存,所以可以使用懒加载功能
懒加载有三个属性:
true:开启
false:关闭
extra:懒加载, 在真正使用数据的时候才查询,如果只是使用集合的size()/isEmpty()方法,只是统计数据!
cascade属性:
作用是控制级联操作,默认是不开启,多表之间的关系,级联一般用在保存(为了数据的安全性,其他操作适宜用代码去控制)
属性
save-update 级联保存更新
delete 级联删除
save-update,delete 级联保存更新、删除
all 同上 (save-update,delete)
none 默认不级联
80、请说出hibernate和JDBC查询数据库各自的优缺点,如何优化Hibernate?
hibernate:
优点:
1、hibernate是通过hql语句操纵数据库的,是一个面向对象的过程,开发者只需关心如何写hql语句便可以操纵数据库。相对于学习sql语句,hibernate学习成本更低
2、hibernate 对表单的复杂关系维护出色
3、hibernate 封装了许多简单的操作数据库方法,开发者只需调用就可使用对数据库操作
4、移植性强,只需改驱动和少许配置就能更换数据库
5、耦合性低
缺点:
由于是对JDBC的轻量封装,hibernate的效率比JDBC低
hibernate的缓存使用不容易
JDBC:
优点:
1、直接使用sql语句操做数据库,效率高
缺点:
1、耦合高
2、对开发者要求高,开发难度相对比较大
3、移植性差
优化hibernate的核心是优化hql语句
81、请说出你对hibernate的理解。
hibernate是一款轻量级的持久层框架,但是功能强大,解耦能力强,提高了代码的复用性,开发难度降低,强大的面向对象型hql语句简化了开发流程
82、请解析什么是Spring的IOC(控制反转)
IOC 控制反转,
Inversion of control 控制反转! 所以,也叫控制反转容器!
主要是把创建对象的权利交给外部容器,而外部容器创建对象,可以更好的管理对象的创建时期,便于程序的管理维护与开发
83、请解析什么事Spring的AOP,以及其应用场景
aop(Aspect Oriented Programming 面向切面编程)原理是动态代理,通过动态代理可以为目标对象增加额外功能。Spring的声明式事务管理中,更精细的控制事物。采用面向切面编程来实现很多基础但是与业务无关功能的解耦,比如:事务管理,日志采集,权限验证。。。
84、请问AOP是Spring所独有的吗?Struts2中有没有AOP?
不是,aop是一种思想,而struts2的拦截器可以算是aop思想的实现方式!
85、请问Spring中IOC容器里面的对象是单例的还是多例的。
scope="singletion" 默认是单例的,在容器创建的时候创建。
86、请说出Spring中IOC容器里面对象的生命周期
(单列情况)Spring中IOC容器的对象在服务器启动时创建,需要手动调用destroy()方法销毁。
(多列情况)Spring中IOC容器的对象在第一次使用的时候创建,使用完自动销毁。
87、Spring IOC容器里面的对象,什么时候后会被创建
1. 单例/多例
scope="singleton" 默认是单例;默认是在创建容器的时候创建!
2.单例的对象,能否在第一次调用的时候创建? (服务器启动不要创建)
lazy-init="true" 延迟创建单例的对象; 在第一次使用的时候创建一次!
注意:只对单例的对象有效!
3. 初始化与销毁
init-method="init_" 对应bean中的init_()方法;
在创建对象之后执行!
destroy-method="destroy_"
在对象销毁时候执行!
必须要调用容器的ac.destroy(); 需要用容器的实现类!(对单例的对象有效!)
88、什么是依赖注入?
程序在运行的时候,所需要的对象由外部容器动态的创建注入
89、请说出注解注入对象,和配置文件注入对象各自的优缺点和你的体会
注解注入:
开发方便,不需要写太多代码,配置简单,开发效率高。
维护不方便,间接增加了程序的耦合度,修改需要重新编译
XML配置:
维护方便,对于对象的表示清晰易解,修改后不需要重新编译
配置麻烦,开发效率较慢
90、请问Spring 的 AOP中使用了几种动态代理技术,分别是什么,各自的特点是什么
spring在运行期创建代理,有两种代理方式:若目标对象实现了若干接口,spring就会使用JDK动态代理。若目标对象没有实现任何接口,spring就使用CGLIB库生成目标对象的子类。
91、请问Spring提供了几种事务管理方式,分别是什么
Spring提供了两种事务管理方式
编程式事务管理
声明式事务管理
如果你并不需要细粒度的事务控制,你可以使用声明式事务,在Spring中,你只需要在Spring配置文件中做一些配置,即可将操作纳入到事务管理中,解除了和代码的耦合, 这是对应用代码影响最小的选择,从这一点再次验证了Spring关于AOP的概念。当你不需要事务管理的时候,可以直接从Spring配置文件中移除该设置
Spring声明式事务控制:
在Spring中,对于事务控制: Spring提供了事务切面(DataSourceTransactionManager、HibernateTransactionManager), 如果程序中使用事务,可以利用aop切入点表达式拦截指定对象生成代理对象, 从而在执行拦截方法的时候(业务方法), 动态织入事务切面的代码!
92、请说出Spring中声明式事务的步骤
第一步 :开启注解 扫描
第二步 :Aop配置
第三步:切入点 表达式
<!-- 1. 拦截指定类的指定方法 (UserDao.save) -->
<!--<aop:pointcut expression="execution(* cn.itcast.g_aop_pt.UserDao.save(..))" id="pt"/>-->
第四点:切面配置
<aop:aspect ref="aop">
<aop:before method="begin" pointcut-ref="pt"/>
<aop:after method="after" pointcut-ref="pt"/>
</aop:aspect>
93、请简要说出Spring AOP编程的执行过程
Aop执行过程:
1. 创建IOC容器对象,
a. 根据切入点表达式配置,对符合规则的类,生成代理对象!
b. 其他bean,如果不符合切入点表达式拦截规则,就直接创建!
2. 执行代理类的方法,
a. 如果方法切入点表达式拦截规则, 在执行方法时候动态织入“通知代码”
b. 执行方法,不被拦截器,就直接执行代理的方法(代理会直接调用目标对象)
Spring的Aop编程,其实就是代理的生成的过程,只是这步骤由Spring运行时期完成!
94、Spring中的BeanFactory与ApplicationContext的作用有哪些?
ApplicationContext 继承了 Beanfactory ,两者都是接口
beanFactory 是一个创建bean对象的实例化工厂
applicationContext 是一个贯穿web程序的对象容器
95、描述一下你如何理解Spring的ApplicationContext对象的?
applicationContext 存放了IOC容器实例化的对象,它是一个贯穿web应用的对象
95、请说出你对Spring的理解
spring 提供了对架构分层的一站式解决方案
spring 具有极大的包容性,能与市面上多个流行的主流框架相互整合共用,提高开发效率。
spring 的事物管理和切面编程,对于程序的开发,能起到非常好的控制作用
spring 的ioc容器可以更好的管理对象的创建时期,便于程序的管理维护与开发
96、为什么要用Spring
Spring提供的是一站式的解决方案!
Spring 主要是创建对象,与其他框架整合,表示可以帮其他框架创建对象!
在项目中引入spring立即可以带来下面的好处降低组件之间的耦合度,实现软件各层之间的解耦。
1、IOC(依赖注入):包含并管理应用对象的配置和生命周期,你可以配置你的每个bean如何被创建,也可以配置每个bean是只有一个实例,还是每次需要时都生成一个新的实例,以及它们是如何相互关联的
2、AOP(面向切面):采用了面向切面编程来实现很多基础但是与业务逻辑无关的功能的解耦,比如:事务管理、日志、权限验证.....
3、DAO:Spring 还提供了对数据库JDBC的封装,使用JdbcTemplate来简化数据操
作
4、ORM:提供了对主流的对象关系映射框架的支持
5、JEE: 对Java企业级开发提供了一些解决方案,例如EJB、JMS等 6、WEB: 提供了自己的Spring MVC和对显示层框架的集合支持
97、谈一谈SSH的整合
Ssh分工明确,各司其职,struts负责表现层,spring负责业务层,hibernate负责数据库层。其中spring相当于一个中间的角色。负责对其他两个框架的整合。
Spring框架 可以利用IOC容器创建对象给其他容器使用,可以使用切面编程aop实现对重复的代码的编写,具有一次编写多次利用的好处。还有的 spring的事务。可以控制数据的回滚的问题,实现对数据的增加,删除,修改的有效控制。
Hibernate:方便我们对数据库的操作。简化我们对sql语句的书写。我们 也可以自己自己写sql语句。
98、请说说JSON和XML作为数据载体的各自的优缺点
json:
格式简洁,数据的有效性高,它是以对象形式传输数据,带宽流量的利用率高,编写相对比较简单
缺点:可读性差
xml:
可读性好,它是以标签形式存放数据,格式阅读方便了然
缺点:编写麻烦,占用带宽流量
99、拦截器和过滤器之间不同之处
拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别。其主要区别为以下几点:
1)拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的。
2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器
3)拦截器只能对Action请求起作用,而过滤器可以对几乎所有的请求起作用。
4)拦截器可以访问Action上下文、值栈里的对象,而过滤器不能
5)在Action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
SE部分
1、请说出常用的几种设计模式,并详细描
单例模式、
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在
装饰器模式、
装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例
普通工厂模式、
就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
观察者模式、
观察者模式定义了对象间的一对多依赖关系,让一个或多个观察者对象观察一个主题对象。
当主题对象的状态发生变化时,系统能通知所有的依赖于此对象的观察者对象,从而使得观察者对象能够自动更新。
2、创建线程有几种不同的方式
1.第一种方式继承了Thread类,但JAVA在类中只支持单继承,就不能继承其它类
继承Thread:线程代码存放在Thread子类run方法中
2.第二种方式实现了接口,但可以继续继承其它类;(避免了单继承局限性)
实现接口,代码存放在Runnable实现子类子的run方法中
3、HashMap和Hashtable有什么区别?
1 HashMap不是线程安全的
hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,
但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。
2 HashTable是线程安全的一个Collection。
4、ArrayList和LinkedList有什么区别?
如果是实现了List接口的集合类,具备的特点: 可以存储重复元素,而且是有序的
ArrayList 底层是维护了一个Obejct数组实现的, 特点: 查询速度快,增删慢。
LinkedList 底层是使用了链表数据结构实现的,特点: 查询速度慢, 增删快.
5、如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?
不会,在下一个垃圾回收周期中,这个对象将是可被回收的。