struts2面试题


1、描述Struts2的工作原理

答:客户端发送请求--》请求经过一系列过滤器--》FilterDispatcher通过ActionMapper来决定这个Request需要调用哪个Action --》FilterDispatcher把请求的处理交给ActionProxy--》通过ConfigurationManager询问Struts配置文件(Struts.xml),找到需要调用的Action类--》ActionProxy创建一个ActionInvocation的实例 --》调用Action--》执行完毕,返回结果

2、Struts2中的拦截器有什么用?列举框架提供的拦截器名称?(至少3种,可用中文名)

答:  1)拦截器是struts2核心组成部分,它提供了一种机制,使得开发者可以定义一个特定的功能模块,这个模块会在Action执行之前或者之后执行,也可以在Action执行之前阻止Action执行。 

 2)常用的拦截器有: 

 chain:在不同请求之间将请求参数在不同名字件转换,请求内容不变 

 fileUpload:提供文件上传。 

 ​i18n:记录用户选择的区域环境 

 logger:输出Action的名字

 params:将请求中的参数设置到Action中去。

3、Struts2有哪些优点?

答:

 1)在软件设计上Struts2的应用可以不依赖于Servlet API和struts API。 Struts2的这种设计属于无侵入式设计; 

 2)拦截器,实现如参数拦截注入等功能;

 3)类型转换器,可以把特殊的请求参数转换成需要的类型; 

 4)多种表现层技术,如:JSP、freeMarker、Velocity等;

 5)Struts2的输入校验可以对指定某个方法进行校验;

 6)提供了全局范围、包范围和Action范围的国际化资源文件管理实现 

 7) 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现。有丰富的tag可以用,大大提高了开发效率。(简要)

4、什么是OGNL,有什么用途?如何访问存放在session中叫user的对象的username属性

​答:OGNL是Object-Graph Navigation Language的缩写,也叫对象导航语言。它是Struts的一种功能强大的表达式语言列如:访问session中的user对象的username属性:注意的是:使用前需要在页面头部导入taglib prefix="s" uri="/struts-tags"

​5、什么是国际化,struts2实现国际化的原理?

答:国际化是根据不同的国家和地区的语言文化的不同,所设计的适用于不同地区的编码格式。 

实现方法: 

1)首先在src目录下新建message_en.properties(英文); 

2)页面获取国际化信息或者使用 

原理:程序得到当前运行环境的国际/区域,语言环境并存放于Locale,ResourceBundle根据Locale中信息自动搜索对应的国际化资源文件并加载。

6、AJAX是什么? 描述ajax的原理

答:Ajax又叫异步刷新,(JavaScript和xml)原理:使用HttpRequest向服务器发送异步请求,服务器返回处理结果

7、什么是反射?请用反射动态创建一个类的对象(写关键代码,其它可省略)

答:反射,程序运行时动态获取类型信息,完成对象创建,方法调用等。

例如:

Class myclass=Class.forNama("包名.类名");
Student stu=Factory.createInstance("stu1");

8、在struts2中如何实现转发和重定向?

答:在struts.xml中配置type="redirect"(重定向);type="redirectAction"(转发)

9、Struts2中的type类型有哪些?至少写4种

答:chain,redirect,redirectAction,json,dispatcher

10、struts2默认能解决get和post提交方式的乱码问题吗?

答:不能。struts.i18n.encoding=UTF-8属性值只能解析POST提交下的乱码问题。

11、说下Struts的设计模式

答:MVC模式: 

1)web应用程序启动时就会加载并初始化ActionServler。

2)用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法. 

3)Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。

12、拦截器和过滤器的区别

答: 

 1)拦截器是基于java反射机制的,而过滤器是基于函数回调的。 

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

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

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

 5)在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

13、请你写出struts2中至少5个的默认拦截器?

答: 

 fileUpload 提供文件上传功能 

 i18n 记录用户选择的locale 

 cookies 使用配置的name,value来是指cookies 

 checkbox 添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的 checkbox。 

 chain 让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。

 alias 在不同请求之间将请求参数在不同名字件转换,请求内容不变

14、ActionContext、ServletContext、pageContext的区别?

答: 

 1)ActionContext是当前的Action的上下文环境,通过ActionContext可以获取到request、session、ServletContext等与Action有关的对象的引用; 

 2)ServletContext是域对象,一个web应用中只有一个ServletContext,生命周期伴随整个web应用; 

 3)pageContext是JSP中的最重要的一个内置对象,可以通过pageContext获取其他域对象的应用,同时它是一个域对象,作用范围只针对当前页面,当前页面结束时,pageContext销毁, 生命周期是JSP四个域对象中最小的。

15、拦截器的生命周期与工作过程?

答: 

 1)每个拦截器都是实现了Interceptor接口的 Java 类; 

 2)init(): 该方法将在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化; 

 3)intercept(ActionInvocation invocation): 每拦截一个动作请求, 该方法就会被调用一次; 

 4)destroy: 该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次; 

 5)struts2中有内置了18个拦截器。

16、用自己的话简要阐述struts2的执行流程。

答: Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。   

1)核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。 

2)业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。 

 Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2是WebWork的升级版本。 

 基本简要流程如下:

 1)客户端浏览器发出HTTP请求。 

 2)根据web.xml配置,该请求被FilterDispatcher接收。 

 3)根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。 

 4)Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。 

 5)Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。

 6)返回HTTP响应到客户端浏览器。

更多struts2详细教程请访问struts2教程