那年我整理的JavaEE面试题

Servlet&jSP

1 Servlet和JSP的区别?

1 Servlet是一个运行在服务器上的Java类,依靠服务器支持向浏览器传输数据
2 JSP本质上是Servlet的一种简易形式,可以简化页面的生成
3 Servlet的应用逻辑在Java文件中,并且完全从HTML分离而来,JSP则是Java和HTML组合成一个扩展名为.jsp文件
4 JSP侧重于视图,而Servlet侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图View,Servlet适合充当控制器Controller

2 简述Servlet生命周期

1 init() 初始化
2 service() 处理客户端请求
3 destroy() 销毁方法

3 如何现实servlet的单线程模式?

<%@ page isThreadSafe="false" %>

4 请求转发(forward)和重定向(redirect)的区别?

1:效率上
转发(forward) > 重定向(redirect)
2:显示上
重定向(redirect):显示新的URL
转发(forward):地址栏不变
3:数据上
转发(forward):可以共享request里面的数据
重定向(redirect):不能
4:请求次数
重定向(redirect)是两次
转发(forward)是一次

5 get请求和post请求的区别?

GET:
1:从服务器上获取数据,一般不能使用在写操作接口
2:由URL所限制,GET方式传输的数据大小有所限制,传送的数据量不超过2KB
3:请求的数据会附加在URL之后,以?分隔URL和传输数据,多个参数用&连接
4:安全性差
POST:
1:向服务器提交数据,一般处理写业务
2:POST方式传送的数据量比较大,一般被默认为没有限制
3:安全性高
4:请的求的数据内容放置在HTML HEADER中

6 JSP的9个内置对象和4个作用域?

(1)9 个内置对象: 
1 request:封装客户端的请求,其中包含来自 GET 或 POST 请求的参数; 
2 application:封装服务器运行环境的对象; 
3 response:封装服务器对客户端的响应;
4 session:封装用户会话的对象; 
5 page:JSP 页面本身(相当于 Java 程序中的 this);
6 config:Web 应用的配置对象; 
7 exception:封装页面抛出异常的对象;
8 pageContext:通过该对象可以获取其他对象;
9 out:用来传送回应的输出; 
(2)4 个域对象 
1 page(当前页面)
2 request(一次请求) 
3 session( 一次会话)
4 application (整个会话)

7 会话跟踪技术有哪些?

1 由于 HTTP 协议本身是无状态的,服务器为了区分不同的用户,就需要对用户会话进行跟踪,简单的说就是 为用户进行登记,为用户分配唯一的 ID,下一次用户在请求中包含此 ID,服务器根据此判断到底是哪一个用户。 
2 URL 重写:在 URL 中添加会话信息作为请求的参数,或者将唯一的会话 ID 添加到 URL 结尾,以表示一个 会话; 
3 设置表单隐藏域:将和会话跟踪相关的字段添加到隐藏域中,这些信息不会在浏览器显示,但是提交表 单时会提交给服务器;
4 cookie:cookie 有两种,一种是基于窗口的,浏览器关闭后,cookie 就没有了;另一种是将信息存储在一 
个临时文件中,并设置其有效路径和最大存活时间。当用户通过浏览器和服务器建立一次会话后,会话ID就会随相应信息储存在基于窗口的 cookie 中,那就意味着只要浏览器没有关闭,会话没有超时,下一次请求时这个会话ID 
又会提交给服务器,让服务器识别用户身份。在使用 cookie 时要注意几点:首先不要在 cookie 中存放敏 感信息;
其次 cookie 存储的数据量有限(4k),不能将过多的内容存储 cookie 中;再者浏览器通常只允许一个站点最多存
放 20 个 cookie。当然,和用户会话相关的其他信息(除了会话 ID)也可以存在 cookie 方便进行会话 跟踪;

5 HttpSession:在所有会话跟踪技术中,HttpSession 对象是最强大也是功能最多的。当一个用户第一次访 问某个
网站时会自动创建 HttpSession,每个用户可以访问他自己的 HttpSession。可以通过 HttpServletRequest对象的
getSession 方法获得 HttpSession,通过 HttpSession 的 setAttribute 方法可以将一个值放在 HttpSession
中,通 过调用 HttpSession 对象的 getAttribute 方法,同时传入属性名就可以获取保存在 HttpSession 中的对
象。与上面三 种方式不同的是,HttpSession 放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的 
Servlet 容器 可以在内存将满时将 HttpSession 中的对象移到其他存储设备中,但是这样势必影响性能。添加到 
HttpSession 中 的值可以是任意 Java 对象,这个对象最好实现了 Serializable 接口,这样 Servlet 容器在必
要的时候可以将其序列 化到文件中,否则在序列化时就会出现异常。 

8 什么是Web Service?

1 WebService 就是一个应用程序,它向外界暴露出一个能够通过 Web 进行调用的 API。 
2 它是基于 HTTP 协议传输数据,这使得运行在不同机上的不同应用程序,无须借助附加的、专门的第三方 软件或硬件,就可以相互交换数据或集成。 

9 request的主要方法?

setAttribute(String name,Object):设置名字为name的request的参数值
getAttribute(String name):返回由name指定的属性值
getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例
getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组
getCharacterEncoding():返回请求中的字符编码方式
getContentLength():返回请求的Body的长度
getHeader(String name):获得HTTP协议定义的文件头信息
getHeaders(String name):返回指定名字的request Header的所有值,结果是一个枚举的实例
getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例
getInputStream():返回请求的输入流,用于获得请求中的数据 getMethod():获得客户端向服务器端传送数据的方法
getParameter(String name):获得客户端传送给服务器端的有name指定的参数值
getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
getParameterValues(String name):获得有name指定的参数的所有值
getProtocol():获取客户端向服务器端传送数据所依据的协议名称
getQueryString():获得查询字符串
getRequestURI():获取发出请求字符串的客户端地址
getRemoteAddr():获取客户端的IP地址
getRemoteHost():获取客户端的名字
getSession([Boolean create]):返回和请求相关
Session getServerName():获取服务器的名字
getServletPath():获取客户端所请求的脚本文件的路径
getServerPort():获取服务器的端口号
removeAttribute(String name):删除请求中的一个属性

10 用户在浏览器中输入URL之后,发什么了什么?写出请求和响应的流程

1:域名解析
2:TCP三次握手
3:浏览器向服务器发送http请求
4:浏览器发送请求头信息
5:服务器处理请求
6:服务器做出应答
7:服务器发送应答头信息
8:服务器发送数据
9:TCP连接关闭

11 Servlet中如何获取用户提交的查询参数或者表单数据

1 HttpServletRequest 的 getParameter()方法。
2 HttpServletRequest 的 getParameterValues()方法。
3 HttpServletRequest 的 getParameterMap()方法。

12 响应结果状态码有哪些,并给出中文含义?

1**:信息性状态码
2**:成功状态码
    200:请求正常成功
    204:指示请求成功但没有返回新信息
    206:指示服务器已完成对资源的部分 GET 请求
3**:重定向状态码
    301:永久性重定向
    302:临时性重定向
    304:服务器端允许请求访问资源,但未满足条件
4**:客户端错误状态码
    400:请求报文中存在语法错误
    401:发送的请求需要有通过HTTP认证的认证信息
    403:对请求资源的访问被服务器拒绝了
    404:服务器上无法找到请求的资源
5**:服务器错误状态码
    500:服务器端在执行请求时发生了错误
    503:服务器暂时处于超负载或正在进行停机维护,现在无法处理请求

13 XML 文档定义有几种形式?它们之间有何本质区别?解析 XML 文档有哪几种方式?

(1)XML 文档有两种约束方式:DTD 约束和 Schema 约束
(2)区别:
	1 DTD 不符合 XML 的语法结构,schema 符合 XML 的语法结构; 
	2 DTD 的约束扩展性比较差,XML 文档只能引入一个 DTD 的文件。schema 可以引入多个文件;
	3 DTD 不支持名称空间(理解包结构),schema 支持名称空间;
	4 DTD 支持数据比较少,schema 支持更多的数据类型; 
(3)解析方式主要有三种: 
	1 DOM 解析: 
		(a)加载整个 xml 的文档到内存中,形成树状结构,生成对象;
		(b)容易产生内存溢出; 
		(c)可以做增删改
	2 SAX 解析 
		(a)边读边解析; 
		(b)不可以做增删改
	3 DOM4J 解析(hibernate 底层采用)
		(a)可让 SAX 解析也产生树状结构。 
		(b)主要 api 开发步骤: 
			1)SAXReader.read(xxx.xml)代表解析 xml 的文档,返回对象是 Document; 
			2)Document.getRootElement(),返回的是文档的根节点,是 Element 对象; 
			3)Element: 
				.element(...)-- 获得指定名称第一个子元素。可以不指定名称; 
				.elements(...)-- 获得指定名称的所有子元素。可以不指定名称; 
				.getText()-- 获得当前元素的文本内容;
				.elementText(...)-- 获得指定名称子元素的文本值 
				.addElement()-- 添加子节点 
				.setText()-- 设置子标签内容 
			4)XMLWriter.write("..")-- 写出
			5)XMLWriter.close()-- 关闭输出流 

Spring

1 简述你对Spring的理解

1 Spring是一款开源轻量级的业务层框架,分模块,一站式,可以整合其他主流框架
2 Spring实质是一个实现了工程模式的工厂类,在其配置文件中通过<bean>来创建实例
3 核心IOC

2 什么是IOC?

1 IOC 控制反转,将原来用new创建对象的方式交给Spring容器创建!解耦的作用
2 IOC 依赖注入的方式三种: 接口注入、构造器注入、Setter注入

3 什么是AOP?

面向切面编程,是指在不改变代码逻辑的情况下,实现功能的增加!
用于处理系统中分布于各个模块的横切关注点,例如事务管理,日志,缓存等等;

4 什么是ORM?

1 对象关系映射(Object-Relation Mapping,简称 ORM)是一种为解决程序的面向对象模型与数据库的关系 模型互不匹配问题的技术;
2 ORM 是通过使用描述对象和数据库之间映射的元数据(在 Java 中可以用 XML 或者注解),将程序中的对 象自动持久化到关系数据库中,或者将关系数据库表中的行转换成 Java 对象,其本质就是将数据从一种形式转换到另一种形式。 

5 Spring 中的 BeanFactory 和 ApplicationContext 有什么联系?

1 Spring 通过配置文件描述 Bean 以及 Bean 之间的依赖关系,利用 Java 的反射机制实现 Bean 的实例化,并 建立 Bean 之间的依赖关系,在此基础上,Spring 的 IoC 容器还提供了 Bean 实例缓存、生命周期管理、Bean 实例 代理、事件发布等高级服务。 
2 BeanFactory 是 Spring 框架最核心的接口,它提供了 IoC 容器的配置机制。
3 ApplicationContext 建立在 BeanFactory 之上,提供了更多面向应用功能,包括国际化和框架事务体系的支持。
4 通常将 BeanFacory 称为 IoC 容器,而 ApplicationContext 称之为应用上下文,前者更倾向于 Spring 本身, 后者更倾向于开发者,因此被使用得更多。 

6 Spring 中 Bean 的作用域有哪些?

1 Spring1x  Singleton表示Bean以单例模式存在和protoType表示多例
2 Spring2x  session (每次 HTTP 请求都会创 建一个新的 Bean)
request(同一个 HttpSession 共享同一个 Bean,不同的 HttpSession 使用不同的 Bean)
globalSession (同一个全局 Session 共享一个 Bean)

7 SpringMVC运行原理是什么?

1.客户端请求提交到DispatcherServlet 
2.由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller 
3.DispatcherServlet将请求提交到Controller 
4.Controller调用业务逻辑处理后,返回ModelAndView 
5.DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图 
6.视图负责将结果显示到客户端 
DispatcherServlet是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分

Hibernate&&Mybatis

1 谈谈您对Hibernate的理解

1 概述:它是一个持久层的 ORM(对象关系型映射)框架,使用 Hibernate 框架,不用写 JDBC 代码,仅仅 是调用一个 save 方法,就可以将对象保存到关系数据库中;仅仅是调用一个 get 方法,就可以从数据库中加载出 一个对象。 
2 使用 Hibernate 的基本流程:配置 Configuration 对象、产生 SessionFactory、创建 session 对象,开启事务, 完成 CRUD 操作,提交事务,关闭 session。
3 配置文件:使用 Hibernate 时,先要配置 hibernate.cfg.xml 文件。其中配置数据连接信息和方言等,还要 为每个实体配置相应的 hbm.xml 文件,然后在 hibernate.cfg.xml 文件中引入;
4 关联关系映射 
(a) 一对多: 
(Ⅰ)一方:需要加入一个包含多方的 set 集合,注意必须要 new。
(Ⅱ)多方:添加一方的 bean 对象,注意不用 new。 
(Ⅲ)注意:只配置一方即可正常维护运行。一般一方会放弃外键维护。 (b)多对多:多对多保存中,有一方必须放弃维护中间表"inverse=ture" 
5 级联关系:cascade 的 6 种取值 
none —— 不使用级联 
save-update —— 保存或修改 
delete —— 删除 
delete-orphan —— 孤儿删除(只有一对多才有!) 
all —— 除了孤儿删除,其他的所有 
all-delte-orphan —— 包含孤儿删除所有的。
6 延迟加载: 
底层:动态代理技术 
第一次查询时 ====> 至查询 ID 值,生成代理对象(只含 ID)
	=====> 继续操作,如打印某属性 ==发送 sql 语句==> 返回查询值
类级别的延迟加载:查询的是某一个对象 
	session.get()不延迟加载 
	session.load()延迟加载 
两者区别 关联级别的延迟加载 
	fetch="select" lazy="true" 延迟加载(默认) 
	fetch="select" lazy="false" 不延迟加载 
	fetch="select" lazy="extra" 极其延迟加载
7 Hibernate 三种检索方式:
	QBC(Query By Criteria) 
	HQL(Hibernate Query Language) 
	SQL(基本不用)
8 缓存:
缓存概念 
	缓存是内存中开辟的一块空间,用来保存数据 实质是:一些集合设计
一级缓存:Session 
	自带的,不能卸载。一定存在的,与 Session 生命周期一样长,自动开启,默认session独享
二级缓存:
	默认没有开启,只提供了相关的策略,需第三方插件,常用 EHCache。 
快照机制(SnapShot) 
	持久态对象,在获取的时候,会保存两份:一份在缓存区,一份在快照区; 
	在事务提交之前,会自动对比缓存区和快照区的数据, 
	如果不一致,会自动修改缓存和快照区数据;

2 Mybatis和Hibernate的区别?

1:hibernate的扩展性和移植性比mybatis强
2:hibernate不需要写sql语句,会自动生成,而mybatis则需要写sql语句
3:hibernate支持事务、一级缓存、二级缓存、查询缓存等
4:hibernate自己提供分页功能,mybatis需要配置分页插件

3 事务的特性?

1 原子性(Atomicity) 指事务是一个不可分割的工作单位,事务中的操作要么全都发生,要么全不发生; 
2 一致性(Consistency) 事务前后数据的完成性必须保持一致;(例:转账前后的,两个人的金额总数是不变的) 
3 隔离性(Isolation) 指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务干扰,多个并发事务之间要项目隔 离; 
4 持久性(Durability) 指一个事务一旦被提交,它对数据库中数据的改变是永久性的,接下来即使数据库发生故障,也不应该对 其有任何影响; 

4 事务并发访问的问题?

1 脏读:一个事务读到了另一个事务未提交的数据; 
2 不可重复读:在同一个事务中,多次查询的结果不一致(由 update 引起的) 
3 虚读/幻读:在同一个事务中,多次查询的结果不一致(由 insert 引起的)

5 隔离的级别?

1 读未提交
	read uncommitted;一个事务读到另一个事务没有提交的数据; 
2 读已提交 —— oracle 默认 
	read committed;一个事务读到另一个事务已提交的数据; (解决脏读) 
3 可重复读  --- mysql 默认 
	repeatable read;在一个事务中读到的数据始终保持一致,无论另一个事务是否提交 (解决脏读和不可重复读) 
4 串行化
	serializable 串行化,同时只能执行一个事务,相当于单线程事务; (都解决)

6 谈一谈你对Mybatis的理解

MyBatis 本是 apache 的一个开源项目 iBatis,2010 年这个项目由 apachesoftwarefoundation 迁移到了 
google code,并且改名为 MyBatis 。2013 年 11 月迁移到 Github。 
MyBatis 是一个优秀的持久层框架,它对使用 jdbc 操作数据库的过程进行封装,使开发者只需要关注 SQL 本 身,
而不需要花费精力去处理例如注册驱动、创建 connection、创建 statement、手动设置参数、结果集检索等 jdbc
繁杂的过程代码。
Mybatis 通过 xml 或注解的方式将要执行的各种 statement(statement、preparedStatemnt、
CallableStatement) 配置起来,并通过 java 对象和 statement 中的 sql 进行映射生成最终执行的 sql 语句,
最后由 mybatis 框架执行 sql 并将结果映射成 java 对象并返回。

1 mybatis 配置文件
	(1)SqlMapConfig.xml,此文件作为 mybatis 的全局配置文件,配置了 mybatis 的运行环境等信息。 
	(2)Mapper.xml,此文件作为 mybatis 的 sql 映射文件,文件中配置了操作数据库的 sql 语句。
	此文件需要 在 SqlMapConfig.xml 中加载。
2 通过 mybatis 环境等配置信息构造 SqlSessionFactory,即会话工厂。 

3 通过会话工厂创建 sqlSession 即会话,程序员通过 sqlsession 会话接口对数据库进行增删改查操作

4 mybatis 底层自定义了 Executor 执行器接口来具体操作数据库,Executor 接口有两个实现,一个是基本执 
行器(默认)、一个是缓存执行器,sqlsession 底层是通过 executor 接口操作数据库的。

5 MappedStatement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。 
mapper.xml 文件中一个 select\insert\update\delete 标签对应一个 MappedStatement 对象, select\insert\update\delete 标签的 id 即 是 Mappedstatement 的 id。
	(1)MappedStatement 对 sql 执行输入参数进行定义,包括 HashMap、基本类型、 pojo, Executor 通过
	Mapped Statement 在执行 sql 前将输入的 java 对象映射至 sql 中,输入参数映射就是 jdbc 编程中对 
	preparedStatement 设置 参数。 
	(2)MappedStatement 对 sql 执行输出结果进行定义,包括 HashMap、基本类型、 pojo, Executor 通过 
	Mapped Statement 在执行 sql 后将输出结果映射至 java 对象中,输出结果映射过程相当于 jdbc 编程中对结
	果的解析处理 过程。	
  • 13
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值