Java面试题集(86-115)(一)

2014-11-24 07:32:10 · 作者: · 浏览: 4

Java程序员面试题集(86-115)

86、Struts 2中,Action通过什么方式获得用户从页面输入的数据,又是通过什么方式把其自身的数据传给视图的?

答:Action从页面获取数据有三种方式:

1)通过Action属性接受参数

2)通过域模型获取参数

3)通过模型驱动获取参数 (ModelDriven

Action将数据存入值栈(Value Stack)中,视图可以通过表达式语言(EL)从值栈中获取数据。

87、简述Struts 2是如何实现MVC架构模式的。

答:MVC架构模式要求应用程序的输入、处理和输出三者分离,将系统分成模型(Model)、视图(View)、控制器(Controller)三个部分,通过控制器实现模型和视图的解耦合,使得应用程序的开发和维护变得容易,如下图所示。其中,模型代表了应用程序的数据和处理这些数据的规则,同时还可以为视图提供的查询保存相关的状态,通常由JavaBean来实现,模型的代码写一次就可以被多个视图重用;视图用来组织模型的内容,它从模型中获得数据,并将数据展现给用户,在Struts 2中通常由JSP页面、Freemarker模板等来实现;控制器负责从客户端接受请求并将其转换为某种行为,行为完成后再选择一个视图来呈现给用户,控制器本身不需要输出任何内容,它只是接收请求并决定调用哪个模型组件去处理请求,StrutsPrepareAndExecuteFilter过滤器是Struts 2中的核心,它和一系列的Action构成了Struts 2中的控制器。

\

图-1 MVC架构模式图

88、阐述Struts 2如何实现用户输入验证。在你做过的项目中使用的是那种验证方式,为什么选择这种方式?

答:Struts 2可以使用手动验证和自动验证框架实现用户输入验证。自动验证框架是将对输入的验证规则放在XML文件中,这种方式比较灵活,可以在不修改代码的情况下修改验证的规则。

89、阐述Struts 2中的Action如何编写?Action是否采用了单例?

答:Struts2的Action有三种写法:

1)POJO

2)实现Action接口重写execute()方法

3)继承ActionSupport类

Action没有像Servlet一样使用单实例多线程的工作方式,很明显,每个Action要接收不同用户的请求参数,这就意味着Action是有状态的,因此在设计上使用了每个请求对应一个Action的处理方式。

90、Struts 2中的Action并没有直接收到用户的请求,那它为什么可以处理用户的请求,又凭什么知道一个请求到底交给哪个Action来处理?

答:Struts2的核心过滤器接收到用户请求后,会对用户的请求进行简单的预处理(例如解析、封装参数),然后通过反射来创建Action实例,并调用Action中指定的方法来处理用户请求。

要决定请求交给哪一个Action来处理有两种方式:1利用配置文件:可以在配置文件中通过 标签配置和请求对应的Action类以及要调用的方法;2利用约定:Struts2中可以使用约定(convention)插件,例如约定xxx总是对应XxxAction,这是对约定优于配置理念的践行。

91、你经常用到的Struts 2常量配置有哪些?

答:

1)struts.i18n.encoding 指定默认编码

2)struts.objectFactory/ struts.objectFactory.spring.autoWire 对象工厂 / Spring的自动装配方式(名字、类型)

3)struts.devMode 是否使用开发模式

4)struts.locale 指定默认区域,默认值是en_US

5)struts.i18n.resources 国际化使用的资源文件

6)struts.enable.DynamicMethodInvocation 是否允许动态方法调用

92、简述Struts2的异常处理机制。

答:Struts 2提供了声明式的异常处理机制,可以在配置文件中加入如下代码:

93、说一下你对约定优于配置(CoC)的理解。

答:约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量。本质是说,开发人员仅需规定应用中不符约定的部分。例如,如果模型中有个名为Sale的类,那么数据库中对应的表就会默认命名为sales。只有在偏离这一约定时,例如将该表命名为products_sold,才需写有关这个名字的配置。如果您所用工具的约定与你的期待相符,便可省去配置;反之,你可以配置来达到你所期待的方式。遵循约定虽然损失了一定的灵活性,不能随意安排目录结构,不能随意进行函数命名,但是却能减少配置。更重要的是,遵循约定可以帮助开发人员遵守构建标准,包括各种命名的规范。

94、Struts2中如何实现I18N?

答:首先,为不同语言地区编写不同的资源文件;然后在Struts 2配置文件中配置struts.i18n.custom.resources常量;在Action中可以通过调用getText()方法读取资源文件获取国际化资源。

95、简述拦截器的工作原理以及你在项目中使用过哪些自定义拦截器。

答:Struts 2中定义了拦截器的接口以及默认实现,实现了Interceptor接口或继承了AbstractInterceptor的类可以作为拦截器。接口中的init()方法在拦截器被创建后立即被调用,它在拦截器的生命周期内只被调用一次,可以在该方法中对相关资源进行必要的初始化。每拦截一个请求,intercept()方法就会被调用一次。destory()方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次。

项目中使用过的有权限拦截器、执行时间拦截器、令牌拦截器等。

96、如何在Struts2中使用Ajax功能?

答:以下是Struts 2中实现Ajax的可选方式:

1)JSON plugin+ jQuery

2)DOJO plugin

3)DWR (DirectWeb Remoting)

97、谈一下拦截器和过滤器的区别。

答:拦截器和过滤器都可以用来实现横切关注功能,其区别主要在于:

1)拦截器是基于Java反射机制的,而过滤器是基于接口回调的。

2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器。

3)拦截器只能对Action请求起作用,而过滤器可以对所有请求起作用。

4)拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。

98、谈一下Struts 1和Struts2的区别。

不同点

Struts 1

Struts 2

Action 类

要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。

Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts 2提供一个ActionSupport类去作为Action的父类,但不是必须的,任何有execute方法的POJO对象都可以用作Struts 2的Action对象。

线程模式

Action是