面试题

面试锦集
1.变量
定义了一个局部变量b,在条件分支里面也赋值了,为什么使用时不能直接输出?
检查是否为作用域问题
局部变量又可分为动态局部变量(没特殊声明的变量一般都为动态局部变量)和静态局部变量(用static关键字声明的变量如:static int a;)。
  两者的区别在于:静态的局部变量生存期比动态的局部变量来的长,动态的局部变量的生存期为所定义的范围内,如在函数内定义的,函数结束,变量也跟着结束,变量的值不会保存下来。
  而静态变量的生存期为整个源程序(也可说是一个文件,不同环境不同称呼)。而两者的作用域是一样。只能在定义他的函数内起作用,离开了这个函数就不起作用了。
  全局变量:在函数之外定义的变量称为全局变量。全局变量可以为本文件中其他函所共用(作用域),它的有效范围(生存期)从定义变量开始到文件结束。
  如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即全局变量不起作用。
2.数据类型的强转转换
byte b3=byte b2+ byte b1这类题目时到底怎么强转?
byte类型数据参与运算时会自动转换为int类型,想要再赋值给byte类型,只需把运算结果强转为byte类型即可。

3.变量作用域
数组定义在do代码块中,为什么while里面进行判断时不能使用?
作用域不同,定义在do代码块中的数组,在代码块执行完毕后就弹栈等待GC回收,不能在while中使用,若要使用需重新声明数组。

4.对于用static修饰的方法,块,变量,什么时候加载
对象初始化时加载,加载顺序:父类静态成员变量,父类静态代码块,子类静态成员变量,子类静态代码块,父类非静态成员变量,父类非静态代码块,父类构造函数,子类非静态成员变量,子类非静态代码块,子类构造函数
5.面向对象的特征有哪些方面
1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3.封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4. 多态性:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
6.String是最基本的数据类型吗?基本数据类型有哪些?
基本数据类型包括byte、int、char、long、float、double、boolean和short。
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类
7.int 和 Integer 有什么区别
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型封装类
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。

8.在java中,都是通过引用来操纵对象的,这也是两者的区别。
对象和引用的区别:
1、关联性:
1). 当对象的引用变量指向对象时,两者就互相联系起来,改变引用的属性,就会改变对象的属性;
2). 如果同一个对象被多个引用变量引用的话,则这些引用变量将共同影响这个对象本身;
3). 在java中,都是通过引用来操纵对象的。
2、差异性:
1). 一个对象可以被不同的引用变量来操纵,同时一个引用变量也可以指向不同的对象,但是同一时刻下只能指向一个对象。
2). 从存储空间上来看,对象和引用也是相互独立的,对象一般存储在堆中,而引用存储在堆栈中(存储速度而更快)。

9.重载与重写的区别
重载与重写的具体区别如何?分别在什么情景下使用?
重写与重载的区别:
1)重写(Override):
1.1)发生在父子类中,方法名称相同,参数列表相同,方法体不同
1.2)遵循"运行期"绑定,看对象的类型来调用方法
2)重载(Overload):
2.1)发生在一个类中,方法名称相同,参数列表不同,方法体不同
2.2)遵循"编译期"绑定,看参数/引用的类型来绑定方法
向上造型之后点出来什么跟谁有关?
1)超类型的引用指向派生类的对象
2)能点出来什么,看引用的类型
两个对象不同,方法一样,结果不一样,参数不同,叫多态,
使用前提:
1.继承关系
2.方法重写
3.向上转型 将子类对象转换为父类对象,父类将调用子类重写后的方法
pet pet=new dog();
将一个父类的引用指向一个子类对象时,称为向上转型,自动进行类型转换
用于调用子类特有的方法,可以将父类强制转换为子类,再调用子类的特有方法
将一个指向子类对象的父类引用赋值给一个类的引用,即父类类型转换为子类型,称为向下转型

10.谈谈final, finally, finalize的区别
答:final?修饰符(关键字)如果一个类被声明为final,
意味着它不能再派生出新的子类,不能作为父类被继承。
因此一个类不能既被声明为 abstract的,
又被声明为final的。将变量或方法声明为final,
可以保证它们在使用中不被
改变。
被声明为final的变量必须在声明时给定初值,
而在以后的引用中只能读取,不可修改。
被声明为final的方法也
同样只能使用,不能重载 (也不能被重写)
finally?再异常处理时提供 finally 块
来执行任何清除操作。如果抛出一个异常,
那么相匹配的 catch 子句就会执行,然
后控制就会进入 finally 块(如果有的话)
finalize?方法名。
Java 技术允许使用 finalize() 方法在
垃圾收集器将对象从内存中清除出去
之前做必要的清理工作。这
个方法是由垃圾收集器在确定这个对象
没有被引用时对这个对象调用的。
它是在 Object 类中定义的,因此所有的类都
继承了它。
子类覆盖 finalize() 方法以整理系统资源或者
执行其他清理工作。
finalize() 方法是在垃圾收集器删除对象
之前对这个对象调用的

11.StringBuilder和StringBuffer的区别有哪些?
StringBuilder:线程非安全的
StringBuffer:线程安全的
    当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。

12.正则表达式的使用场景如何?
总体来说,正则表达式有三类主要应用:
(1)测试字符串的某个模式。例如,可以输入一个字符串进行测试看该字符串中是否存在一个电话号码模式或者一个信用卡模式,这成为数据的有效性检验。
(2)替换文本。可以再文档中使用一个正则表达式来表示特定文字,然后可以将其全部删除或者替换成别的文字。
(3)根据模式匹配从字符串中提取一个子字符串。可以用来在文本或者输入字段中查找特定的文字。

13.包装类的具体作用是什么?自动拆装箱的原理是什么?
自动拆装箱是JDK1.5的新特性,这一特性使得基本类型与对应的包装器类型(引用类型)之间能够直接进行互相转换,例如将int类型与Integer类型,我们可以将int类型当做Integer类型来使用。
自动拆装箱定义:能够使基本类型与其对应的包装器类型之间自动相互转换。
自动拆装箱不是虚拟机完成的,这个过程实际上是由编译器完成的,当编译器对 .java 源代码进行编译时,如果发现你没有进行拆箱,那么编译器来来帮你拆;如果你没有装箱,那么编译器来帮你装,而不是由虚拟机完成的
14.RundomAccessFile中的read()方法案回执为什么以int形式返回而不是byte?
如果返回byte, 无法表示流末尾.
byte的取值范围是从-128到127
这个范围内所有的数据, 都有可能在数据中出现
read()方法需要返回一个特殊的值来表示流末尾, 这个值不能和流中的数据重复
read()方法内部将读取到的所有字节高位补0转为int返回, 这样做所有的数据都会是正数
这时就可以用-1表示流末尾了
而改变后的数据只要强转回byte, 就可以得到原有数据
15.异常
如果try块中有return ,finally会不会执行,如果执行是return之前执行,还是之后?
会执行的,在return前,就是执行到return的时候等待finally执行,执行完成之后再return,如果finally中有return,那么不再执行try里面的return

16.线程阻塞原理是怎样的?
阻塞的错误定义:
某一个时刻必须只能有一个线程在运行(因为共享cpu),所以一个线程运行,另一个线程就必须阻塞。这是不对的,因为本就应该如此,这不是阻塞,这是正常的切换。
阻塞的正确定义:
当发生如下情况下,线程将会进入阻塞状态:
1.线程调用sleep方法主动放弃所占用的处理器资源。
2.线程调用了一个阻塞式IO方法,在该方法返回之前,该线程被阻塞。
3.线程试图获得一个同步监视器,但该同步监视器正被其他线程锁持有。关于同步监视器的知识将在后面有更深入的介绍。
4.线程在等待某个通知(notify)。
5.程序调用了线程的suspend方法将该线程挂起。不过这个方法容易导致死锁,所以程序应该尽量避免使用该方法。
  当前正在执行的线程被阻塞之后,其他线程就可以获得执行的机会了。被阻塞的线程会在合适时候重新进入就绪状态,注意是就绪状态而不是运行状态。也就是
说被阻塞线程的阻塞解除后,必须重新等待线程调度器再次调度它
17线程的生命周期如何?
  当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运
行(Running)、阻塞(Blocked)和死亡(Dead)五种状态。尤其是当线程启动以后,它不能一直“霸占”着CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。

18.List、Set与Map的区别?
List:1.可以允许重复的对象
2.可以插入多个null元素。
3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
4.常用的实现类有ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。

Set:1.不允许重复对象
2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator  或者 Comparable 维护了一个排序顺序。
3.只允许一个 null 元素
4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。

1.Map不是collection的子接口或者实现类。Map是一个接口。
2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
3.TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
4.Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)

19.HashMap和HashSet都有散列算法,HashSet是不是HashMap的一部分?

HashSet是单列,HashMap是键值对(双列)。
HashSet值不能重复,HashMap键不能重复(相当于索引),值可以重复。
HashSet添加元素用add方法,HashMap用put方法。
HashSet加入重复的元素会报错,而HashMap加入重复的key会更新 value,若不同的key的 hashCode相同,则在同一个桶(bucket)形成一 条链,最后添加的元素在链头。
HashSet实现了Collection接口,HashMap没有

20.DOM解析与SAX解析有什么区别?为什么不用SAX解析?
DOM解析方式:DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)
优点:把XML文件在内存中构建属性结构,可以遍历和修改节点。
缺点:如果文件比较大,内存有压力,解析的时间会比较长。
适用:修改XML数据

SAX解析方式:逐行扫描文档,一遍扫描一遍解析。相比于DOM,SAX可以在解析文档的任意时刻停止解析解析,是一种速度更快,更高效的方法。
优点:解析可以立即开始,速度快,没有内存压力
缺点:不能对结点做修改
适用:读取XML文件
21.浏览器和服务器的交互过程是怎样的?
1. 浏览器查询本地的hosts文件看是否有与所输入主机名相匹配的ip地址,如果有则根据ip连接上web服务器;如果没有则访问DNS服务器获得与主机名对应的ip然后跟据ip连接上web服务器
2. 向服务器发送HTTP请求
3. Web服务器从请求中检索出浏览器想访问的主机名
4. Web服务器从请求中检索出浏览器想访问的web应用
5. Web服务器从请求中检索出浏览器想访问的web资源
6. Web服务器读取web资源的数据
7. Web服务器回送http相应
8. 浏览器从响应中解析出数据,显示给用户

22.URL与URI有什么区别?
URI是唯一标识,但是不一定能找到,不是定位资源,是标识资源,
URL是唯一标识,但同时还能找到,可以定位资源。
URL是URI的子集
23.各个选择器的使用场景如何?

  1. 标签名选择器
    应用场景:当需要对页面中所有的某一种标签设置相同效果的时候

  2. id选择器
    通过标签的id属性找到对应的标签
    应用场景:当需要对页面中的某一个元素设置样式的时候使用

  3. 类选择器
    通过标签的class属性找到对应的标签
    应用场景:当需要对页面中的多个元素设置样式的时候使用

  4. 属性选择器
    通过标签内部指定属性查找对应的标签
    应用场景:当需要对页面中的多个相同元素中的一个设置样式,又没有id、class属性时使用。

  5. 派生选择器(后代选择器)
    通过多个标签之间的上下级关系查找子元素和孙子元素和。。。。所有后代元素
    应用场景:当需要对页面中某个元素的子元素与孙子元素设置样式时使用。

  6. 子元素选择器
    通过多个标签之间的上下级关系查找子元素。
    应用场景:当需要对页面中某个元素的子元素设置样式时使用。

  7. 分组选择器
    分组选择器可以把多种选择器通过逗号连接到一起,给多个选择器设置相同的样式
    应用场景:当需要对多个元素设置相同的样式时使用。

  8. 伪类选择器
    用于选择元素的状态

  9. visited:访问过的状态

  10. link:未点击状态

  11. hover:鼠标悬停状态

  12. active:鼠标点击时的状态
    应用场景:设置超链接元素的各种状态时使用。

  13. 任意元素选择器
    应用场景:如果需要给页面中所有的元素设置相同的样式可以使用此选择器。
    【问题描述2】css行高设置为0为什么会出界?
    通常 line-height 大于 font-size,这样,就会在字体上方和下方加上半个行间距,在这里,行间距就是 2px,字体的上方和下方各有 1px,行间距=(line-height) - (font-size)
    【问题描述3】学员对派生选择器的子选择器样式没有理解。
    子元素选择器
    通过多个标签之间的上下级关系查找子元素。

     基础选择器>基础选择器>基础选择器{
     	样式名称:值;
     	样式名称:值;
     }
    

24.存储过程和函数的区别:
从参数的返回情况来看:
如果返回多个参数值最好使用存储过程,
如果只有一个返回值的话可以使用函数。
从调用情况来看:
如果在SQL语句(DML或SELECT)中调用的话
一定是存储函数或存储的封装函数不可以是存储过程,
但调用存储函数的时候还有好多限制以及函数的纯度
等级的问题,如果是在过程化语句中调用的话,
就要看你要实现什么样的功能。
函数一般情况下是用来计算并返回一个计算结果
而存储过程一般是用
来完成特定的数据操作(比如修改、插入数据库表或执行某些DDL语句等等),
所以虽然他们的语法
上很相似但用户在使用他们的时候所需要完成的功能大部分情况下是不同的。

25.对触发器的认识:
触发器是表上的程序,主要提供数据添加、修改与删除后的程序处理方法,
可以用来检查数据及进行数据更新,也可以分担一些前端应用程序撰写的
逻辑规则。
场景:触发器可以查询其他表,而且可以包含复杂的SQL语句,它们
主要用于强制复杂的业务规则或要求。
主要应用场合:
1.当向一张表中添加或删除记录时,需要在相关表中进行同步操作。
2.当表上某行数据的值与其他表中的数据有联系时。
3.当需要对某张表进行跟踪时。

26.写出一个存储过程,这个存储过程的作用是修改特定id编号的记录
将该记录的salary字段的值加上500:
create or replace procedure update_sal(vid in number)
is
begin
update table1 set salary=salary+500 where id=vid;
end;
27.Servlet中的核心类有那些,各有什么特点?
ServletContext:容器,放置全局变量
setAtribute()
getAttribute()
ServletConfig:一个servlet的配置
getInitParameter(”名称”)
HttpServletRequest:封装的所有的请求
getParameterValue(”名称”)
getParameterValues(”称”)
getSession();
getAttribute(” 名称”);
getRequestDispatch(”a.jsp”).forward(request,response)
HttpServletResponse:响应
getOut();
sendRedirect(””)
HttpSession:一个用户多个页面共享同一变量
setAttribute(””,””)
28.说出Servlet的生命周期,并说出Servlet和CGI的区别?
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

与cgi的区别在于servlet处理服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

29.Request对象的主要方法:
setAttribute(String name,Object):设置名字为name的request的参数值
getAttribute(String name):返回由name指定的属性值
getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例
getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组
getCharacterEncoding():返回请求中的字符编码方式
getContentLength():返回请求的Body的长度
实例
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):删除请求中的一个属性

30.Servlet执行时一般实现哪几个方法?
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse response)
public void destroy()

31.jsp有哪些内置对象,作用分别是什么?(至少三个)
1.request表示HttpServletRequest对象,它包含了有关浏览器请求的
信息,提供了几个获取cookie,header和session数据的有用的方法。
2.response表示HttpServletResponse对象,提供了几个用于设置送回
浏览器响应的方法(cookie,消息头等).
3.out:javax.jsp.JspWriter的一个实例,提供了几个方法,用于向浏览器
回送输出结果。
4.pageContext:javax.servlet.jsp.PageContext的一个对象,用于方便
存取各种范围的名字空间,servlet相关的对象的API,并包装了通用的
servlet相关功能的方法。
5.session:javax.servlet.http.HttpSession的一个请求对象,可存储用户的
状态信息。
6.application:javax.servlet.ServletContext的一个对象,有助于查找
有关servlet引擎和servlet环境的信息。
7.config:javax.servlet.ServletConfig的一个对象,用于存取servlet实现
的初始化参数.
8.page表示从该页面生成一个servlet实例。
9.exception针对错误页面,来捕捉的例外。
32.session,request的联系和区别:
request对象和session对象最大的区别是生命周期:
requset对象生命周期是针对一个客户的一次请求,当请求完毕之后,request
里边的内容也将被释放掉。
session的生命周期也是针对一个客户端,但是却是在别人设置的会话周期内(
一般是20-30分钟)session里边的内容将一直存在,即便关闭了这个客户端
浏览器session也不一定会马上释放掉的。
其优缺点也很明显:
request占用资源比较少,安全性也比较高,可是相对来说,缺乏持续性。
session相对来说对资源的消耗会大点,安全性相对来说会稍微低点,可它
能实现比如会话跟踪技术。
如果可以使用request,尽量使用request,因为对服务器来说,资源的消耗问题
还是比较重要的。
在传递页面过程中request传递到下一个页面就不能再传递了,每按一个网页上
的链接就是一个新的request,当服务器返回给浏览器一个response时,request
就结束了,此时保存在request中的对象就不存在了。
但是当你用一个浏览器连到服务器上时,aplication-server会新开一个session
给你,当链接超时时或浏览器关闭时session才销毁,所以说作用的范围是不一样。
session也就可以跟踪用户的状态,session相对于是一个客户端的全局变量,不如
A机与服务器第一次访问时设置session.setAttribute(“aaa”)=“ComputerA”,则在A机
访问继续访问的任意一个页面都可以取得session.getAttribute(“aaa”)的值是ComputerA.
request是某一次访问的局域变量:生命周期是一次请求。
因此login的变量应该放在session中。

33.转发(forward)和重定向(redirect)的区别:
转发:
1.一次请求,地址不变,
2.一次请求服务器,只创建一个request,2个组件可以通过requst共享数据,
3.只能转发到同项目内部的组件
重定向:
1.两次请求,地址改变
2.两次请求服务器会创建两个request,两个组件无法通过它共享数据
3.可以重定向到项目外部的组件
重定向本质是服务器向浏览器发出特殊响应,本次响应包含一个特殊的状码302,还有要访问的目标。
34.get和post的区别:
Form中的get和post方法,在数据传输过程中分别对应了Http协议中的get和post方法。
区别:
1.get是用来从服务器上获得数据,而post是用来向服务器上传数据。
2.get将表单中数据按照variable=value的形式,添加到action所指向的URL后面,
并且两者使用“?“连接,而各个变量之间使用"&"连接
post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,
传递到action所指向的URL.
3.get是不安全的,因为传输过程,数据被放在请求的URL中;
post的所有操作对用户来说是不可见的.
4.get传输的数据量小,这主要因为受URL长度限制;
而post可以传输大量的数据,所以在上传文件时只能使用post.
5.get限制form表单的数据集,必须为ASCII字符,
而post支持整个ISO10646字符集.
6.get是form的默认方法。
35.JSP中动态include和静态include的区别:
动态include中用jsp:include动作实现<jsp:include page=“head.jsp”/>
它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数;
静态include用include伪码实现,它不会检查所含文件的变化,适用于包含
静态页面<%@ include file=“head.html”%>.

36.session的基本原理是什么:
session对象的原理在于,服务器可以为客户端创建并维护一个所谓的session对象
用于存放数据,在创建session对象的同时,服务器将会该session对象产生一个唯一
编号,这个编号称为sessionID,服务器以cookie的方式将sessionID存放在客户端,
当浏览器再次访问该服务器时,会将sessionID作为cookie信息带到服务器,
服务器可以通过该sessionID检索到以前的session对象,并对其进行访问,
需要注意的是,此时的cookie中仅仅保存了一个sessionID,而相对较多的会话
数据保存在服务器对应的session对象中,由服务器来统一保护,这样一定程度
保证了会话数据安全性,但增加了服务器端的内存开销,存放在客户端的用于
保存sessionID的cookie会在浏览器关闭时消除。我们把用户打开一个浏览器访问
某个应用开始,到关闭浏览器为止交互过程成为一个“会话”,在一个“会话“
过程中,可能会向一个应用发出了多次请求,这些请求将共享一个session,
因为这些请求携带了相同的sessionID信息。session对象的正常使用要依赖于cookie,
如果考虑到客户端可能处于安全的考虑,禁用了cookie,应该使用url重写的方式使
session在客户端禁用cookie的情况下继续生效。

37.jsp有哪些动作?作用分别是什么?
jsp:include:在页面请求的时候引入一个文件
jsp:useBean:寻找或实例化一个JavaBean
jsp:setProperty:设置JavaBean的属性
jsp:getProperty:输出某个JavaBean的属性
jsp:forward:把请求转到一个新的页面
jsp:plugin:根据浏览器类型为java插件生成object或EMBED标记。

38.解释四种会话跟踪技术:
隐藏表单域、URL重写、cookie、session
1.隐藏表单域:,非常适合不需要大量数据存储的会话应用。
2.URL重写:URL可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。
3.cookie:一个cookie是一个小的以命名数据元素,服务器使用SET-cookie头标将它作为HTTP
相应的一部分,传送给客户端,客户端被请求保存cookie值,在对同一服务器的后续请求
使用一个cookie头标将之返回到服务器,与其它技术比较cookie的一个优点是在浏览器会话结束后,
甚至在客户端计算机重启后它仍可以保留其值。
4.session使用setAttribute(String str,Objcet obj)方法将对象捆绑到一个会话。
39. 什么是spring?
Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。

40. 使用Spring框架的好处是什么?
轻量:Spring 是轻量的,基本的版本大约2MB。
控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器:Spring 包含并管理应用中对象的生命周期和配置。
MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。
41.Spring支持的几种bean的作用域。
Spring框架支持以下五种bean的作用域:
singleton : bean在每个Spring ioc 容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。
request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
缺省的Spring bean 的作用域是Singleton.
42.自动装配有哪些局限性 ?
自动装配的局限性是:
重写: 你仍需用 和  配置来定义依赖,意味着总要重写自动装配。
基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。
模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。
43.请简述对spring的事务管理的理解
Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交,没有数据库的事务支持,spring是无法完成事务的。
事务的四大特性:
原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
一致性: 执行事务前后,数据保持一致;
隔离性: 并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的;
持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
Spring通过如下事务管理接口进行事务管理的:
PlatformTransactionManager: (平台)事务管理器
TransactionDefinition: 事务定义信息(事务隔离级别、传播行为、超时、只读、回滚规则)
TransactionStatus: 事务运行状态
44.什么是Spring的MVC框架?
Spring 配备构建Web 应用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声明的方式把请求参数和业务对象绑定。
45.springAOP通知
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。
Spring切面可以应用五种类型的通知:
before:前置通知,在一个方法执行前被调用。
after: 在方法执行之后调用的通知,无论方法执行是否成功。
after-returning: 仅当方法成功完成后执行的通知。
after-throwing: 在方法抛出异常退出时执行的通知。
around: 在方法执行之前和之后调用的通知。
46.请写出几种常见的单例模式
非线程安全的懒汉式单例:
class Single{
private static Single s = null;

public Single() {
if (s == null)
  s = new Single();
return s;
  }
}
线程安全
class Single1 {
private static Single1 s = null;

public Single1() {

}
同步代码块加锁
public static Single1 getInStanceBlock(){
    if(s==null)
        synchronized (Single1.class) {
            if(s==null)
                s = new Single1();
        }
    
    return s;
    
}

}

47.Struts2和SpringMVC区别,优缺点
struts2存在过安全漏洞.
springmvc的注解配置简单快捷,xml配置量很少
struts2配置量比较大.
struts2的action采用非单例设计;
spring mvc的controller是单例的.
Struts2一个请求一个Action组件(维护请求和Action映射).
SpringMVC一个请求一个处理方法(维护请求和方法映射)
SpringMVC与Spring集成更方便.

48.MyBatis和Hibernate区别,优缺点
MyBatis框架轻量,简单易学,容易上手使用.
MyBatis自己写SQL,适合SQL优化
Hibernate关联操作太复杂,级联操作效率低下,应用复杂

MyBatis和Hibernate都属于ORM工具.
MyBatis是将对象和SQL映射,查询时是将SQL结果
映射到实体对象里.
Hibernate是将对象和数据表映射,将查询的字段值给
映射指定属性名赋值.
Hibernate不需要写SQL,会自动生成SQL;可以用HQL语句
MyBatis缺点:编写大量SQL,数据库移植性差,尤其是分页处理
MyBatis虽然提供了分页器,但是属于缓存分页,效率低,还需要
程序员编写分页查询语句
49.Struts,Spring,Hibernate三大框架

1.Hibernate工作原理及为什么要用?
原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory
为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

2.Hibernate是如何延迟加载?

  1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
  2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。

3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many
50.项目描述案例
1.个人简介,项目介绍
1)功能描述(简介)
做了一个电信计费系统,针对电信Linux服务器对外租用做的
一套计费系统.
本系统主要包含3大业务,
a.账号业务管理
b.账单业务管理
c.用户及权限管理
2)技术架构(详细)
a.用了哪些技术
采用了Ajax+jQuery+SpringMVC+SpringIOC/AOP
+MyBatis+Oracle
开发工具:myeclipse,tomcat,jdk1.6
b.技术实现了哪些作用
Ajax:利用Ajax异步发送请求处理,例如用户登录,
名字唯一性检测功能实现
jQuery:js框架,进行js和Ajax编程,例如表单校验,ajax请求处理
SpringMVC:mvc框架,接收请求转发处理,例如用户请求交给
DispatcherServlet主控器处理,根据请求不同转发给Controller
组件处理.
SpringIOC/AOP:IOC实现程序组件解耦,例如程序分为控制层,
业务层,数据访问层,层与层组件调用采用注入形式实现.
事务处理采用AOP方式控制.(声明式事务管理)
MyBatis:实现数据库操作,利用它完成DAO组件功能
Oracle:做数据存储,(存储了PL/SQL,完成账单计算)

c.为什么采用这些技术
为了增强用户体验度采用了Ajax技术,减少页面刷新
为了提高js开发效率采用了jQuery框架
为了采用MVC结构,方便跟Spring集成,选用了SpringMVC
为了降低程序组件关联,采用SpringIOC,AOP
为了提高数据库DAO开发效率采用MyBatis

3)数据设计(详细)
a.账号管理业务
账号管理业务分为账务账号,业务账号和资费标准
一个用户只能开通一个账务账号,申请某项服务,就开通一个
业务账号.(一个账务账号可以对应多个业务账号).
一个业务账号对应一个资费标准(收费标准).
对每一项信息都可以进行查询,更新,添加,删除,启用,禁用等操作

b.账单管理业务
主要对账单进行查询,明细查询等操作.

c.用户及权限管理
涉及:管理员,角色,权限数据.
管理员:就是系统登录用户,一个管理员分配多个角色
角色:一个角色又可以分配多个权限操作
权限操作:每一个权限操作对应一组请求的URI

 管理员,角色等信息都可以进行查询,添加,删除,更新操作

权限设计与实现===
数据关系: 权限数据有管理员,角色,具体权限操作URI信息.
一个管理员可以有多个角色,每个角色可以有多个URI操作权限.

实现思路:用户登录成功,提取该用户的权限操作URI,放入session.
之后用户每次发出请求都要执行一个拦截器,在拦截器提取当前
请求的URI,判断是否在session存储的URI列表中,如果存在允许
继续操作,不存在中断定位到无权限页面.
数据库设计:
ADMIN_INFO–>ADMIN_ROLE–>ROLE_INFO
–>ROLE_PRIVILEGE–>privileges.xml
采用privileges.xml没有采用数据表,因为没有系统页面设计,
没有对URI维护的需求.如果对权限URI灵活组合,可以设计成
数据表,并且添加维护页面.

=============================
第一步:
登录成功时需要根据登录用户名按以下关系提取权限操作URI
ADMIN_INFO–>ADMIN_ROLE–>ROLE_INFO
–>ROLE_PRIVILEGE–>privileges.xml(操作的URI)
第二步:编写一个拦截器
request.getServletPath();//request.getRequestURI();
/add.do ( request.getServletPath()😉
/netctoss/add.do (request.getRequestURI());
第三部:配置拦截器
拦截除了注册和登录之外的所有请求

4)开发中遇到哪些问题,怎么解决(详细)
a.技术性(像一些异常)
js编程调试比较难,采用排除法,alert,浏览器调式插件.
java逻辑出错,采用断点调试法,每个组件做junit单体测试
框架整合约定的规则比较多,任何一个环节出错导致程序错误.
后来熟悉了框架规则和开发流程就没问题了.
例如:
404:一般是发出请求路径和服务器Controller没有匹配
主要原因是采用了大量的相对路径,原来对相对路径理解
有些错误.
注入错误:导致空指针异常,由于缺少@Resource注入标记
或者缺少扫描标记.导致无法正常注入
b.业务逻辑性(处理方案)
如何避免表单重复提交:(客户端封表单)
将表单封住–>Ajax处理–>变为可用
$(":input").attr(“disabled”,true);

=令牌机制===
表单一出来,会向表单添加一个hidden,存储令牌值,
同时session也存储了这个相同令牌值.
当用户提交后,会判断表单提交的令牌值是否和session相同,
相同认为有效,清除session令牌值.
如果表单提交令牌值与session不同被认为无效提交

 如何合并相同的权限操作URI:
      list1.add("/list.do");
      list1.add("/add.do");

      list2.add("/list.do");
      list2.add("/delete.do");

Set<String> set  = new HashSet<String>();
    set.addAll(list1);
    set.addAll(list2);

public class Controller{
public Stirng addUser(User user);
public Stirng addPerson(Person person);
}

5)以资费列表显示为例,描述怎么实现的?
a.首先熟悉功能需求和相关数据表
b.设计主要流程实现
/cost/list.do–>CostListController–>CostDao–>COST表
—>cost_list.jsp
c.编写流程中主要组件实现
编写DAO,编写Controller,编写JSP
d.做一些junit单体测试
e.JSP需要校验,需要特效的做一些处理
f.带页面整体测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值