一.前端面试经典题目
1.说明
DTD,文档类型定义,是一种保证 html 文档格式正确的有效方法,在解析网页时,浏览器将使用 DTD 来检查页面的有效性(是否符合规范,元素和标签使用是否正确)并且采取相应的措施。同时它还会影响浏览器的渲染模式(工作模式)。
2.准确的指出以下代码的显示结果(酷讯)
<style> a{ position:relative; height:200px; width:500px; border:solid 1px #000; background:#FFF;
}
#b,#c{position:absolute; width:250px; height:90px;}
#b{top:30px; left:50px; background:#FF0000; z-index:1;}
#c{bottom:30px; right:50px; background:#0000FF;}
</style>
<div class="a">
<div id="b"></div> <div id="c"></div>
</div>
结果如图所示:
3.指出以下代码的显示效果
<table border=1 width=500 style="text-align:center;">
<tr>
<td rowspan=2 width=50% height=50>a</td>
<td width=50% eight=25>d</td>
</tr>
<tr><td width=50% height=25>b</td></tr>
<tr height=25><td colspan=2>c</td></tr>
</table>
4.如何显示没有下划线的超链接?()
A. a {text-decoration:none}
B. a {text-decoration:no underline}
C. a {underline:none}
D. a {decoration:no underline}
答案:A
5.请问,div 和 span, p 标签三者间的区别 (YG)
从语义化的角度来讲,div和span标签对于它们包含的元素是没有意义的,而p标签则是
一个语义化标签,表示一个段落。所以div 和 span 一般是用来布局。
从显示的角度来讲,span 是内联的,用在一小块的内联 HTML 中,前后不断行,div 元素是块级的,等同于其前后有断行,p 元素是块级的,前后断行,而且还要再隔一行,相当于断两行。
6.CSS中class和id的区别是?
id:每个页 ID 是唯一的不能重复。 class:可以设置多个
7.实现框架的标签 举例说明
<frameset cols="25%,50%,25%">
<frame src="frame_a.htm" /> <frame src="frame_b.htm" />
<frame src="frame_c.htm" />
</frameset>
8.写出以下
<input /> 标签用于搜集用户信息。根据不同的 type 属性值,输入字段拥有很多种形式。输入字段可以是文本字段、复选框、掩码后的文本控件、单选按钮、按钮等等。
<form> 标签用于为用户输入创建 HTML 表单。表单能够包含 input 元素,比如文本字段、复选框、单选框、提交按钮等等。
<script> 标签用于定义客户端脚本,比如 JavaScript。script 元素既可以包含脚本语句,也可以通过 src 属性指向外部脚本文件。
<style> 标签用于为 HTML 文档定义样式信息。
<table> 标签定义 HTML 表格。简单的 HTML 表格由 table 元素以及一个或多个 tr、 th 或 td 元素组成。
<b>呈现粗体文本效果。
<img /> 元素向网页中嵌入一幅图像。
9.CSS中 link 和@import 的区别是?
答: (1) link属于HTML标签,而@import是CSS提供的;
(2) 页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载;
(3) import只在IE5以上才能识别,而link是HTML标签,无兼容问题;
(4) link方式的样式的权重 高于@import的权重.
10.用
11.看以下代码:
文件名称:forward.jsp
<html>
<head><title> 跳转 </title> </head>
<body>
<jsp:forward page="index.htm"/>
</body>
</html>
如果运行以上jsp文件,地址栏的内容为
A.http://127.0.0.1:8080/myjsp/forward.jsp
B.http://127.0.0.1:8080/myjsp/index.jsp
C.http://127.0.0.1:8080/myjsp/index.htm
D.http://127.0.0.1:8080/myjsp/forward.htm
答: A
12.基于以下
A.main1.css和main2.css同时开始加载,先加载完成的优先解析
B.如果main1.css和main2.css中有相同的选择器规则,那么main2.css中的规则将覆盖 main1.css的规则
C.main2.css只有在main1.css加载并解析后,才开始加载
D.如果main1.css和main2.css中有相同的选择器规则,那么main2.css中的规则将被忽略
答:A
13.下列html语义化标签中,描述存在错误的是
A.<em>强调文字,<blockquote>长文本引用
B.<strong>强调文字,<h1>文章栏目标题
C.<a>超链接,<p>文章段落
D.<section>定义文档中的节,<nav>导航
E.<ul>有序列表。<ol>无序列表
答: E
14.设置文字颜色应使用属性
A.font-family B.font-color
C.color D.font
答: C
15.以下标签,错误的是
A.text-left用于左对齐
B.text-center水平居中对齐
C.text-vertical垂直居中对齐
D.text-uppercase可以将文字全部大写
答: C
16.有一个元素,需要在pc端显示而在手机端隐藏,需要使用的方法是?
A.visible-xs-8 hidden-md B.visible-md-8 hidden-xs
C.visible-md-8 hidden-sm D.visible-sm-8 hidden-md
答: B
Javascript
1.解释下面语句的意思:document.form["formName"].submit。(百度)
答:获取 name 为 formName 的表单并将该表单数据提交到服务器。但这行代码是不能运行的,有两处错误,一是通过表单名称来获取表单得到时候,应该写成 document.forms[‘formName’],提交表单事件使用 submit 方法,需要加上括号.
2.简单说一下浏览器本地存储是怎样的
答:在较高版本的浏览器中,js提供了sessionStorage和globalStorage。在HTML5中提供了localStorage来取代globalStorage。
html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage。
sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。
而localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。
3.javascript中document.getElemenById的返回值的类型为()
A.Array B.Object C.String D.Function
答:B
4.下面给定的代码中, myFunc() 返回什么?
var foo=’foo’;
var bar=’bar’;
function myFunc() {
return foo+bar;
}
A.undefined B.foobar C.foo+bar D.NaN
答:C
5.哪一个是javascript中array的正确写法?
A.var txt = new Array("tim","kim","jim")
B.var txt = new Array="tim","kim","jim"
C.var txt = new Array:1=("tim")2=("kim")3=("jim")
D.var txt = new Array(1:"tim",2:"kim",3:"jim")
答: A
6.下面程序的显示结果是?
A.hi B.hi hello C.hello D.不显示
答: A
7.请阅读以下代码:问题:span标签的width和height分别为多少?
A.width = 0px,height = 0px
B.width = 400px,height = 200px
C.width = 100px,height = 50px
D.width = 0px,height = 200px
答: D
8.JS 表单弹出对话框函数是?获得输入焦点函数是?
弹出对话框函数:alert(), prompt(), confirm() 获得输入焦点函数:focus()
9.JS 的转向函数是?怎么引入一个外部 JS 文件?
转向使用
10.有下面语句:<input id="txt" type="text" value="baidu" /> 编写代码,当鼠标划过文本框,自动选中文本框中的内容。(百度)
11.设计一个网页,使得打开它时弹出一个全屏的窗口,该窗口中有一个文本框和一个按钮。用户在文本框中输入信息后点击按钮就可以把窗口关闭,而输入的信息却在主网页中显示。(新浪)
主窗口:
弹出窗口:
12.判断以下代码是否正确,如果有错,请指出错误,如果正确,请指出运行结果
var arr = new Array(
new Array(1,2,3,4),
new Array("abc", "def", "xyz"),
);
for(i = 0; i < arr.length; i++) { document.write(arr[0])
}
怀疑这个代码写错了,第二个
注:arr 是一个二维数组,该数组有两个元素,第一个元素是数组[1,2,3,4],第二个元素也是一个数组为["abc", "def", "xyz"],for 循环语句执行了两次,但都是输出第一个元素,即数组[1,2,3,4]。
13.用 JavaScript 写一个函数,其功能是可以删除数组中重复的元素。
14.以下哪条 JavaScript 语句会产生运行错误:( )
var obj = ( );
var obj = [ ];
var obj = { };
D. var obj = //;
答案:A
15.请选择结果为真的表达式:( )
null instanceof Object
null === undefined
null == undefined
NaN == NaN
答案:C
16.假设 a.html和 b.html 在同一个文件夹下面,用 JavaScript 实现当打开 a.html 五秒钟后,自动跳转到 b.html。
17.请使用 JavaScript 写出三种产生一个 image 标签的方法(提示:从方法、对象、HTML 角度考虑)
(1). var img = new Image();
(2). var img = document.createElement("image")
(3). img.innerHTML = "<img src='xxx.jpg' />"
18.js 中网页前进和后退的代码
前进: history.forward();或者 history.go(1); 后退: history.back (); 或者 history.go(-1);
实现点击按钮弹出窗口的代码
document.getElementById( 'button' ).onclick = function(){ window.open ('page.html');
}
其中,button 是按钮的 id,page.html 是要弹出的窗口页面。
JavaScript 包括那些基本数据类型?(小米)
JavaScript 中包括 5 种基本数据类型,分别是 Number,String,Boolean,Null 和 Undefined。
二.Web
1.谈谈对 mvc 的认识
由模型(model),视图(view),控制器(controller)完成的应用程序由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;
MVC 是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用 MVC 应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。视图是用户看到并与之交互的界面。模型表示企业数据和业务规则。控制器接受用户的输入并调用模型和视图去完成用户的需求。
MVC 的优点:低耦合性、高重用性和可适用性、较低的生命周期成本、快速的部署、可维护性、可扩展性,有利于软件工程化管理
MVC 的缺点:没有明确的定义,完全理解 MVC 并不容易。不适合小型规模的应用程序。
2.什么是JSP动作(JSP action)?
JSP动作以XML语法的结构来控制Servlet引擎的行为。当JSP页面被请求的时候,JSP动作会被执行。它们可以被动态的插入到文件中,重用JavaBean组件,转发用户到其他的页面,或者是给Java插件产生HTML代码。下面列出了可用的动作:
jsp:include-当JSP页面被请求的时候包含一个文件。
jsp:useBean-找出或者是初始化Javabean。
jsp:setProperty-设置JavaBean的属性。
jsp:getProperty-获取JavaBean的属性。
jsp:forward-把请求转发到新的页面。
jsp:plugin-产生特定浏览器的代码。
3.什么是JSP指令(Directive)?JSP中有哪些不同类型的指令?
Directive是当JSP页面被编译成Servlet的时候,JSP引擎要处理的指令。Directive用来设置页面级别的指令,从外部文件插入数据,指定自定义的标签库。Directive是定义在 <%@ 和 %>之间的。下面列出了不同类型的Directive:
包含指令(Include directive):用来包含文件和合并文件内容到当前的页面。
页面指令(Page directive):用来定义JSP页面中特定的属性,比如错误页面和缓冲区。
Taglib指令: 用来声明页面中使用的自定义的标签库
4.JSP有什么优点?
下面列出了使用JSP的优点:
JSP页面是被动态编译成Servlet的,因此,开发者可以很容易的更新展现代码。
JSP页面可以被预编译。
JSP页面可以很容易的和静态模板结合,包括:HTML或者XML,也可以很容易的和产生动态内容的代码结合起来。
开发者可以提供让页面设计者以类XML格式来访问的自定义的JSP标签库。
开发者可以在组件层做逻辑上的改变,而不需要编辑单独使用了应用层逻辑的页面。
5.sendRedirect()和forward()方法有什么区别?
sendRedirect()方法会创建一个新的请求,而forward()方法只是把请求转发到一个新的目标上。重定向(redirect)以后,之前请求作用域范围以内的对象就失效了,因为会产生一个新的请求,而转发(forwarding)以后,之前请求作用域范围以内的对象还是能访问的。一般认为sendRedirect()比forward()要慢。
6.什么是cookie?session和cookie有什么区别?
cookie是Web服务器发送给浏览器的一块信息。浏览器会在本地文件中给每一个Web服务器存储cookie。以后浏览器在给特定的Web服务器发请求的时候,同时会发送所有为该服务器存储的cookie。下面列出了session和cookie的区别:
无论客户端浏览器做怎么样的设置,session都应该能正常工作。客户端可以选择禁用cookie,但是,session仍然是能够工作的,因为客户端无法禁用服务端的session。
在存储的数据量方面session和cookies也是不一样的。session能够存储任意的Java对象,cookie只能存储String类型的对象。
7.如何知道是哪一个客户端的机器正在请求你的Servlet?
ServletRequest类可以找出客户端机器的IP地址或者是主机名。
getRemoteAddr()方法获取客户端主机的IP地址,getRemoteHost()可以获取主机名。
8.doGet()方法和doPost()方法有什么区别?
doGet:GET方法会把名值对追加在请求的URL后面。因为URL对字符数目有限制,进而限制了用在客户端请求的参数值的数目。并且请求中的参数值是可见的,因此,敏感信息不能用这种方式传递。
doPOST:POST方法通过把请求参数值放在请求体中来克服GET方法的限制,因此,可以发送的参数的数目是没有限制的。最后,通过POST请求传递的敏感信息对外部客户端是不可见的。
9.解释下Servlet的生命周期。
对每一个客户端的请求,Servlet引擎载入Servlet,调用它的init()方法,完成Servlet的初始化。然后,Servlet对象通过为每一个请求单独调用service()方法来处理所有随后来自客户端的请求,最后,调用Servlet(译者注:这里应该是Servlet而不是server)的destroy()方法把Servlet删除掉。
10.什么是Servlet?
Servlet是用来处理客户端请求并产生动态网页内容的Java类。Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。
11.jsp有哪些内置对象?作用分别是什么?(至少三个)
1、request对象 客户端请求,此请求会包含来自GET/POST请求的参数通过它才能了解到客户的需求,然后做出响应。
2、response对象 响应客户请求的有关信息
3、session对象 它指的是客户端与服务器的一次会话,从客户端连到服务器的一个 WebApplication开始,直到客户端与服务 器断开连接为止。
4、out对象 它是JspWriter类的实例,是向客户端输出内容常用的对象
5、page对象 它是指向当前JSP页面本身,有点象类中的this指针,它是 Java.lang.Object类的实例
6、application对象 它实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭
7、exception对象 它是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。
8、pageContext对象 它提供了对JSP页面内所有的对象及名字空间的访问
9、config对象 它是在一个Servlet初始化时,JSP引擎向它传递信息用的
12.谈谈对XML的理解?说明Web应用中Web.xml文件的作用?
可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。什么是可扩展标记语言?
可扩展标记语言是一种很像超文本标记语言的标记语言。
它的设计宗旨是传输数据,而不是显示数据。
它的标签没有被预定义。您需要自行定义标签。
它被设计为具有自我描述性。
它是W3C的推荐标准。
web.xml文件是用来配置:欢迎页、servlet、filter等的。当你的web工程没用到这些时,你可以不用web.xml文件来配置你的web工程。
13.什么是注解?
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
14.servlet中转发和重定向的区别?
Servlet中页面的跳转有两种方式:转发和重定向。
1、转发和重定向的区别
①转发是服务器行为,重定向是客户端行为。
②转发是浏览器发生了一次请求,重定向至少是两次请求。
③转发地址栏中的url不会发生改变,重定向地址栏中的url会发生改变。
④转发因为是一次请求,两次跳转之间传输信息不会丢失,而重定向两次跳转会丢失传输信息。
⑤转发只能将请求跳转到同一个web应用中的页面,重定向可以指向任何页面,包括同一个web应用中的页面,同一个站点中的页面,其他站点的页面。
2、传递给HttpServlet Response.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher 对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
15.struts2如何解决重复提交问题?
token 在struts配置文件中增加token拦截器。
16.struts2 国际化
在struts2中是使用了拦截器来实现国际化。
struts2的国际化分为三部分:
1.Action范围,这种范围是用Action的实现类的类名来作为前缀__语言名称_国家地区名(大写).properties.
2.包范围,包范围是用package作为前缀__语言名称_国家地区名(大写).properties。
3.全局范围,全局范围的前缀默认的是application,可以通过xml配置文件配置常量(使用constant标签注册i18l拦截器)来指定前缀,
前缀__语言名称_国家地区名(大写).properties。
国际化实现的原理:通过i18n拦截器获得请求参数request——locale的值(zh或者是en)并把当前的值转化为locale对象,
把locale对象存在ww_trans_i18n_locale的session作用域中,根据struts2的请求处理流程,
拦截器只会在进入action的时候才会调用,所有我们一般把对jsp的访问转化为对action的访问。
17.hibernate 延迟加载?
延迟加载(lazy load)也叫懒加载,它是hibernate为提高程序执行效率而提供的一种机制,即只有真正使用该对象的数据时才会创建。
Hibernate中主要通过代理(proxy)机制来实现延迟加载的。具体过程:Hibernate从数据库获取某一个对象数据时、获取某一个对象的集合属性值时,或获取某一个对象所关联的另一对象时,由于没有使用该对象的数据(除标识符值外),Hibernate并不从数据库加载真正的数据,而只是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性都为默认值;只有在真正需要使用该对象的数据时才创建这个真实对象,真正从数据库中加载它的数据。这样在某些情况下,就可以提高查询效率。
Hibernate中默认采用延迟加载的情况主要由以下几种:
(1)当调用Session上的load()方法加载一个实体时,会采用延迟加载。
(2)当Session加载某个实体时,会对这个实体中的集合属性值采用延迟加载。
(3)当Session加载某个实体时,会对这个实体所单端关联的另一个实体对象采用延迟加载。
18.OGNL是什么?你在项目中如何使用它
OGNL是:对象图形导航语言。
原ognl是单个对象的,在struts2的应用是多个对象的,struts2的类型转换也是通过ognl来实现的。
Struts2中默认的表达式语言就是ognl,struts2的取值设值都是通过ognl来实现的,struts2要依靠它的标签才可以使用ognl。
相对于jstl或者其他表达式语言,它有如下优势:
1 能够调用对象实例的方法
2 能够调用类的静态方法
3 操作集合对象
4 访问Ognl上下文
取值时ognl有三个参数:1 表达式,2 ognl的上下文(map),3 对象实例(值栈)。
如果表达式带#号是从上下文中(map)拿值,否则是从值栈中拿值。
设值时有四个参数:1 表达式,2 ognl的上下文(map),3 对象实例,4 设入的值
如果表达式带#号是把值设入上下文中(map),否则是把值设入值栈中。
在struts2中 ognl的实现关系:ActionConetxt。
ognl 3个常用的符号 # $ %
# 1 构造map,list集合。
2 取ognl上下文的值。
3 用来过滤集合。
$ 1 在校验框架中取资源文件中的值。
2 可以在配置文件中传递参数。
% 使用百分号可以进行转义。
19.Spring有哪些优点?
轻量级:Spring在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB。
控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。
面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。
容器:Spring包含并管理应用程序对象的配置及生命周期。
MVC框架:Spring的web框架是一个设计优良的web MVC框架,很好的取代了一些web框架。
事务管理:Spring对下至本地业务上至全局业务(JAT)提供了统一的事务管理接口。
异常处理:Spring提供一个方便的API将特定技术的异常(由JDBC, Hibernate, 或JDO抛出)转化为一致的、Unchecked异常。
20.Hibernate中get和load有什么不同之处?
把get和load放到一起进行对比是Hibernate面试时最常问到的问题,这是因为只有正确理解get()和load()这二者后才有可能高效地使用Hibernate。get和load的最大区别是,如果在缓存中没有找到相应的对象,get将会直接访问数据库并返回一个完全初始化好的对象,而这个过程有可能会涉及到多个数据库调用;而load方法在缓存中没有发现对象的情况下,只会返回一个代理对象,只有在对象getId()之外的其它方法被调用时才会真正去访问数据库,这样就能在某些情况下大幅度提高性能。
21.什么是
Ajax 是 Asynchronous JavaScript and XML 的缩写,是 JavaScript、XML、CSS、DOM 等多个技术的组合。
Ajax 的工作原理是一个页面的指定位置可以加载另一个页面所有的输出内容,这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以 Ajax 技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。
Ajax 的核心技术是 XMLHttpRequest,它是 JavaScript 中的一个对象。
Ajax 的优点是:
(1).减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端执行,利用客户端闲置的资源进行处理;
(2).在只局部刷新的情况下更新页面,增加了页面反应速度,使用户体验更友好。
Ajax 的缺点是不利于 SEO 推广优化,因为搜索引擎无法直接访问到 Ajax 请求的内容。
22.ActionContext是用来干什么的
ActionContext是Action的上下文。
通过ActionContext这个类来可以获得:request,application,session,Locale、ValueStack,ConversionErrors
1 可以获得servlet的api:request,application,session。
2 进行国际化:获得语言环境 Locale。
3 收集错误信息:ConversionErrors。
4 有个值栈来装action实例与创建的模型驱动的实例:ValueStack。
5 ActionContext是线程安全的-用本地线程实现的。
23.如果我的网站用的
1)数据库中库和表都用 utf8 编码
2)java连接 mysql,指定数据库编码为 utf8 ;
3)java文件指定编码为 utf-8
4)网站下所有文件的编码为 utf8
5)html 文 件 指 定 编 码 为 utf-8
24.hibernate的三种状态之间如何转换
当对象由瞬时状态(Transient)一save()时,就变成了持久化状态;
当我们在Session里存储对象的时候,实际是在Session的Map里存了一份, 也就是它的缓存里放了一份,然后,又到数据库里存了一份,在缓存里这一份叫持久对象(Persistent)。 Session 一 Close()了,它的缓存也都关闭了,整个Session也就失效了,这个时候,这个对象变成了游离状态(Detached),但数据库中还是存在的。
当游离状态(Detached)update()时,又变为了持久状态(Persistent)。
当持久状态(Persistent)delete()时,又变为了瞬时状态(Transient), 此时,数据库中没有与之对应的记录。
25.简述
TCP 是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
第一次握手:建立连接时,客户端发送
第二次握手:服务器收到
第三次握手:客户端收到服务器的
完成三次握手,客户端与服务器开始传送数据。
26.什么是拦截器 说说Struts2用拦截器来干什么 说出6个拦截器来
在访问类的某个方法或者属性之前执行,拦截的是Action的请求,进行拦截然后在方法的执行前或者之后加入某些操作,
如:国际化,权限,效验等与源代码无关的操作。
国际化,表单重复提交,类型转换,自动装配,数据封装,异常处理,模型驱动,请求参数,处理类型转换错误,日志拦截器。
27.写出你所知道的
DOM,SAX,SimpleXML,其中前两种是通用的解析器,和具体语言无关,而 SimpleXML 则是 PHP 提供的解析器。
28.请你谈谈SSH整合:
SSH: Struts(表示层)+Spring(业务层)+Hibernate(持久层)Struts:Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分(View:沿 用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet,struts-config.xml,Action) Hibernate:
Hibernate是一个持久层框架,它只负责与关系数据库的操作。 Spring:
Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。
29.Spring里面applicationContext.xml文件能不能改成其他文件名?
ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。缺省情况下,它会在WEB-INF/applicationContext.xml文件找Spring的配置。你可以通过定义一个<context-param>元素名字为”contextConfigLocation”来改变Spring配置文件的位置。示例如下:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener <context-param>
<param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/xyz.xml</param-value> </context-param></listener-class> </listener>
30.如何在web应用里面配置spring?
在web.xml中加入如下同容,
在启动web服务器时加载/WEB-INF/applicationContext.xml中的内容。
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
通过如下类得到ApplicationContext实例
WebApplicationContextUtils.getWebApplicationContext
31.spring中的BeanFactory与ApplicationContext的作用有哪些?
1. BeanFactory
负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。
2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:
a. 国际化支持
b. 资源访问:
Resource rs =ctx.getResource(”classpath:config.properties”),
“file:c:/config.properties”
c. 事件传递:通过实现ApplicationContextAware接口
32.什么是aop,aop的作用是什么?
面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足
除了类(classes)以外,AOP提供了切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理
Spring的一个关键的组件就是AOP框架,可以自由选择是否使用AOP
提供声明式企业服务,特别是为了替代EJB声明式服务。最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上
允许用户实现自定义切面,用AOP来完善OOP的使用 可以把Spring AOP看作是对Spring的一种增强
33.什么是Spring的依赖注入?有哪些不同类型的IOC(依赖注入)方式?
依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
34.在
Spring提供以下几种集合的配置元素:
<list>类型用于注入一列值,允许有相同的值。
<set> 类型用于注入一组值,不允许有相同的值。
<map> 类型用于注入一组键值对,键和值都可以为任意类型。
<props>类型用于注入一组键值对,键和值都只能为String类型。
35.Spring框架的事务管理有哪些优点?你更倾向用那种事务管理类型?
它为不同的事务API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式。
它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如
它支持声明式事务管理。
它和Spring各种数据访问抽象层很好得集成。
大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。
36.什么是Spring的MVC框架?
Spring 配备构建Web 应用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声明的方式把请求参数和业务对象绑定。
37.DispatcherServlet
Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。
38.mybatis当实体类中的属性名和表中的字段名不一样
解决办法①:
通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>
select order_id id, order_no orderno ,order_price price form orders where order_id=#{id};
</select>
解决办法②:
通过<resultMap>来映射字段名和实体类属性名的一一对应的关系
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
<!–用id属性来映射主键字段–>
<id property=”id” column=”order_id”>
<!–用result属性来映射非主键字段–>
<result property = “orderno” column =”order_no”/>
<result property=”price” column=”order_price” />
</reslutMap>
39.mybatis在mapper中如何传递多个参数?
java的反射机制并不能让框架获取到参数的名字(方法签名中只有参数类型,
可以说是为了优化,也可以说设计就是如此,总之名字无意义), 所以mybatis默认的命名为: param1,param2……
如果想给他们指定名称,可以使用 @param 注解:
01.import org.apache.ibatis.annotations.param;
02.public interface usermapper {
03. user selectuser(@param(“username”) string username,
04. @param(“hashedpassword”) string hashedpassword);
05.}
然后,就可以在xml像下面这样使用(推荐封装为一个map,作为单个参数传递给mapper):
01.<select id=”selectuser” resulttype=”user”>
02. select id, username, hashedpassword
03. from some_table
04. where username = #{username}
05. and hashedpassword = #{hashedpassword}
06.</select>
40.什么是MyBatis的接口绑定,有什么好处
接口映射就是在IBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,
我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置.
41.MyBatis实现一对多有几种方式,怎么操作的
有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在resultMap里面配置collection节点配置一对多的类就可以完成;
嵌套查询是先查一个表,根据这个表里面的
结果的外键id,去再另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置
42.MyBatis里面的动态Sql是怎么设定的?用什么语法?
MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整,必须配合where,trim节点,where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉
43.讲下MyBatis的缓存
MyBatis的缓存分为一级缓存和二级缓存,
一级缓存放在session里面,默认就有,二级缓存放在它的命名空间里,默认是打开的,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/>
44.Hibernate缓存一般分类有哪些?缓存的作用分为几类?
(1)一级缓存。Session缓存称为一级缓存。由于Session对象的生命周期通常对应一个数据库事务,因此它的缓存是事务范围的缓存。
一级缓存是必需的,Session默认带有,而且不能卸载。在一级缓存中,持久化类的每个实例都具有唯一的OID。
(2)二级缓存。SessionFactory缓存分为内置缓存和外置缓存。内置缓存是Hibernate自带的,不可拆卸,是只读缓存,用来存放映射元数据和预定义SQL语句。外置缓存是一个可配置的缓存插件,默认SessionFactory不会启用这个缓存插件。外置缓存中的数据是数据库数据的复制。SessionFactory对象的生命周期和应用程序的整个进程对应。二级缓存是可选的,可以在每个类或每个集合的粒度上配置二级缓存。
(3)查询缓存。它是Hibernate为查询结果提供的,依赖于二级缓存。
45.Hibernate缓存的作用分为几类?
(1)事务范围。每个事务都有自己的缓存,缓存内数据不会被多个事务并发访问。例如hibernate的一级缓存,事务是不能跨多个Session的,Session内数据只能被当前事务访问,因此它属于事务范围的缓存。
(2)进程范围。进程内的所有事物共享缓存,进程结束,缓存结束生命周期,例如hibernate的二级缓存,SessionFactory对象的生命周期对应应用程序的整个进程,因此它属于进程范围的缓存。
(3)集群范围。缓存被一个或多个机器上的多个进程共享。Hibernate的二级缓存也可以作为集群范围的缓存。
46.什么是webservice(用你的话描述webservice)?在什么时候用webservice(webservice能给我们解决什么样的问题)?
一句话概括:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
所谓跨编程语言和跨操作平台,就是说服务端程序采用Java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。
所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法。譬如从天气预报系统中获取某个城市的天气数据在自己系统中进行展示;从证券交易系统中获取某只股票的交易信息在自己的系统中进行展示;又譬如一个商城系统中能够展示快递的跟踪信息,而这些信息就是通过webservice从具体的快递公司的系统中获取的数据。
其实可以从多个角度来理解WebService,从表面上看,WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过Web来调用这个应用程序。我们把调用这个WebService的应用程序叫做客户端,而把提供这个WebService的应用程序叫做服务端。从深层次看,WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序如何在Web上实现互操作性,你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。
47.你的系统中是否有使用到webservice开发,具体是怎么实现的?
如果你觉得自己掌握的不够好,对自己不够自信的可以回答为“我的系统中没有使用到webservice的开发,但是我掌握webservice开发的概念和流程”,然后可以给他讲讲相关的概念,这样可以绕过这个问题,因为并不是所有的系统都会涉及到webservice的开发。
另一种回答即是先给他介绍一种webservice开发框架,比如CXF,然后告诉他你做的是服务端开发还是客户端开发,如果你说你做的事服务端开发,那么你就告诉他怎么定义的webservice,使用了哪些注解,怎么跟spring进行的整合,怎么发布的服务等等;如果你告诉他你做的事客户端的开发,那么你可以告诉他你怎么生成的本地代码,然后又怎么通过本地代码去调用的webservice服务。
48.怎么理解UDDI?
UDDI是Universal Description Discovery and Integration的缩写,即统一描述、发现和整合规范。用来注册和查找服务,把web services收集和存储起来,这样当别人访问这些信息的时候就从UDDI中查找,看有没有这个信息存在。
49.Webservice的SEI指什么?
WebService EndPoint Interface(webservice终端[Server端]接口)
就是
50.说说你知道的webservice框架,他们都有什么特点?
Webservice常用框架有JWS、Axis2、XFire以及CXF。
下面分别介绍一个这几种Web Service框架的基本概念
1、JWS是Java语言对WebService服务的一种实现,用来开发和发布服务。而从服务本身的角度来看JWS服务是没有语言界限的。但是Java语言为Java开发者提供便捷发布和调用WebService服务的一种途径。
2、Axis2是Apache下的一个重量级WebService框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者,它能不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。这是它的优势所在。但是,这也不可避免的导致了Axis2的复杂性,使用过的开发者都知道,它所依赖的包数量和大小都是很惊人的,打包部署发布都比较麻烦,不能很好的与现有应用整合为一体。但是如果你要开发Java之外别的语言客户端,Axis2提供的丰富工具将是你不二的选择。
3、XFire是一个高性能的WebService框架,在Java6之前,它的知名度甚至超过了Apache的Axis2,XFire的优点是开发方便,与现有的Web整合很好,可以融为一体,并且开发也很方便。但是对Java之外的语言,没有提供相关的代码工具。XFire后来被Apache收购了,原因是它太优秀了,收购后,随着Java6 JWS的兴起,开源的WebService引擎已经不再被看好,渐渐的都败落了。
4、CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。CXF来自于XFire项目,经过改造后形成的,就像目前的Struts2来自WebWork一样。可以看出XFire的命运会和WebWork的命运一样,最终会淡出人们的视线。CXF不但是一个优秀的Web Services / SOAP / WSDL 引擎,也是一个不错的ESB总线,为SOA的实施提供了一种选择方案,当然他不是最好的,它仅仅实现了SOA架构的一部分。
注:对于Axis2与CXF之间的关系,一个是Axis2出现的时间较早,而CXF的追赶速度快。
如何抉择:
1、如果应用程序需要多语言的支持,Axis2应当是首选了;
2、如果应用程序是遵循 spring哲学路线的话,Apache CXF是一种更好的选择,特别对嵌入式的 Web Services来说;
3、如果应用程序没有新的特性需要的话,就仍是用原来项目所用的框架,比如 Axis1,XFire,Celtrix或BEA 等等厂家自己的Web Services 实现,就别劳民伤财了。
51.WSDL是什么,有什么作用?
WSDL是web service definition language的缩写,即web service的定义(描述)语言。
怎样向别人介绍你的 web service 有什么功能,以及每个函数调用时的参数呢?你可能会自己写一套文档,你甚至可能会口头上告诉需要使用你的web service 的人。这些非正式的方法至少都有一个严重的问题:当程序员坐到电脑前,想要使用你的web service 的时候,他们的工具(如Visual Studio)无法给他们提供任何帮助,因为这些工具根本就不了解你的web service。解决方法是:用机器能阅读的方式提供一个正式的描述文档。web service描述语言 (WSDL)就是这样一个基于 XML的语言,用于描述 web service及其函数、参数和返回值。因为是基于XML 的,所以WSDL 既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的web service 生成WSDL 文档,又能导入WSDL 文档,生成调用相应web service 的代码。
Webservice服务发布之后,通过浏览器访问发布的+?wsdl即可获得wsdl文档。
52.WSDL文档主要有那几部分组成,分别有什么作用?
一个WSDL文档的根元素是definitions元素,WSDL文档包含7个重要的元素:types, import, message, portType, operations, binding和service元素。
1、 definitions元素中一般包括若干个XML命名空间;
2、 Types元素用作一个容器,定义了自定义的特殊数据类型,在声明消息部分(有效负载)的时候,messages定义使用了types元素中定义的数据类型与元素;
3、 Import元素可以让当前的文档使用其他WSDL文档中指定命名空间中的定义;
4、 Message元素描述了Web服务的有效负载。相当于函数调用中的参数和返回值;
5、 PortType元素定义了Web服务的抽象接口,它可以由一个或者多个operation元素,每个operation元素定义了一个RPC样式或者文档样式的Web服务方法;
6、 Operation元素要用一个或者多个messages消息来定义它的输入、输出以及错误;
7、 Binding元素将一个抽象的portType映射到一组具体的协议(SOAP或者HTTP)、消息传递样式(RPC或者document)以及编码样式(literal或者SOAP encoding);
8、 Service元素包含一个或者多个Port元素
每一个Port元素对应一个不同的Web服务,port将一个URL赋予一个特定的binding,通过location实现。
可以使两个或者多个port元素将不同的URL赋给相同的binding。
53.SOAP是什么?
SOAP是simple object access protocal的缩写,即简单对象访问协议。 是基于XML和HTTP的一种通信协议。是webservice所使用的一种传输协议,webservice之所以能够做到跨语言和跨平台,主要是因为XML和HTTP都是独立于语言和平台的。Soap的消息分为请求消息和响应消息,一条SOAP 消息就是一个普通的XML 文档,包含下列元素:
1、 必需的 Envelope 元素,可把此XML 文档标识为一条SOAP 消息
2、 可选的 Header 元素,包含头部信息
3、 必需的 Body 元素,包含所有的调用和响应信息
4、 可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
54. 在 hibernate 开发中,关于 POJO 类对象的状态说法正确的是()。
A.自由状态(Transient):实体在内存中自由存在,与数据库中的记录无关
B.持久状态(Persistent):实体处于由Hibernate框架所管理的状态,对应了数据库中的一条记录,同时与某个session实例发生了关联
C.游离状态(Detached):在session 关闭之后,可以使游离状态处于持久状态的对象。
D.不能将对象从游离状态转换成持久态
答: ABC
55.在Struts框架中如果要使用Validation作验证的话,需要使用以下哪个Form?
A.ActionForm
B.ValidatorActionForm
C.ValidatorForm
D.DynaValidatorActionForm
答: D
56.关于spring说法错误的是()
A.spring是一个轻量级JAVA EE的框架集合
B.spring是“依赖注入”模式的实现
C.使用spring可以实现声明事务
D.spring提供了AOP方式的日志系统
答: D
57.下面有个hibernate延迟加载,说法错误的是?
A.Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
B.Hibernate3 提供了属性的延迟加载功能
C.get支持延迟加载,load不支持延迟加
D.hibernate使用Java反射机制,而不是字节码增强程序来实现透明性
答: C
58.下面有关SPRING的事务传播特性,说法错误的是?
A.PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
B.PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常
C.PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
D.PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚
答: B
59.下列关于Spring特性中IoC描述错误的是:
A.IoC就是指程序之间的关系由程序代码直接操控
B.所谓“控制反转”是指控制权由应用代码转到外部容器,即控制权的转移
C.IoC将控制创建的职责搬进了框架中,从应用代码脱离开来
D.使用Spring的IoC容器时只需指出组件需要的对象,在运行时Spring的IoC容器会根据XML配置数据提供给它
答: A
60.截止JDK1.8版本,java并发框架支持锁包括?
A.读写锁 B.自旋锁 C.X锁 D.乐观锁 E.排他锁
答: ABD
61.下面有关maven和ant的描述,描述错误的是?
A.Ant 没有正式的约定如一个一般项目的目录结构,你必须明确的告诉 Ant 哪里去找源代码
B.Maven 拥有约定,因为你遵循了约定,它已经知道你的源代码在哪里
C.maven和ant都有“生命周期”的概念,当你输入一个命令后,maven或者ant会执行一系列的有序的步骤,直到到达你指定的生命周期
D.Ant构建文件默认命名为build.xml,Maven默认构建文件为pom.xml
答: C
62.下面有关servlet service描述错误的是?
A.不管是post还是get方法提交过来的连接,都会在service中处理
B.doGet/doPost 则是在 javax.servlet.GenericServlet 中实现的
C.service()是在javax.servlet.Servlet接口中定义的
D.service判断请求类型,决定是调用doGet还是doPost方法
答: B
63.下列有关Servlet的生命周期,说法不正确的是?
A.在创建自己的Servlet时候,应该在初始化方法init()方法中创建Servlet实例
B.在Servlet生命周期的服务阶段,执行service()方法,根据用户请求的方法,执行相应的doGet()或是doPost()方法
C.在销毁阶段,执行destroy()方法后会释放Servlet 占用的资源
D.destroy()方法仅执行一次,即在服务器停止且卸载Servlet时执行该方法
答: A
64.下面有关servlet中init,service,destroy方法描述错误的是?
A.init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法
B.service()方法处理客户机发出的所有请求
C.destroy()方法标志servlet生命周期的结束
D.servlet在多线程下使用了同步机制,因此,在并发编程下servlet是线程安全的
答: D
65.下面有关struts1和struts2的区别,描述错误的是?
A.Struts1要求Action类继承一个抽象基类。Struts 2 Action类可以实现一个Action接口
B.Struts1 Action对象为每一个请求产生一个实例。Struts2 Action是单例模式并且必须是线程安全的
C.Struts1 Action 依赖于Servlet API,Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试
D.Struts1 整合了JSTL,Struts2可以使用JSTL,但是也支持OGNL
答: B
66.下面有关jsp中静态include和动态include的区别,说法错误的是?
A.动态INCLUDE:用jsp:include动作实现
B.静态INCLUDE:用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.htm" %>
C.静态include的结果是把其他jsp引入当前jsp,两者合为一体;动态include的结构是两者独立,直到输出时才合并
D.静态include和动态include都可以允许变量同名的冲突.页面设置也可以借用主文件的
答: D
67.git和svn的区别是什么?
答: 1.GIT是分布式的,SVN不是:
2.GIT把内容按元数据方式存储,而SVN是按文件:
3.GIT分支和SVN的分支不同:
4.GIT没有一个全局的版本号,而SVN有:
5.GIT的内容完整性要优于SVN:
68.什么是SVN(Subversion)?为什么要用SVN?
答: 有一个简单但不十分精确比喻:SVN = 版本控制 + 备份服务器
简单的说,您可以把SVN当成您的备份服务器,更好的是,他可以帮您记住每次上传到这个服务器的档案内容。并且自动的赋予每次的变更一个版本。
为什么要用SVN?
1.备份工作档案的重要性。
2.版本控管的重要重要性。
3.伙伴间的数据同步的重要性。
4.如果没有一个好的办法,备份不同版本是很耗费硬盘空间的。
SVN可以让不同的开发者存取同样的档案,并且利用SVN Server作为档案同步的机制。也就是说,您有档案更新时,无须将档案寄给您的开发成员。只需要告诉他新的版本已经在SVN Server上面,请他自己去SVN Server上面就可以取得最新版本。而且,SVN Server也可以做到当您上传新版本后,自动发信给相关的成员。SVN的存放档案方式是采用差异备份的方式。也就是说,他只会备份有不同的地方。所以很省硬盘空间。此外,他也可以针对所谓的非文字文件进行差异备份。
69.Maven有哪些优点和缺点
优点如下:
简化了项目依赖管理:
易于上手,对于新手可能一个”mvn clean package”命令就可能满足他的工作
便于与持续集成工具(jenkins)整合
便于项目升级,无论是项目本身升级还是项目使用的依赖升级。
有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。
maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等
缺点如下:
maven是一个庞大的构建系统,学习难度大
maven采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。
当依赖很多时,m2eclipse 老是搞得Eclipse很卡。
中国的网络环境差,很多repository无法访问,比如google code, jboss 仓库无法访问等。
70.Maven常见的依赖范围有哪些?
1.compile:编译依赖,默认的依赖方式,在编译(编译项目和编译测试用例),运行测试用例,运行(项目实际运行)三个阶段都有效,典型地有spring-core等jar。
2.test:测试依赖,只在编译测试用例和运行测试用例有效,典型地有JUnit。
3.provided:对于编译和测试有效,不会打包进发布包中,典型的例子为servlet-api,一般的web工程运行时都使用容器的servlet-api。
4.runtime:只在运行测试用例和实际运行时有效,典型地是jdbc驱动jar包。
5.system: 不从maven仓库获取该jar,而是通过systemPath指定该jar的路径。
6.import: 用于一个dependencyManagement对另一个
dependencyManagement的继承。