Java EE平台构建于Java SE平台之上,Java EE平台提供一组API和运行环境来开发和运行大规模的,多层的,可扩展的,可靠的和安全的网络应用程序。这里会不断收集和更新JavaEE基础相关的面试题,目前已收集84题。javascript
Onsubmit:提交
Onblur:失去焦点
Onclick:单击
Onload:加载页面
Onchange:内容改变
onMouseMove:鼠标移动
onMouseOver:鼠标通过
onMouseOut:鼠标移出
onselect:下拉选项被选中复制代码
history.go(0)
location.reload()复制代码
前进html
history.go(1)
history.forward复制代码
后退前端
History.go(-1)
History.back复制代码
Location.href=url
History.go(url)java
Document.getElementById()
Document.getElementsByName()
Document.getElementsByTagName()复制代码
Onsubmit=“return false”web
$:匹配字符串结束的位置
^:匹配字符串开始的位置
*:匹配零次或者屡次
+:匹配至少一次
?:匹配零次或者一次
.:匹配除换行符 \n以外的任何单字符
{n}:n 是一个非负整数,匹配肯定的 n 次
{n,m}:m 和 n 均为非负整数,表示最多和最少匹配次数,其中n <= m
\w:匹配单个字符(a-z,0-9,_)
\W:与\w相反
\d:匹配数字
\D:与\d相反复制代码
DELETE:选择性地删除数据,当删除整张表的数据时效率较低;只能删除整张表的数据,可是效率高于使用DELETE语句;不能选择性地删除。当truncate执行删除以后,自动生成的主键值从新从默认值开始。面试
Java API解析xml主要有两种方式;正则表达式
Dom解析:一次性加载整个文档,生成树形结构。在生成的文档对象中,能够对节点进行增删改查的操做。当xml文本当较小的时候,可使用dom解析。spring
Sax解析:基于事件的解析方式,解析速度比较快,解析的文档大小理论上是没有限制的。sql
还有一些开源的技术能够解析xml,dom4j或者jdom。数据库
表的设计要规范,即要符合数据库设计三范式。
适当创建索引,在频繁做为检索条件,更新较少的字段上创建索引,以提升查询速度。
分表查询,有水平分割、垂直分割。
读写分离,读(read)、写(create、update、delete)。
创建存储过程。复制代码
Json(javascript simple object notation):轻量级的数据交换格式。
使用{}实例化一个json对象,json对象多个元素使用逗号隔开,每一个元素都是一个键值对
使用json-lib、gson、jackson能够解析json对象。须要将json对象转换成一个java对象,使用java对象访问属性。
全部的索引都是为了更快地检索数据,索引存放在索引页中,数据存放在数据页中,索引以B(balance)树的形式存储
汇集索引:汇集索引用于决定数据表中的物理存储顺序,一张表最多有一个汇集索引。汇集索引的字段值尽可能不能修改,由于修改后,由于修改后数据表的物理顺序须要重写排序。一般主键就是汇集索引
非汇集索引:非汇集索引的关键自是index,不会决定表的物理存储顺序,在一张表内最多能够有249个非汇集索引。
能够。可是只能有一个public类,并且public修饰的类名与文件名必须一致
Poi:操做office文档
Jfreechat:生成各类图表
Ckeditor:论坛中的富文本输入框
Lucena:用于搜索技术
Pinyin4j:操做汉字的拼音复制代码
事务:
单个逻辑单元执行的一系列操做,要么所有执行,要么所有不执行。复制代码
特色:
原子性(Atomicity):事务中各元素不可分割,所有执行成功或者撤销全部的操做
一致性(Consistency):事务完成后数据保持一致的状
隔离性(Isolation):事务是相对独立的,对某数据进行修改时,其余事务不变
持久性(Durability):事务完成后对系统的影响是永久性的。复制代码
但一个业务逻辑包括多个数据库操做的时候,并且须要保证每一个数据表操做都执行的成功进行下一个操做,这个时候可使用事务
操做dom,改变dom的结构
指令:<%@ %>
脚本:<% %>
表达式:<%=%>
声明:<%! %>
注释:<% -- %>
动做:<jsp:动做名称 属性=””>
静态内容:html内容复制代码
Page
pageContext
request
response
out
session
application
config
exception复制代码
用于处理JSP文件执行时发生的全部错误和异常,只有在page指令中设置isErrorPage值为true的页面中才能够被使用,在通常的JSP页面中使用该对象,将没法编译JSP文件。
Get请求发送的文本内容大小有限制,而post请求没有限制
Get请求的请求参数会出如今url路径中,而发送post请求时,参数不会显示在url路径中
Get安全系数较低,可是效率较高。Post安全系数较高,但效率较低
Get请求只能发送字符串,post请求能够提交二进制数据复制代码
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
(物理层是最底层,应用层是最高层)复制代码
TCP/IP协议
IPX/SPX协议
NetBEUI协议复制代码
TCP 是面向链接的传输层协议
每一条 TCP 链接只能有两个端点(endpoint),每一条 TCP 链接只能是点对点的(一对一)
TCP 提供可靠交付的服务
TCP 提供全双工通讯
面向字节流复制代码
TCP编程
UDP编程复制代码
TCP协议:传输控制协议,提供可靠无差错的数据传输,效率较低
UDP协议:用户数据报协议,不可靠的数据传输,效率较高复制代码
服务器程序建立一个ServerSocket,而后再用accept方法等待客户来链接
客户端程序建立一个Socket并请求与服务器创建链接
服务器接收客户的链接请求,并建立一个新的Socket与该客户创建专线链接
刚才创建了链接的两个Socket在一个线程上对话
服务器开始等待新的链接请求复制代码
继承Thread类
实现Runnable接口
推荐使用Runnable接口复制代码
Synchronized关键字在方法签名上,能够防止多个线程同时访问这个对象的synchronized修饰的方法。若是一个对象有多个synchronized方法,只要一个线程访问其中的一个同步方法,那么其余线程就不能访问对象其余的任何一个同步方法。不一样对象实例的synchronize方法是互不干扰的,也就是说,其余对象还能够访问这个类中的同步方法。
Synchronized若是修饰的是静态方法,防止多个线程同时访问这个类中的静态同步方法,它对类中全部对象都能起做用。也就是说,只有一个对象一个线程能够访问静态同步方法
Synchronized修饰方法中的某段代码块,只对当前代码块实行互斥访问。当多个线程同步访问同步代码块,同一时间只能有一个线程获得执行,其余线程必须等待当前线程执行完代码块以后才能执行。当一个线程访问同步代码快时,其余线程能够访问非同步的代码。当一个线程访问同步代码块时,那么其余线程访问对其余同步代码块的访问将会被阻塞
Synchronized关键字是不能继承的,若是父类的synchronized在继承时并不自动是synchronized修饰的,须要显示地声明。
Synchronized修饰this时,会获得这个对象的对象锁,当一个线程访问时,那么其余线程访问对象的全部同步代码块或者同步方法,将会被阻塞。
在一个应用程序中初始化一个线程集合,而后在须要执行新的任务时重用线程池中的线程,而不是建立一个新的线程。线程池中的每一个线程都有被分配一个任务,一旦任务完成,线程就回到线程池中,等待下一次的任务分配
游标是sql查询结果集的一个指针,与select语句相关联。
游标关键字是cursor,主要包含两个部分:游标结果集和游标位置。
游标结果集:执行select语句后的查询结果
游标位置:一个指向游标结果集内某条记录的指针。复制代码
游标主要有两个状态:打开和关闭。
只有当游标处于打开状态时,才可以操做结果集中的数据
当游标关闭后,查询结果集就不存在了复制代码
定义游标
打开游标
操做游标数据
关闭游标复制代码
Mulitipart/form-data
_blank:在新的窗口打开网页
_self:在本页面打开新网页
_parent:在父frameset框架打开网页
_top:去掉全部页面框架,使用document.htnl替代frameset文档复制代码
_top
加载:判断servlet实例是否存在,若是不存在,就加载serlvet
实例化:
初始化
服务
销毁复制代码
Init()
Service()
doGet或者doPost
destroy复制代码
新建
就绪
运行
死亡
阻塞复制代码
preparedStatement会预编译sql语句,可以提升批量的数据操做的执行效率,Statement执行slq的时候才进行编译
Preparedstatement在第一次执行sql的时候,比较耗费资源。若是只对数据库进行一次操做,使用statement比较好。
Statement会出现sql注入的问题,使用preparedstatment能够解决sql注入
Session保存在服务端,cookie保存在客户端
Session保存是对象,cookie只能保存字符串
Session不能设置路径,cookie能够设置保存路径。同一个网站不一样网页的cookie能够保存到不通的路机构下,彼此是没法相互访问的。
Session在服务器关闭后会自动消失,cookie则不会。复制代码
存储过程的关键自是procedure,函数关键字是function 函数必须有返回值,存储过程没有返回值,可是有传出参数 函数注重的是结果,存储过程注重的是过程 函数能够在select语句中直接使用,而存储过程则不能复制代码
Session
Cookie
表单隐藏域
url重写复制代码
PageContext
Request
Session
Application复制代码
统一资源定位符
http://localhost:8080/myWeb/index.html:协议+主机地址+端口+项目名称+资源名称复制代码
Tomcat
Jboss
Weblogic
Glassfish复制代码
能够将web项目打包成.war文件
把war文件放在webapps文件夹中复制代码
在tomcat根目录的conf文件夹内打开server.xml文件,修改Connector节点的port属性
请求转发只能将请求转发给同一个Web应用中的其余资源,而重定向不只能够定向到当前应用程序中的其余资源,也能够重定向到其余站点上的资源。
重定向结束后,浏览器地址栏显示URL会发生改变,由初始的URL地址变成重定向的目标URL。而请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
请求转发的发起者和接受者之间共享相同的HttpServletRequest实例和HttpServletResponse实例,而重定向的发起者和接受者使用各自的HttpServletRequest实例和HttpServletResponse实例。
转发是一次请求,重定向是二次请求。转发是在服务器进行的,重定向在客服端进行的。
上传文件主要用的是开源组件,如apache commoms fileupload或者jspformatupload
200:请求成功
400:不是正确的请求,大多状况下表示参数错误
404:找不到请求资源
500:服务器内部错误
403:服务器拒绝
405:请求的method不支持
504:服务器临时不可用复制代码
Include
Taglib
Page复制代码
Session.invalidate()
使用jstl标签库,使用numberformat或者dateformat标签
线程同步:同时只有一条线程执行一个任务
线程异步:同时有多条线程能够执行执行任务复制代码
同步任务:当前任务没有完成以前,其余任务不可以执行
异步任务:当前任务没有完成,任然能够能够发送一个新的请求复制代码
过滤器:在请求发送以后,处理以前对请求的一次拦截,能够更改请求状态或者参数值等。
建立过滤器:实现filter接口,重写doFilter方法,最后在web.xml中配置过滤器
Integer是int的包装类型。
Int的默认值是0,integer的默认值是null复制代码
使用junit
Select top 3 * from tb_name where id not in (select top 3 id from tb_name)
ava Web开发中的监听器(listener)就是application、session、request三个对象建立、销毁或者往其中添加修改删除属性时自动执行代码的功能组件,以下所示:
ServletContextListener:对Servlet上下文的建立和销毁进行监听。
ServletContextAttributeListener:监听Servlet上下文属性的添加、删除和替换。
HttpSessionListener:对Session的建立和销毁进行监听。复制代码
静态包含是经过JSP的include指令包含页面,动态包含是经过JSP标准动做
静态包含是编译时包含,若是包含的页面不存在则会产生编译错误,并且两个页面的"contentType"属性应保持一致,由于两个页面会合二为一,只产生一个class文件,所以被包含页面发生的变更再包含它的页面更新前不会获得更新。
动态包含是运行时包含,能够向被包含的页面传递参数,包含页面和被包含页面是独立的,会编译出两个class文件,若是被包含的页面不存在,不会产生编译错误,也不影响页面其余部分的执行。
能够经过请求对象(HttpServletRequest)的getParameter()方法经过参数名得到参数值。若是有包含多个值的参数(例如复选框),能够经过请求对象的getParameterValues()方法得到。固然也能够经过请求对象的getParameterMap()得到一个参数名和参数值的映射(Map)。
经过请求对象(ServletRequest)的setCharacterEncoding(String)方法能够设置请求的编码,其实要完全解决乱码问题就应该让页面、服务器、请求和响应、Java程序都使用统一的编码,最好的选择固然是UTF-8;经过响应对象(ServletResponse)的setContentType(String)方法能够设置响应内容的类型,固然也能够经过HttpServletResponsed对象的setHeader(String, String)方法来设置。
从表面上看,Web Service就是一个应用程序,它向外界暴露出一个可以经过Web进行调用的API。这就是说,你可以用编程的方法透明的调用这个应用程序,不须要了解它的任何细节,跟你使用的编程语言也没有关系。例如能够建立一个提供天气预报的Web Service,那么不管你用哪一种编程语言开发的应用均可以经过调用它的API并传入城市信息来得到该城市的天气预报。之因此称之为Web Service,是由于它基于HTTP协议传输数据,这使得运行在不一样机器上的不一样应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。
对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术
SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,能够被多个线程并发访问。SessionFactory通常只会在启动的时候构建。对于应用程序,最好将SessionFactory经过单例模式进行封装以便于访问。Session是一个轻量级非线程安全的对象(线程间不能共享session),它表示与数据库进行交互的一个工做单元。Session是由SessionFactory建立的,在任务完成以后它会被关闭。Session是持久层服务对外提供的主要接口。Session会延迟获取数据库链接(也就是在须要的时候才会获取)。为了不建立太多的session,可使用ThreadLocal将session和当前线程绑定在一块儿,这样可让同一个线程得到的老是同一个session。Hibernate 3中SessionFactory的getCurrentSession()方法就能够作到。
若是没有找到符合条件的记录,get方法返回null,load方法抛出异常。
get方法直接返回实体类对象,load方法返回实体类对象的代理。
在Hibernate 3以前,get方法只在一级缓存中进行数据查找,若是没有找到对应的数据则越过二级缓存,直接发出SQL语句完成数据读取;load方法则能够从二级缓存中获取数据;从Hibernate 3开始,get方法再也不是对二级缓存只写不读,它也是能够访问二级缓存的。
瞬时态(transient)
持久态(persistent)
游离态(detached)复制代码
瞬时态的实例能够经过调用save()、persist()或者saveOrUpdate()方法变成持久态;游离态的实例能够经过调用 update()、saveOrUpdate()、lock()或者replicate()变成持久态。save()和persist()将会引起SQL的INSERT语句,而update()或merge()会引起UPDATE语句。save()和update()的区别在于一个是将瞬时态对象变成持久态,一个是将游离态对象变为持久态。merge()方法能够完成save()和update()方法的功能,它的意图是将新的状态合并到已有的持久化对象上或建立新的持久化对象。
对于persist()方法,
persist()方法把一个瞬时态的实例持久化,可是并不保证标识符被马上填入到持久化实例中,标识符的填入可能被推迟到flush的时间;
persist()方法保证当它在一个事务外部被调用的时候并不触发一个INSERT语句,当须要封装一个长会话流程的时候,persist()方法是颇有必要的;
save()方法不保证第②条,它要返回标识符,因此它会当即执行INSERT语句,无论是在事务内部仍是外部。至于lock()方法和update()方法的区别,update()方法是把一个已经更改过的脱管状态的对象变成持久状态;lock()方法是把一个没有更改过的脱管状态的对象变成持久状态。
Session在调用数据库查询功能以前,首先会在一级缓存中经过实体类型和主键进行查找,若是一级缓存查找命中且数据状态合法,则直接返回;
若是一级缓存没有命中,接下来Session会在当前NonExists记录(至关于一个查询黑名单,若是出现重复的无效查询能够迅速作出判断,从而提高性能)中进行查找,若是NonExists中存在一样的查询条件,则返回null;
若是一级缓存查询失败则查询二级缓存,若是二级缓存命中则直接返回;
若是以前的查询都未命中,则发出SQL语句,若是查询未发现对应记录则将这次查询添加到Session的NonExists中加以记录,并返回null;
根据映射配置和SQL语句获得ResultSet,并建立对应的实体对象;
将对象归入Session(一级缓存)的管理;
若是有对应的拦截器,则执行拦截器的onLoad方法;
若是开启并设置了要使用二级缓存,则将数据对象归入二级缓存;
返回数据对象。
list()方法没法利用一级缓存和二级缓存(对缓存只写不读),它只能在开启查询缓存的前提下使用查询缓存;iterate()方法能够充分利用缓存,若是目标数据只读或者读取频繁,使用iterate()方法能够减小性能开销。
list()方法不会引发N+1查询问题,而iterate()方法可能引发N+1查询问题
延迟加载就是并非在读取的时候就把数据加载进来,而是等到使用时再加载。Hibernate使用了虚拟代理机制实现延迟加载,咱们使用Session的load()方法加载数据或者一对多关联映射在使用延迟加载的状况下从一的一方加载多的一方,获得的都是虚拟代理,简单的说返回给用户的并非实体自己,而是实体对象的代理。代理对象在用户调用getter方法时才会去数据库加载数据。但加载数据就须要数据库链接。而当咱们把会话关闭时,数据库链接就同时关闭了。
延迟加载与session关闭的矛盾通常能够这样处理:
关闭延迟加载特性。这种方式操做起来比较简单,由于Hibernate的延迟加载特性是能够经过映射文件或者注解进行配置的,但这种解决方案存在明显的缺陷。首先,出现"no session or session was closed"一般说明系统中已经存在主外键关联,若是去掉延迟加载的话,每次查询的开销都会变得很大。
在session关闭以前先获取须要查询的数据,可使用工具方法Hibernate.isInitialized()判断对象是否被加载,若是没有被加载则可使用Hibernate.initialize()方法加载对象。
使用拦截器或过滤器延长Session的生命周期直到视图得到数据。Spring整合Hibernate提供的OpenSessionInViewFilter和OpenSessionInViewInterceptor就是这种作法。
制定合理的缓存策略(二级缓存、查询缓存)。
采用合理的Session管理机制。
尽可能使用延迟加载特性。
设定合理的批处理参数。
若是能够,选用UUID做为主键生成器。
若是能够,选用乐观锁替代悲观锁。
在开发过程当中, 开启hibernate.show_sql选项查看生成的SQL,从而了解底层的情况;开发完成后关闭此选项。
考虑数据库自己的优化,合理的索引、恰当的数据分区策略等都会对持久层的性能带来可观的提高,但这些须要专业的DBA(数据库管理员)提供支持。复制代码
Hibernate的Session提供了一级缓存的功能,默认老是有效的,当应用程序保存持久化实体、修改持久化实体时,Session并不会当即把这种改变提交到数据库,而是缓存在当前的Session中,除非显示调用了Session的flush()方法或经过close()方法关闭Session。经过一级缓存,能够减小程序与数据库的交互,从而提升数据库访问性能。
SessionFactory级别的二级缓存是全局性的,全部的Session能够共享这个二级缓存。不过二级缓存默认是关闭的,须要显示开启并指定须要使用哪一种二级缓存实现类(可使用第三方提供的实现)。一旦开启了二级缓存并设置了须要使用二级缓存的实体类,SessionFactory就会缓存访问过的该实体类的每一个对象,除非缓存的数据超出了指定的缓存空间。
一级缓存和二级缓存都是对整个实体进行缓存,不会缓存普通属性,若是但愿对普通属性进行缓存,可使用查询缓存。查询缓存是将HQL或SQL语句以及它们的查询结果做为键值对进行缓存,对于一样的查询能够直接从缓存中获取数据。查询缓存默认也是关闭的,须要显示开启。
#将传入的数据都当成一个字符串,会对传入的数据自动加上引号;$将传入的数据直接显示生成在SQL中。注意:使用$占位符可能会致使SQL注射攻击,能用#的地方就不要使用$,写order by子句的时候应该用$而不是#。、
IoC叫控制反转,是Inversion of Control的缩写,DI(Dependency Injection)叫依赖注入,是对IoC更简单的诠释。控制反转是把传统上由程序代码直接操控的对象的调用权交给容器,经过容器来实现对象组件的装配和管理。所谓的"控制反转"就是对组件对象控制权的转移,从程序代码自己转移到了外部容器,由容器来建立对象并管理对象之间的依赖关系。依赖注入的基本原则是应用组件不该该负责查找资源或者其余依赖的协做对象。配置对象的工做应该由容器负责,查找资源的逻辑应该从应用组件的代码中抽取出来,交给容器来完成。DI是对IoC更准确的描述,即组件之间的依赖关系由容器在运行期决定,形象的来讲,即由容器动态的将某种依赖关系注入到组件之中。
依赖注入能够经过setter方法注入(设值注入)、构造器注入和接口注入三种方式来实现,Spring支持setter注入和构造器注入,一般使用构造器注入来注入必须的依赖关系,对于可选的依赖关系,则setter注入是更好的选择,setter注入须要类提供无参构造器或者无参的静态工厂方法来建立对象。
no:不进行自动装配,手动设置Bean的依赖关系。
byName:根据Bean的名字进行自动装配。
byType:根据Bean的类型进行自动装配。
constructor:相似于byType,不过是应用于构造器的参数,若是正好有一个Bean与构造器的参数类型相同则能够自动装配,不然会致使错误。
autodetect:若是有默认的构造器,则经过constructor的方式进行自动装配,不然使用byType的方式进行自动装配。复制代码
AOP(Aspect-Oriented Programming)指一种程序设计范型,该范型以一种称为切面(aspect)的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点(crosscutting concern)。
Singleton:Bean以单例的方式存在
Prototype:表示每次从容器中调用Bean时,都会返回一个新的实例,prototype一般翻译为原型
Request:每次HTTP请求都会建立一个新的Bean
Session:同一个HttpSession共享同一个Bean,不一样的HttpSession使用不一样的Bean
globalSession:同一个全局Session共享一个Bean复制代码
首先须要在Spring配置文件中增长配置:
用@Component、@Controller、@Service、@Repository注解来标注须要由Spring IoC容器进行对象托管的类。
@Controller一般用于控制器
@Service一般用于业务逻辑类
@Repository一般用于DAO类
普通的类用@Component来标注。复制代码
Spring支持编程式事务管理和声明式事务管理。声明式事务管理要优于编程式事务管理,尽管在灵活性方面它弱于编程式事务管理,由于编程式事务容许经过代码控制业务。
客户端的全部请求都交给前端控制器DispatcherServlet来处理,它会负责调用系统的其余模块来真正处理用户的请求。
DispatcherServlet收到请求后,将根据请求的信息(包括URL、HTTP协议方法、请求头、请求参数、Cookie等)以及HandlerMapping的配置找处处理该请求的Handler(任何一个对象均可以做为请求的Handler)。
在这个地方Spring会经过HandlerAdapter对该处理器进行封装。
HandlerAdapter是一个适配器,它用统一的接口对各类Handler中的方法进行调用。
Handler完成对用户请求的处理后,会返回一个ModelAndView对象给DispatcherServlet,ModelAndView顾名思义,包含了数据模型以及相应的视图的信息。
ModelAndView的视图是逻辑视图,DispatcherServlet还要借助ViewResolver完成从逻辑视图到真实视图对象的解析工做。
当获得真正的视图对象后,DispatcherServlet会利用视图对象对模型数据进行渲染。
客户端获得响应,多是一个普通的HTML页面,也能够是XML或JSON字符串,还能够是一张图片或者一个PDF文件。
Spring IoC容器找到关于Bean的定义并实例化该Bean。
pring IoC容器对Bean进行依赖注入。
若是Bean实现了BeanNameAware接口,则将该Bean的id传给setBeanName方法。
若是Bean实现了BeanFactoryAware接口,则将BeanFactory对象传给setBeanFactory方法。
若是Bean实现了BeanPostProcessor接口,则调用其postProcessBeforeInitialization方法。
若是Bean实现了InitializingBean接口,则调用其afterPropertySet方法。
若是有和Bean关联的BeanPostProcessors对象,则这些对象的postProcessAfterInitialization方法被调用。
当销毁Bean实例时,若是Bean实现了DisposableBean接口,则调用其destroy方法。复制代码