j2ee面试题

1、        hibernate中,一个操作单元的范围是多大?

一般来讲,hibernate都交给spring来管理了,范围在filter开始跟结束之间。
 hibernate单独来讲的话,一般写的sessionFactory,都是以ThreadLocal 线程控制session的,范围就是单个线程sessionopenclose之间

 

2:tomcat和JBOSS,weblogic的异同?

概述:

Apache:全球应用最广泛的http服务器,免费,出自apache基金组织   
Tomcat
:应用也算非常广泛的web服务器,支持部分j2ee免费,出自apache基金组织   
JBoss
:开源的应用服务器,比较受人喜爱,免费(文档要收费)   
Weblogic
:应该说算是业界第一的app server,全部支持j2ee1.4对于开发者,有免费使用一年的许可证。

Jboss也支持j2ee

JBossWebLogic都含有JspServlet容器,也就可以做web容器,
JBoss
WebLogic也包含EJB容器,是完整的J2EE应用服务器

Tomcat 只能做jspservletcontainer

Jboss内嵌Tomcat... 处理静态页面Jboss的速度要比较快。

Jboss作为应用服务器,而Tomcatweb服务器。

3:struts2中的拦截器,你用过那些自带的拦截器,自己写过的吗?

4:列出Jsp中包含外部文件的方式,两者有何区别。

行为元素,它是动态包含一个外部文件,运行后代码时是分别编译成单独的.class文件。
 
指令元素<%@ include file ="somefile"%>这是一种静态包含,它运行的时候不会单独编译成.class文件,它生成一个新的整体.class文件。

 

5:在hibernate中,一个持久化的实例有哪几种状态?

transient:瞬态或者自由态 
(new DeptPo(1,”行政部”,20,”行政相关”),该po的实例和session没有关联,该po的实例处于transient) 
persistent:持久化状态 
(和数据库中记录想影射的Po实例,它的状态是persistent, 通过get和load等得到的对象都是persistent) 
detached:脱管状态或者游离态 
(1) 当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该po状态就处于 detached, (表示和session脱离关联),因delete而变成游离态可以通过save或saveOrUpdate()变成持久态 
(2)当把session关闭时,session缓存中的persistent的po对象也变成detached 
因关闭session而变成游离态的可以通过lock、save、update变成持久态 
持久态实例可以通过调用 delete()变成脱管状态。 
通过get()或load()方法得到的实例都是持久化状态的。 
脱管状态的实例可以通过调用lock()或者replicate()进行持久化。 
save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE, 
而update()或merge()会引发SQL UPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQL UPDATE。 
saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE 
二、save 和update区别 
把这一对放在第一位的原因是因为这一对是最常用的。 
save的作用是把一个新的对象保存 
update是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库 
三、update 和saveOrUpdate区别 
这个是比较好理解的,顾名思义,saveOrUpdate基本上就是合成了save和update,而update只是update;引用hibernate reference中的一段话来解释他们的使用场合和区别 
通常下面的场景会使用update()或saveOrUpdate(): 
程序在第一个session中加载对象,接着把session关闭 
该对象被传递到表现层 
对象发生了一些改动 
该对象被返回到业务逻辑层最终到持久层 
程序创建第二session调用第二个session的update()方法持久这些改动 
saveOrUpdate(po)做下面的事: 
如果该po对象已经在本session中持久化了,在本session中执行saveOrUpdate不做任何事 
如果savaOrUpdate(新po)与另一个与本session关联的po对象拥有相同的持久化标识(identifier),抛出一个异常 
org.hibernate.NonUniqueObjectException: a different object with the sameidentifier value was already associated with the session:[org.itfuture.www.po.Xtyhb#5] 
saveOrUpdate如果对象没有持久化标识(identifier)属性,对其调用save() ,否则update() 这个对象 
四、persist和save区别 
这个是最迷离的一对,表面上看起来使用哪个都行,在hibernatereference文档中也没有明确的区分他们. 
这里给出一个明确的区分。(可以跟进src看一下,虽然实现步骤类似,但是还是有细微的差别) 
主要内容区别: 
1,persist把一个瞬态的实例持久化,但是并"不保证"标识符(identifier主键对应的属性)被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时候。 
2,save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,所以它会立即执行Sql insert 
五、saveOrUpdate,merge和update区别 
比较update和merge 
update的作用上边说了,这里说一下merge的 
如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象覆盖session已有的持久实例 
(1)当我们使用update的时候,执行完成后,会抛出异常 
(2)但当我们使用merge的时候,把处理自由态的po对象A的属性copy到session当中处于持久态的po的属性中,执行完成后原来是持久状态还是持久态,而我们提供的A还是自由态 

merge:可以替代saveorupdate方法,工作时遇到a differentobject with the same identifier value was already associated with the session异常,原因就是在hibernate中,同一个session里面有了两个相同标识但是是不同实体,当这时运行saveOrUpdate(object)操作的时候就会报这个错误 
六、flush和update区别 
这两个的区别好理解 
update操作的是在自由态或脱管状态(因session的关闭而处于脱管状态)的对象//updateSQL 
而flush是操作的在持久状态的对象。 
默认情况下,一个持久状态的对象的改动(包含set容器)是不需要update的,只要你更改了对象的值,等待hibernateflush就自动更新或保存到数据库了。hibernateflush发生在以下几种情况中: 
1, 调用某些查询的和手动flush(),session的关闭、SessionFactory关闭结合 
get()一个对象,把对象的属性进行改变,把资源关闭。 
2,transactioncommit的时候(包含了flush) 
七、lock和update区别 
update是把一个已经更改过的脱管状态的对象变成持久状态 
lock是把一个没有更改过的脱管状态的对象变成持久状态(针对的是因Session的关闭而处于脱管状态的po对象(2),不能针对因delete而处于脱管状态的po对象) 
对应更改一个记录的内容,两个的操作不同: 
update的操作步骤是: 
(1)属性改动后的脱管的对象的修改->调用update 
lock的操作步骤是: 
(2)调用lock把未修改的对象从脱管状态变成持久状态-->更改持久状态的对象的内容-->等待flush或者手动flush 
八、clear和evcit的区别 
clear完整的清除session缓存 
evcit(obj)把某个持久化对象从session的缓存中清空。

 

6、解析XML文件的几种方式和区别

Dom解析在内存中创建一个DOM树,该结构通常需要加载整个文档然后才能做工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的,树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改能随机访问文件内容,也可以修改原文件内容.


SAX
解析 SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点线性解析,不能随机访问,也无法修改原文件

 

 JDOM解析 JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快.JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。

 DOM4j解析 DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。

8、tomcat中,什么是DefaultServlet?他的功能是什么?

我们的应用的一些静态资源就可以交给该servlet去处理,以减轻服务器压力,节省资源。比如我们把对静态资源的访问路径从/变更为/static,如访问http://localhot/style.css改成http://localhost/static/style.css,然后再应用的web.xml文件中增加如下配置代码:

1.      

2.        default  

3.        /static/*  

4.     

9、servlet的init()方法和service()方法的区别?

init() 方法 

Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet 时执行的。可以配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet无论有多少客户机访问 Servlet,都不会重复执行 init()  

缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法来覆盖它,典型的是管理服务器端资源。例如,可能编写一个定制 init() 来只用于一次装入 GIF 图像,改进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。缺省的 init() 方法设置了 Servlet 的初始化参数,并用它的ServletConfig 对象参数来启动配置,因此所有覆盖 init() 方法的 Servlet 应调用super.init() 以确保仍然执行这些任务。在调用 service() 方法之前,应确保已完成了 init() 方法。 

(2) service()
方法 

ervice()
方法是 Servlet 的核心。每当一个客户请求一个HttpServlet对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如,如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。 

当一个客户通过HTML 表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用doPost()方法。 

当一个客户通过HTML 表单发出一个HTTP GET请求或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet()方法。 

10:session是存储在什么地方,以什么形式存储的。

session是存在服务器的内存中
每个会话对应一个sessionId
通过sessionId开区分是那个会话的session

11在hibernate查询中,iterate()和list()方法的异同是?

查询原理:

    list()方法是通过一条SQL一次性抓取出所有数据。iterate()方法是先查出所有记录的ID,然后再根据每个ID查出各自对应的记录。

 

查询优缺点:

      list()方法查询时,当数据量过大时会导致内存开销过大。iterate()方法则相对好得多,且可以根据ID从缓存中查询,从而提高查询效率。

12、:Servlet的基本架构?写出主要方法。

Servlet基本结构,如果某个类要成为Servlet,则它应该从HttpServlet 继承,根据数据是通过GET还是POST发送,覆盖doGet、doPost方法之一或全部。doGet和doPost方法都有两个参数,分别为HttpServletRequest 类型和HttpServletResponse 类型。HttpServletRequest提供访问有关请求的信息的方法,例如表单数据、HTTP请求头等等。HttpServletResponse除了提供用于指定HTTP应答状态(200,404等)、应答头(Content-Type,Set-Cookie等)的方法之外,最重要的是它提供了一个用于向客户端发送数据的PrintWriter。对于简单的Servlet来说,它的大部分工作是通过println语句生成向客户端发送的页面。

注意doGet和doPost抛出两个异常,因此你必须在声明中包含它们。另外,你还必须导入java.io包(要用到PrintWriter等类)、javax.servlet包(要用到HttpServlet等类)以及javax.servlet.http包(要用到HttpServletRequest类和HttpServletResponse类)。
最后,doGet和doPost这两个方法是由service方法调用的,有时你可能需要直接覆盖service方法。以上是Servlet基本结构

 

 

13、hibernate中load()/get()区别

总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

 

14应用服务器与WEB SERVER的区别?

 

1.            应用服务器处理业务逻辑,web服务器则主要是让客户可以通过浏览器进行访问。
2。应用服务器处理业务逻辑,
web服务器是用于处理HTML文件的。web服务器通常比应用服务器简单,如apache就是web服务器,Jboss就是EJB应用服务器。
应用服务器:Weblogic、Tomcat、Jboss
WEB SERVER
IIS、 Apache

 

15:说明Jsp中errorPage的作用,应用范围。

errorPage 的意思是设置当前页面要引入错误页面。也就是浮面当前页面如果出现错误就会跳转到errorPage所指定的页面。 
  isErrorpage的意思是当前页面为错误页面。isErrorpage默认值为false,若要当前页面为错误页面就设置isErrorPage=true。

16:saveOrUpate()和merge()的异同?

1pojo对象中有属性为null时,使用merge不更新数据库,使用saveOrUpdate更新数据库。

使用saveOrUpdate时部分属性为null时不要更新的解决方法:

(1)配置文件中添加属性: update="false",适用于永远不更新的情况,如creatTime

 

17:常见的struts标签有那些?

//form表单

//用于显示值的标签

//文本框

//密码框

//时间格式

//单选按钮

//下拉列表

//多选按钮

//隐藏标签

//提交按钮
确定"> 
//重置按钮
重置">

//循环标签
  
      
 

//if...else标签
  
    这里是if模块  
  
    这里是elseif模块  
  
    这里是else模块  


//查看值栈数据

 

18:说出在JSP页面里是怎么分页的?

  <div id="pages">

                    <a href="javascript:toPage(1);">首页a>

                    <s:if test="page==1">

                    <a href="#">上一页a>

                    s:if>

                    <s:else>

                 <a href="javascript:toPage(<s:property value="page-1"/>);">上一页a>

                    s:else>

                   

                    <s:iterator begin="1" end="totalPage"var="k">

                    <s:if test="#k==page">

                       <a href="javascript:toPage(<s:property />);"class="current_page"><s:property/>a>

                    s:if>

                    <s:else>

                       <a href="javascript:toPage(<s:property />);"><s:property/>a>

                    s:else>

                    s:iterator>

                   

                    <s:if test="page==totalPage">

                    <a href="#">下一页a>

                    s:if>

                    <s:else>

                    <a href="javascript:toPage(<s:property value="page+1"/>);">下一页a>

                    s:else>

                   

                    <a href="javascript:toPage(<s:property value="totalPage"/>);">末页a>

                div>     

19、spring访问底层资源使用哪个接口?说出该接口的实现类也可以

Spring 把所有能记录信息的载体,如各种类型的文件、二进制流等都称为资源,对 Spring 开发者来说,最常用的资源就是 Spring 配置文件(通常是一份 XML 格式的文件)。

在 Sun 所提供的标准 API 里,资源访问通常由 java.net.URL 和文件 IO 来完成,尤其是当我们需要访问来自网络的资源时,通常会选择 URL 类。

URL 类可以处理一些常规的资源访问问题,但依然不能很好地满足所有底层资源访问的需要,比如,暂时还无法从类加载路径、或相对于 ServletContext 的路径来访问资源,虽然 Java 允许使用特定的 URL 前缀注册新的处理类(例如已有的 http: 前缀的处理类),但是这样做通常比较复杂,而且 URL 接口还缺少一些有用的功能,比如检查所指向的资源是否存在等。

Spring 改进了 Java 资源访问的策略,Spring 为资源访问提供了一个 Resource 接口,该接口提供了更强的资源访问能力,Spring 框架本身大量使用了 Resource 接口来访问底层资源。

Resource 接口是具体资源访问策略的抽象,也是所有资源访问类所实现的接口。Resource 接口主要提供了如下几个方法:

·                      getInputStream():定位并打开资源,返回资源对应的输入流。每次调用都返回新的输入流。调用者必须负责关闭输入流。

·                      exists():返回 Resource 所指向的资源是否存在。

·                      isOpen():返回资源文件是否打开,如果资源文件不能多次读取,每次读取结束应该显式关闭,以防止资源泄漏。

·                      getDescription():返回资源的描述信息,通常用于资源处理出错时输出该信息,通常是全限定文件名或实际 URL。

·                      getFile:返回资源对应的 File 对象。

·                      getURL:返回资源对应的 URL 对象。

最后两个方法通常无须使用,仅在通过简单方式访问无法实现时,Resource 提供传统的资源访问的功能。

Resource 接口本身没有提供访问任何底层资源的实现逻辑,针对不同的底层资源,Spring 将会提供不同的 Resource 实现类,不同的实现类负责不同的资源访问逻辑。

Resource 不仅可在 Spring 的项目中使用,也可直接作为资源访问的工具类使用。意思是说:即使不使用 Spring 框架,也可以使用 Resource 作为工具类,用来代替 URL。当然,使用 Resource 接口会让代码与 Spring 的接口耦合在一起,但这种耦合只是部分工具集的耦合,不会造成太大的代码污染。

Resource 的实现类

Resource 接口是 Spring 资源访问策略的抽象,它本身并不提供任何资源访问实现,具体的资源访问由该接口的实现类完成——每个实现类代表一种资源访问策略。

Spring 为 Resource 接口提供了如下实现类:

·                      UrlResource:访问网络资源的实现类。

·                      ClassPathResource:访问类加载路径里资源的实现类。

·                      FileSystemResource:访问文件系统里资源的实现类。

·                      ServletContextResource:访问相对于 ServletContext 路径里的资源的实现类:

·                      InputStreamResource:访问输入流资源的实现类。

·                      ByteArrayResource:访问字节数组资源的实现类。

这些 Resource 实现类,针对不同的的底层资源,提供了相应的资源访问逻辑,并提供便捷的包装,以利于客户端程序的资源访问。

使用UrlResource 访问网络资源

访问网络资源通过 UrlResource 类实现,UrlResource 是 java.net.URL 类的包装,主要用于访问之前通过 URL 类访问的资源对象。URL 资源通常应该提供标准的协议前缀。例如:file: 用于访问文件系统;http: 用于通过 HTTP 协议访问资源;ftp: 用于通过 FTP 协议访问资源等。

20、tomcat支持CGI吗

修改conf/web.xml文件

 

1)解注释cgi相关的配置,共两处


2)在cgi配置中加入:
   
      executable
      /bin/sh
    

 

3)写一个简单的脚本程序,放入webapps/your_project_name/cgi-bin/中,如下:

test.sh
#!/bin/sh
echo "Content-Type:text/html"
echo "Content-Length:4"
echo ""
echo "haha"

21、hibernate抓取策略

hibernate抓取策略(单端代理的批量抓取)


保持默认,同fetch="select",如:

fetch="select",
另外发送一条select语句抓取当前对象关联实体或集合


hibernate
抓取策略(单端代理的批量抓取)
设置fetch="join",如:


fetch="join",hibernate
会通过select语句使用外连接来加载其关联实体或集合,不会别外发送一条SQL

此时lazy会失效

 

hibernate抓取策略(集合代理的批量抓取)

保持默认,同fetch="select",如:

fetch="select",
另外发送一条select语句抓取当前对象关联实体或集合

hibernate抓取策略(集合代理的批量抓取)

设置fetch="join",如:


fetch="join",hibernate
会通过select语句使用外连接来加载其关联实体或集合,不会别外发送一条SQL
此时lazy会失效

hibernate
抓取策略(集合代理的批量抓取)

设置fetch="subselect",如:

fetch="subselect",
另外发送一条select语句抓取在前面查询到的所有实体对象的关联集合

hibernate抓取策略,,batch-szie上的应用

batch-size
属性,可以批量加载实体类,参见:Classes.hbm.xml

例如:有10个班级,每一个班级有10个学生,查询10个学生,每一个学生都在不同的班级,如果不设置batch-size="5"那通过学生在查找班是会发出10 条查询语句,设置了,那就只要发出2 条查询语句,起到了优化SQL的作用

 

hibernate抓取策略,batch-szie在集合上的应用


batch-size
属性,可以批量加载实体类,参见:Classes.hbm.xml


例如:有10个班级,每一个班级有10个学生,查询10个学生,每一个学生都在不同的班级,如果不设置batch-size="5"那通过班级在查找学生是会发出10 条查询语句,设置了,那就只要发出2 条查询语句,起到了优化SQL的作用。

22、hibernate的2级缓存有那些缓存策略?每种缓存策略的使用范围?

hibernate缓存分为:一级缓存和二级缓存

Session缓存:保存持久化对象


SessionFactory:保存配置文件中的元数据和根据这些元数据推出的预定义的
SQL语句

一级缓存:事务级别的缓存,即session缓存,里面存放的是持久化对象,它仅能被当前事务访问。

二级级存:进程级别或群集级别缓存:这里面存放的可以是关联的持久化对象,也可以是持久化对象的散装数据,它能被当前进程的所有事务访问。当里面存放的是关联的持久化对象,当不同的事务访问这些对象时,就会产生并发的几类问题,所在不提倡这种存放形式。当访问持久化对象的散装数据时,每个事务会根据这些散装对象重新组装持久化对象,所在不同的事务之间会获的不同的持久化对象,也就是说在组装完成后,对这些对象的访问不会存在并发问题,它的并发问题被移置到了获的散装数据的范围。在获取散装数据时,为了保证获取正确的数据,所以会存在并发问题。

为了解决二级缓存的并发问题,hibernate提供了4种访问策略:

1.事务型(
RepeatableRead):仅在受管理的环境中适用。适用于经常被读,但很少被修改的数据,可以防止脏读和不可重复读。

2.读写型(
Read Commit):仅在非集群环境中适用。适用于经常被读,但很少被修改的数据,可以防止脏读。

3.非严格读写:不保证缓存中的数据和数据库中的数据的一致性。必须为它设置过期时间,适用于极少被修改,偶尔允许脏读。


4.只读型:适用于从不会被修改的数据。


这四种策略中,事务型的隔离级别最高,只读型最低,在读写二级缓存只的数据时,如果经常被修改,则需要的隔离级别就越高,但并发效率就越低,因此只有满足以下条件的数据才适合存放到二级缓存中:

1.很少被修改

2.不是很重要的数据,偶尔允许出现并发问题。

3.不会被并发访问的数据

4.参考数据


对于以下类型的数据不适合存放到二级缓存中:

1.经常被修改

2.财务数据,不允许出现并发访问。

3.与其他应用共享的数据。因为使用了二级缓存的
hibernate应用与其他应用共享数据,当其他应用修改了数据,hibernate无法保证与数据库中数据的一致性。

 

23、spring中Bean的作用域有哪几种?

Spring中bean的作用域用scope来表示。

scope的值有两个:

singleton为单粒,即Spring IoC容器只会创建该bean的唯一一个实例,这也是默认的。该实例就会一直放在缓存里供大家使用。

prototype为原型,即每一次请求都会产生一个新的bean实例。

 

 

 


你可能感兴趣的:(面试题,j2ee,面试题,tomcat,hibernate,struts2)