1.在java解析xml文档的方式有哪些?
DOM | SAX  | JDOM  | Dom4j
了解:
[DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。

SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。

JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。(http://jdom.org)
JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念等),把SAX和DOM的功能有效地结合起来。
JDOM是用Java语言读、写、操作XML的新API函数。在直接、简单和高效的前提下,这些API函数被最大限度的优化]


2.hibernate的核心思想是什么?
hibernate是一个采用ORM机制持久层的开源框架,ORM是将表与表之间的操作,映射成对象和对象之间的操作,这样简化了持久层的代码,减轻了程序员的负担

3.如何优化Hibernate?
  1.使用双向一对多关联,不使用单向一对多
  2.灵活使用单向一对多关联
  3.不用一对一,用多对一取代
  4.配置对象缓存,不使用集合缓存
  5.一对多集合使用Bag,多对多集合使用Set
  6. 继承类使用显式多态
  7. 表字段要少,表关联不要怕多,有二级缓存撑腰

4.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)

    类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many实现关系映射.

5.Hibernate查找对象如何应用缓存?
当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存
删除、更新、增加数据的时候,同时更新缓存

6.Hibernate管理缓存实例
无论何时,我们在管理Hibernate缓存(Managing the caches)时,当你给save()、update()或saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。 
当随后flush()方法被调用时,对象的状态会和数据库取得同步。 如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。 
一级缓存:当应用程序调用Session的save()、update()等方法时如果在Session缓存中不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中


7.什么样的数据适合存放到第二级缓存中?   
   1 很少被修改的数据   
   2 不是很重要的数据,允许出现偶尔并发的数据   
   3 不会被并发访问的数据   
   4 常量数据   

8.不适合存放到第二级缓存的数据?   
   1经常被修改的数据   
   2 .绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发   
   3 与其他应用共享的数据。 


9.Hibernate缓存的作用:
    Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据

10.Hibernate的缓存机制:
    Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存以及查询缓存
    Hibernate一级缓存又称为“Session的缓存”,它是内置的,不能被卸载(不能被卸载的意思就是这种缓存不具有可选性,必须有的功能,不可以取消session缓存)。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法卸除。在第一级缓存中,持久化类的每个实例都具有唯一的OID。 
    Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。
    查询缓存依赖于二级缓存,二级缓存只有在基于ID查找对象时才会用到,对于查询则毫无作用.查询缓存适用的场合:1.经常适用的查询语句 2.对查询到的数据很少有插入或者删除或者更新操作

11.Struts2如何启动

    Struts2是通过web.xml中的过滤器StrutsPrepareAndExecuteFilter启动的,Tomcat服务器启动的时候,会执行一次StrutsPrepareAndExecuteFilter里面的init方法,加载struts.xml配置文件,将配置文件的内容封装为javabean存放在内存中,以后用户请求将会读取内存,读取数据,而不用每次都在struts.xml中读取。
----------------------------------------------------------------
12.Struts2的核心控制器StrutsPrepareAndExecuteFilter的作用

  StrutsPrepareAndExecuteFilter 主要负责拦截 url请求,可以在web.xml中配置拦截的url,<url-pattern>/*</url-pattern>代表拦截所有的请求,执行doFilter方法默认情况下,如果用户请求的路径   不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,否则struts2框架将略过该请求的处理。
----------------------------------------------------------------
13.struts2配置文件的加载顺序?

  struts.xml ——> struts.properties常量可以在struts.xml或struts.properties中配置,如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.      struts.xml文件的作用:通知Struts2框架加载对应的Action资源
struts-default.xml、

struts-plugin.xml、

struts.xml、

struts.properties、

web.xml
----------------------------------------------------------------
14.struts2是如何管理action的?这种管理方式有什么好处?
struts2框架中使用包来管理Action,包的作用和Java中的类包是非常类似的。 主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。
----------------------------------------------------------------
15.struts2中的默认包struts-default有什么作用? 
  1.struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型,而Struts2很多核心的功能都是通过这些内置的拦截器实现,如:从请求中 把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了struts-default包才能使用struts2为我们提供的这些功能。

 2.struts-default包是在struts-default.xml中定义,struts-default.xml也是Struts2默认配置文件。 Struts2每次都会自动加载 struts-default.xml文件。
 3.通常每个包都应该继承struts-default包。
----------------------------------------------------------------
16.struts2的action的URL访问路径由什么构成?  

   由两部分组成:包的命名空间+action的名称 [ + action的后缀 ],/crud1/userAdd.action,crud1是命名空间,userAdd是struts.xml中配置的action的名称。
-----------------------------------------------------------------------
17.在struts.xml中可以不为action指定class属性吗?struts2中有哪些默认的属性? 
  可以,如果没有为action指定class,默认是com.opensymphony.xwork2.ActionSupport 
默认属性:

如果没有为action指定class          ActionSupport
如果没有为action指定method     execute()       注意:ActionSupport的execute方法里面就一句话return "success"; 
如果没有指定result的name           success 
如果没有指定result的type           dispatcher

action中默认都有一个拦截器的引用,即:<interceptor-ref name="defaultStack">;

        注意: 
       1.一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用,所以此时要显式的引进默认的拦器;

       2.每个包只能指定一个默认拦截器,每个默认拦截器只针对当前包下有效。 
----------------------------------------------------------------
 18.拦截器的作用?拦截器与过滤器的区别?

 1)拦截器是对调用的Action起作用,它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码。拦截器只能拦截Action,说明白点拦截器其实是Action的功能块,只在Action前后执行。拦截器可以抽象出一部分代码可以用来完善原来的action。同时可以减轻代码冗余,提高重用率。

 2) 过滤器是拦截用户请求的,范围明显比拦截器大的多。

19.谈谈你对拦截器的理解

拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式.
 拦截器的实现原理:
大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。

20.谈谈你对过滤器的理解

Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序.
主要的用途:是过滤字符编码、做一些业务逻辑判断等。
其工作原理:只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁

21.拦截器和过滤器的区别

    1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
    2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
    3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
    4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问
    5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

11-11 10:56