JAVA复试问题答案_第1页
JAVA复试问题答案_第2页
JAVA复试问题答案_第3页
JAVA复试问题答案_第4页
JAVA复试问题答案_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、(一) JAVA复试的问题整理 1 Hibernate 的优化流程是如何实现的,流程是怎么样?1.尽量使用many-to-one,避免使用单向one-to-many2.灵活使用单向one-to-many3.不用一对一,使用多对一代替一对一4.配置对象缓存,不使用集合缓存5.一对多使用Bag 多对一使用Set6.继承使用显示多态 HQL:from object polymorphism="exlicit" 避免查处所有对象7.消除大表,使用二级缓存 2 Struts1与Struts2的区别? 在Action 实现类方面的对比:Struts 1 要求Action 类继承一个抽象

2、基类;Struts 1 的 一个具体问题是使用抽象类编程而不是接口。Struts 2 Action 类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts2 提供一ActionSupport  基类去实现常用的接口。即使 Action  接口不是必须实现的,只有一个包含execute 方法的POJO 类都可以用作 Struts 2 的Action 。 线程模式方面的对比:Struts 1 Action 是单例模式并且必须是线程安全的,因为仅有Action 的一个实例来处理所有的请求。单例策略限制了Struts 1 Action 能做的事

3、,并且要在开发时特别小心。Action 资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。 Servlet 依赖方面的对比:Struts 1 Action 依赖于 Servlet API,因为Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。Struts 2 Action 不再依赖于 Servlet API,从而允许Action 脱离Web 容器运行,从而降低了测试Action 的难度。当然,如果Action 需要直接访问HttpServl

4、etRequest 和HttpServletResponse 参数,Struts 2 Action 仍然可以访问它们。但是,大部分时候,Action 都无需直接访问HttpServetRequest 和HttpServletResponse,从而给开发者更多灵活的选择。 可测性方面的对比:测试Struts 1 Action 的一个主要问题是execute 方法依赖于Servlet API,这使得Action 的测试要依赖于Web 容器。为了脱离Web 容器测试 Struts1 的Action,必须借助于第三方扩展:Struts TestCase,该扩展下包含了系列的Mock 对象(模拟了Htt

5、pServetRequest 和HttpServletResponse 对象),从而可以脱离Web 容器测 试Struts 1 的Action 类。Struts 2 Action 可以通过初始化、设置属性、调用方法来测试。 封装请求参数的对比:Struts 1 使用ActionForm 对象封装用户的请求参数,所有的 ActionForm 必须继承一个基类:ActionForm。普通的JavaBean 不能用作ActionForm,因此,开发者必须创建大量的ActionForm 类封装用户请求参数。虽然 Struts 1 提供了动态 ActionForm来简化 ActionForm的开发,但依

6、然需要在配置文件中定义ActionForm;Struts2 直接使用Action 属性来封装用户请求属性,避免了开发者需要大量开发 ActionForm 类的烦琐,实际上,这些属性还可以是包含子属性的 Ric对象类型。如果开发者依然怀念 Struts 1  ActionForm 的模式,Struts2 提供ModelDriven 模式,可以让开发者使用单独的Model 对象来封装用户请求参数,但该Model 对象无需继承任何 Struts 2 基类,是一个POJO,从而降低了代码污染。 表达式语言方面的对比:Struts1 整合了 JSTL,因此可以使用JSTL 表达式语言。这种表达

7、式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;Struts 2 可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:OGNL(Object Graph Notation Language),因此,Struts 2 下的表达式语言功能更加强大。绑定值到视图的对比:Struts1 使用标准JSP 机制把对象绑定到视图页面;Struts2 使用“ValueStack ”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。 类型转换的对比:Struts1  ActionForm  属性通常都是 String  类型。Struts 

8、;1 使用commons-Beanutils 进行类型转换,每个类一个转换器,转换器是不可配置的;Struts 2 使用OGNL 进行类型转换,支持基本数据类型和常用对象之间的转换。 数据校验的对比:Struts1 支持在 ActionForm 重写validate 方法中手动校验,或者通过整合 Commons-validator 框架来完成数据校验。Struts 2 支持通过重写validate方法进行校验,也支持整合XWork 校验框架进行校验。 Action 执行控制的对比:Struts 1 支持每一个模块对应一个请求处理(即生命周期的概念),但是模块中的所有Action 必须共享相同的

9、生命周期。Struts 2 支持通过拦截器堆栈(Interceptor    Stacks)为每一个Action 创建不同的生命周期。开发者可以根据需要创建相应堆栈,从而和不同的Action 一起使用。3 Struts1的原理 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts不同的模块初始化相应的对象。(面向对象思想) 2.发送请求:用户提交表单或通过URL向WEB服务器提交请求,请

10、求的数据用HTTP协议传给web服务器。 3.form填充:struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员变量中。 4.派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并传给这个Action中的excute()方法。 5.处理业务:Action一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块)完毕后返回一个ActionForward对象。服务器通过ActionForward对象进行转发工作。 6.返回响应:Action将业务处理的不同结果返回一个

11、目标响应对象给总控制器。 7.查找响应:总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,一般情况下为jsp页面。 8.响应用户:目标响应对象将结果传递给资源对象,将结果展现给用户。4 IO的流程如何实现 1,根据输入源不同,构造不同的输入流2,根据不同的需要,包装原始的输入流。比如用BufferdInputStream提高性能。3,根据输出源不同,构造不同的输出流。4,根据不同的需要,包装原始的输入流。5,从输入流中读取数据写入输出流中。6,关闭输出,输入流 5 WEB开发安全的注意要点1登陆验证码。利用一个servlet随机产生一个验证码,由于验证码是机器随机产生的,

12、因此暴力破解程序无法预料到具体是什么,所以可以防止暴力破解。2登陆身份验证。系统的每个功能都必须经过身份验证后才能访问,没有认证的请求会被过滤掉,这是最基本的安全要求:1,所有功能都通过Struts的Action来进行访问,不直接以jsp的形式向用户提供功能访问,这样一方面可以防止向用户暴露程序的资源名称,另一方面也可更方便的进行权限控制。2,对Struts的Actionservlet设置filter,利用该filter来检查用户的权限,这样既可以防止用户登陆后跨url访问。3防 止扰过权限认证的直接资源访问。虽然前面的设计中,已经要求所有的功能都通过struts的Action来进行访问,但是

13、还是不能排除恶意用户可能会知道 程序资源名称(jsp文件),如果这类用户直接输入jsp文件的url访问,有可能会对系统形成威胁。因此需要禁止所有用户发起的直接资源访问。通常以这 种方式来实现:在Web应用中创建一个从不使用的角色:NeverUsedRole,将所有的jsp资源文件配置为必须具有NeverUserRole才 能访问。由于根本没有任何用户可以成为该角色。由于根本没有任何用户可以成为该角色,所以也就无法对该角色对应的资源直接访问。 6 常用的集合的区别Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection

14、的元素 (Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。 List接口 List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。 LinkedList类 LinkedList实现了List接口,允许null元素。此外Lin

15、kedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。 注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。 ArrayList类 ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。 当需要插入大量元素时,在插

16、入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 和LinkedList一样,ArrayList也是非同步的(unsynchronized)。 Vector类 Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个 Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出 ConcurrentModificationExce

17、ption,因此必须捕获该异常。 Stack 类 Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push 和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空 栈。 set接口 Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。 Map接口 请注意,Map没有继承Collection接口,Map提供key到value的映射。一

18、个Map中不能包含相同的key,每个key只能 映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。 Hashtable类 Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。 Hashtable是同步的。 HashMap类 HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values

19、()方法可返回Collection),其迭代子操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。 7 sql的优化1)Shared pool的优化应该放在优先考虑,因为一个cache miss在shared pool中发生比在data buffer中发生导致的成本更高2)尽可能避免排序;尽可能在内存中排序;分配合适的临时空间以减少空间分配调用。3)建立Indexes,但索引的层次越多,效率越低,索引所包含的字段不超过4个。4)表分区5)使用where过滤行 Select id from d

20、ual where id = 16)使用表连接而不是多个查询 使用:Select a.id,,b.app_name from A a,B b where a.id=b.id 而不是: Select a.id,,b.app_name from B b where a.id=b.id from A a7)执行连接时使用完全限定的列引用 8)使用CASE表达式而不是多个查询9)使用WHERE而不用HAVING 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤。 这个处理需要排序,总计等操作。 如果能通过WHERE子句限制记录的数目,那就能减

21、少这方面的开销。10)使用exists而不用IN11)使用相同的SQL,使用的SQL 必须绝对相同a)所有字符必须相同b)大小写要相同c)空格要相同12)WHERE子句中的连接顺序 ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。13)SELECT子句中避免使用 * 例如:person表包含4个字段(id,name,age,address) Select id,name,age,address from person; 不用:select * from person14)

22、 使用DECODE函数来减少处理时间 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。15) 减少对表的查询在含有子查询的SQL语句中,要特别注意减少对表的查询。16) 使用表的别名(Alias)17) 用EXISTS替代IN 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率。 8 DWR是怎么实现它先在web.xml中配置一个Servlet,映射到特定的路径(通常是%CONTEXT_PATH%/dwr/*)。这个Servlet的作用就是初 始化要暴露给Javascript调用

23、的Java类(通过dwr.xml进行配置),并生成相应的代理的Javascript类代码。在XHR请求到来的 时候,Servlet负责将请求的参数变成对应的Java对象,并以其为参数调用目标Java方法,并将返回值转化为Javascript代码。 9 list和vector的区别List接口 List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。 LinkedList类 LinkedList实现了List接口,

24、允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。 注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。 ArrayList类 ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。 当需要插入大量元

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论