面试之J2EE主流框架

来源:互联网 发布:cc免费顶级域名注册 编辑:程序博客网 时间:2024/04/30 20:00


第一部分Struts2框架

 

1.      说明Struts2框架的工作原理。

参考答案

(1)      客户端向服务器端提交请求,容器初始化HttpServletRequest请求对象。

(2)      请求对象被一系列的Servlet过滤器过滤,Struts2中的过滤器有三种。

(3)      FilterDispatcher过滤器调用ActionMapper,决定该请求是否需要调用某个Action。

(4)      如果请求需要调用某个Action,ActionMapper将通知FilterDispatcher过滤器把请求的处理交给ActionProxy来处理。

(5)      ActionProxy通过Configuration Manager解析框架的配置文件struts.xml,找到需要调用的Action类。

(6)      ActionProxy创建一个ActionInvocation 实例。

(7)      ActionInvocation实例使用命令模式回调Action中的execute方法,Action调用业务逻辑类完成业务逻辑处理。在调用Action的前后,将调用该Action涉及的相关拦截器(Interceptor)。

(8)      Action 执行毕业,ActionInvocation 根据struts.xml中的配置找到对应的返回结果(称为Result)。

2.      Struts2和Struts1有什么区别

参考答案

Struts1最初是Apache Jakarta 项目的一部分,后来作为一个开源的MVC框架存在。Struts1曾经被很多Web应用采用,作为构建MVC的基础框架使用。Struts1最大的特点是提供了JSP标记库以及页面导航。Struts2是从WebWork框架上发展起来的,与Struts1没有直接关系。WebWork是一个很优秀的MVC框架,然而,由于是一个新的框架,在一段时间内并没有被广泛使用。后来,Struts和WebWork社区决定将二者合并,推出Struts2框架。Struts2比起Struts1,新增了很多优点,例如,Struts2的Action与Servlet API解耦,能够进行单元测试,Struts2的试图可以支持多种形式,如JSP、Velocity等。

3.      Struts2中的哪三层控制器?分别有什么作用?

参考答案

(1)      过滤器:过滤器是Strut2控制器的最前端的控制器,请求对象首先被过滤器过滤。

(2)      拦截器:拦截器(Interceptor)是Struts2中第二个层次的控制器,能够在Action执行先后运行一些Action类需要的通用功能。

(3)      Action:Action是Struts2的第三层次的控制器,需要程序员自行开发。Action是Struts2应用中使用数量最好的控制器,负责调用业务逻辑,执行业务操作,根据执行结果返回结果视图,实现页面导航,被称为业务控制器。

4.      如何设置一个包的默认拦截器引用?

参考答案

为一个包指定默认拦截器引用,可以在struts.xml中进行如下配置:

<package name=”com.etc.chapter01” extends=”struts-default”>

<default-interceptor-ref name=”basicStack”/>

</package>

其中default-interceptor-ref的 name 值可以是拦截器的名字,也可以是拦截器栈的名字。

5.      如何编写并配置自定义的拦截器?

参考答案 自定义拦截器的步骤如下:

(1)      创建类实现Interceptor接口。

(2)      覆盖Interceptor接口中的方法,重点实现interceptor方法,定义拦截功能。

(3)      在<package>标签中使用<interceptor>元素定义拦截器,为拦截器类指定一个名字。

(4)      在需要使用该拦截器的Action中使用<interceptor-ref>标签引用拦截器的名字即可使用。

6.      拦截器栈和拦截器有什么区别和联系?

参考答案

拦截器栈是若干个拦截器的集合。如果某些拦截器总是按照一定的顺序一起工作,那么就可以把这些拦截器组成一个拦截器栈,通过引用拦截器栈,就可以使用到栈中所有的拦截器。

7.      Action接口有什么作用?

参考答案

Action 接口中定义了五个常量和一个方法。五个常量都是字符串类型,分别是ERROR,INPUT,LOGIN,NONE以及SUCCESS,方法的声明形式是public String execute()。自定义的Action 类可以实现这个接口,使用其中的常量作为execute方法的返回值,实现execute方法实现业务控制逻辑。

8.      Action类中进行业务控制的方法有什么编码规范?

参考答案

Action类中进行业务控制的方法必须遵守一定的编码规范,即返回值为String,权限为public,没有形式参数。方法的名字默认为execute,可以被自动调用,如果不是execute,则需要进行配置或指定才能使用。

9.      什么是动态方法调用(DMI)

参考答案

如果Action类中的方法名不是execute,可以在JSP中调用Action时指定需要的调用的方法名,这种方式称作DMI,即动态方法调用。在JSP中调用Action的方法为:action=”Action的name!方法名字”,如action=“Account!save“,指定调用名字是Account的Action的save方法。

10.  如果Struts2应用中的一个表单,需要同时有两个提交按钮进行不同处理,如何解决?

参考答案  可以使用提交按钮的method属性指定Action中的方法名字,就可以调用到相应的方法。例如:

<s:form action=”Customer”>

<s:submit value=”Login” method=”login”></s:submit>

<s:submit value=”Register” method=”register”>

</s:form>

上述代码中的表单将提交到名字为Customer的Action上,使用method=”login”将调用Action中 的login方法,使用method=”register”将调用Action中的register方法。

 

11.  如果一个Action类中需要处理请求范围属性,使用什么方法实现可以与Servlet API脱耦?

参考答案

如果要与ServletAPI脱耦,同时又要处理请求属性,那么可以使用Struts2 API中的ActionContext类实现。该类中的put方法可以向请求范围存属性,该类中的get方法可以从请求范围返回属性。

12.  ActionContext类中的哪个方法可以用来处理会话范围的属性?

参考答案 ActionContext中的getSession方法可以返回一个与会话对象相关的Map对象,通过使用该Map对象的put方法,可以往会话中存入属性,通过使用Map对象的get方法可以从会话中返回属性。

13.  ActionContext类中的哪个方法可以用来处理上下文范围内的属性?

参考答案 ActionContext中的getApplication方法可以返回一个与上下文对象相关的Map对象,通过使用该Map对象的put方法可以往上下文中保存属性,通过使用Map对象的get方法可以从上下文中返回属性。

 

14.  如果一个Action类中需要获得Servlet API中的对象进行处理,如何解决?

参考答案

如果Action类中需要获得Servlet API中的对象,那么可以使用ServletActionContext类实现。该类中定义了以下四个方法。

(1)      public static PageContextgetPageContext(): 获得PageContext对象。

( 2 )   public staticHttpServletRequest getRequest(): 获得HttpServletRequest对象。

(3) public static HttpServletResponse getResponse (): 获得HttpServletResponse对象。

(4) public static ServletContext getServletContext(): 获得ServletContext对象。

15 .Struts2框架有哪两种封装请求参数的方式?

参考答案

Struts2中封装请求参数的方式有两种,即Field-Driven和Model-Driven。其中Field-Driven是域驱动,在Action类中定义与请求参数对应的属性,并为之提供getters和setters,Struts2框架将自动把请求参数封装到这些属性中。Model-Driven是模型驱动,Action类需要实现ModelDriven接口,声明一个与表单对应的JavaBean属性,覆盖其中的getModel方法,返回JavaBean实例,Struts2框架将自动把请求参数封装到JavaBean实例中。

16. 什么是OGNL?有什么作用。

参考答案

OGNL是Object Graphic Navigation Lanager的缩写,即对象图导航语言,是一种功能强大的EL。OGNL往往结合Struts2的标记使用,就像EL总是结合JSTL使用一样。

17.OGNL中的#有哪三种作用?

参考答案

(1)      访问非根对象:OGNL上下文的跟对象是值栈,可以直接访问;当访问其他非跟对象是,需要使用#,如#session.cust,可以获得会话范文的cust属性。

(2)      用于过滤集合:如list.{?#this.age>20},取出年龄大于20的集合元素。

(3)      用来构造Map:如#{“cust0”:cust0, “cust1”:cust1},可以构建一个Map对象,包含两对键值记录。

18.OGNL中的%有什么作用?

参考答案

%号用来计算OGNL表达式的值。

19.OGNL中的$可以在哪些场合使用?

参考答案

(1)      国际化资源文件中使用:在国际化资源文件中,使用${}引用OGNL表达式。

(2)      Struts2的配置文件中使用:使用${}引用OGNL表达式。

 

20.struts.properties文件有什么作用?

参考答案

struts.properties文件可以用来定义Struts2框架的属性,能够修改default.properties文件中的默认属性值。

21.如果一个Struts2应用中有多个模块,每个模块都有一个配置文件,如何处理?

参考答案

实际开发过程中,往往是多模块同时开发。可以对每个模块定义一个配置文件,最终在struts.xml的根元素<struts>下使用<include>包含即可,如下所示:

<struts>

<include file=”/bbs/bbs.xml”></include>

<include file=”/news/news.xml”></include>

</struts>

 

22.ActionSupport类有什么作用?

参考答案

ActionSupport类定义了一系列与输入校验有关的方法,如果Action需要对输入进行校验,那么Action必须继承ActionSupport类。

 

23.Struts2中有哪三种校验信息?分别有什么含义?

参考答案

Struts2中有以下三种校验信息:

(1)      Action错误:指的是Action级别的错误,不和某个域的输入直接相关。

(2)      Field错误:指的是域级别的错误,和某个输入域有关的校验错误。

(3)      Action消息:不是错误信息,而是一些友好的提示信息。

24.如果校验失败,Struts2将导航在什么视图上?

参考答案

如果校验失败,Struts2框架将导航到当前Action中的名字是input的结果视图上,如果Action中没有名字为input的结果视图,则查找名字为input的全局结果,如果依然没有,则发生错误。

25.如何使用校验器校验Struts2应用的输入信息?

参考答案

(1)      Action类继承ActionSupport类,但是不需要覆盖validate方法。

(2)      在Action类所在包中定义XXX-validation.xml文件,其中XXX是Action的类名。

(3)      在XML 文件中配置校验器的信息,一般需要制定需要校验的域名字、校验器的名字、校验器中的属性值等,如下所示:

<field name=”custname”>

              <field-validatortype=”requiredstring”>

                                   <paramname=”trim”>true</param>

                          <message key=”custname.null”></message>

              </field-validator>

</field>

其中custname是要进行校验的域名字,type=”requiredstring”指定的是验证器的名字,使用<param>指定校验器的参数名和对应的值,<message>指定校验错误时的显示信息。

 

26.Struts2中<property>标签有什么作用?请使用代码说明。

参考答案

<property>用来输出值栈中的值,代码如下:

<s:property value=”#session.customer.custname”/>

上述代码将输出会话范围内名字为customer属性的custname值。

27.如何在strust.xml中配置异常处理界面?

参考答案

在struts.xml中可以使用<exception-mapping>配置异常处理页面,如下所示:

<action name=”Register” class=”com.etc.action.RegisterAction”>

<exception-mapping result=”regfail”exception=”com.etc.exception.RegisterException”>

</exception-mapping>

       <resultname=“regsuccess”>/index.jsp</result>

<result name=“regfail”>/register.jsp</result>

<result name=“input”>/register.jsp</result>

</action>

通过上面的配置,当发生了RegisterException却没有被处理时,将自动跳转到regfail结果视图进行处理,即register.jsp页面。

28.全局异常映射与局部异常映射有什么区别?

参考答案

全局异常映射在<package>中指定,而全局异常映射在<action>中指定。Struts2框架总是现在局部范围查找有没有符合需要的配置,如果没有找到才到全局范围查找。

 

 

第二部分Hibernate框架

1.      Hibernate框架主要解决什么问题?

参考答案

Hibernate框架式一个ORM框架,即对象关系映射框架。能够将Java类与关系数据表进行映射,同时提供面向对象的数据查询机制,能够最大程度缩短程序员在SQL和JDBC上的编程时间,从大量的数据持久层编程工作中解脱出来。

2.      Hibernate属性文件包括哪些内容?

参考答案

数据库访问的相关信息需要在Hibernate属性文件中配置,如数据库驱动类、连接串、用户名、密码、连接池初始化大小等。也可以使用名字为hibernate.cfg.xml的xml文件配置属性。

3.      Hibernate应用中的映射文件(hbm.xml)主要包括哪些内容?

参考答案

映射文件中所有元素都存在于根元素hibernate-mapping下,其中使用最多的元素是class。class元素下最常用的子元素有id、property、component、subclass、joined-subclass、union-subclass等。

4.      Hibernate中持久化对象有哪三种状态?每种状态有什么特征?

参考答案

(1)      瞬时状态(transient state):当通过new操作符实例化一个对象,而这个对象没有被Session对象操作,也就是该对象没有与一个Session对象关联时,那么这个对象就称为瞬时状态对象。瞬时状态的对象不能被持久化到数据库中,也不会被赋予持久化标识(Identifier)。

(2)      持久状态(persistent state):如果一个对象与某一个Session对象关联,例如被Session对象刚加载的、刚保存的、刚更新的,那么该对象就称为持久状态对象。

持久状态的对象与数据库中一条记录对应,并拥有持久化标识(Identifier)。当持久状态对象有改变时,当前事务提交后,Hibernate会自动检测到对象的变化,并持久化到数据库中。

(3)      脱管状态(detached state):当与持久化状态对象关联的Session关闭后,该对象就变成脱管状态(detached state)。脱管状态的对象引用依然有效,可以继续使用。当脱管状态的对象再次与某个Session关联后,脱管状态对象将转变为持久化对象,脱管期间进行的修改将被持久化到数据库中。

5.      HQL语言SQL语言有什么区别?

参考答案

主要有以下三点区别:

(1)      HQL语言中出现的是类名、属性名;SQL语言中出现的是表名、字段名。

(2)      HQL语言严格区分大小写;SQL语言不区分大小写。

(3)      HQL语言理解继承、多态等面向对象的概念。

6.      一对多/多对一关联有哪俩种实现方式?

参考答案

一对多/多对一关联主要有以下俩种实现方式:

(1)      基于主外键的一对多/多对一关联:这种关联指的是从表通过外键参考主键的主键,从而实现关联。

(2)      基于连接表的一对多/多对一关联:这种关联指的是两个表之间不直接关系,而是把各自的主键存放到关联表中,维护二者的关联关系。

7.      什么是Hibernate中的TPS?

参考答案

TPS(Table PerSubclass)是Hibernate中一个实现继承映射的策略,即每个子类对应一张表,TPS使用<joined-subclass>元素配置子映射关系。

8. 什么是Hibernate中的TPH?

参考答案

       TPH(Table Per Class Hierarchy)是Hibernate中一种实现继承映射策略,即每个子类对应的是表的一个分层结构。TPH策略中,使用<subclass>来配置子类指定子类的区分字段值,同时配置子类扩展的属性。

9.什么是延迟加载?如何设置是否使用延迟加载?

参考答案

延迟加载的意思是,当查询某个实例是,默认情况下不查询其关联的实例。使用属性lazy可以设置是否使用延时加载,lazy=”true”表示使用延时加载,lazy=”false”表示不使用延时加载。

 

 

第三部分Spring框架

1.      什么是IoC?IoC有什么作用?

参考答案

IoC即控制反转,也被称为DI,即依赖注入。IoC的意识是,将对象的创建以及装配过程提交容器实现,而不再使用代码进行。使用IoC创建并装配对象,能够使用应用可以不管将来具体实现,完全在一个抽象层次进行描述和技术架构,使得应用的可扩展性提高。

2.      什么是AOP?AOP有什么作用?

参考答案

AOP(AspectOriented Program)编程能够通过的功能与业务模块分离,是OOP编程的延续和补充。在企业应用中,很多模块可能需要实现相同功能,如多个模块都需要日志功能、权限校验功能、事务管理功能等,这些相同的功能就被称为“切面“。使用AOP编程可以单独对“切面”编程,然后将这些切面动态织入到功能模块中。

3.      Spring框架整合JDBC时,主要使用哪个类简化JDBC操作?

参考答案

使用JdbcTemplate类简化JDBC操作。

4.      Spring框架整合Hibernate是,主要使用哪个类简化Hibernate操作?

参考答案

使用HibernateTemplate类简化Hibernate操作。

5.      Spring框架整合Struts2框架时主要需要哪些步骤?

参考答案

(1)      web.xml中添加listener以及context-param的配置;

(2)      struts.properties中指定struts.objectFactory的常量值为spring;

(3)      struts.xml文件中Action的class属性可以进行简化;

(4)      applicationContext.xml中将Action进行IoC装配;

(5)      完善Action类,声明Action需要关联的属性并提供setter方法。


0 0
原创粉丝点击