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 编程中对结
果的解析处理 过程。