Struts2面试题

来源:互联网 发布:阿里云企业邮箱怎么样 编辑:程序博客网 时间:2024/06/10 07:00

网上的资源也看了很多,经常问到的,就简单的列一下。

但是对于面试题,此文参考为次,自己总结领悟为主,毕竟一切捷径都是为了提高生产力~



依照惯例上图,这张图就是struts2大法的精髓!

Struts2


1.工作原理
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
2、这个请求经过一系列的过滤器(Filter);
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action ;
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 
5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返
回结果,在这个过程中需要涉及到ActionMapper。


2.ActionInvocation是如何工作的:

ActionInvocation是Xworks 中Action 调度的核心。而对Interceptor 的调度,也正是由ActionInvocation负责。ActionInvocation 是一个接口,而DefaultActionInvocation 则是Webwork 对ActionInvocation的默认实现。
    Interceptor的调度流程大致如下:
    1.ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。
    2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。
    Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWork、WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。


3.Struts 的Action是不是线程安全的?如果不是有什么方式可以保证Action的线程安全?如果是,说明原因
 
struts2的action是线程安全的,struts1的action不是线程安全的 。
对于struts1 ,Action是单例模式,一个实例来处理所有的请求。当第一次**.do的请求过来时,在内存中的actionmapping中找到相对应的action,然后new出这个action放在缓存中,当第二 次一样的请求过来时,还是找的这个action,所以对于struts1来说,action是单实例的 ,只有一个,如果在action中定义变量,就要非常小心了,因为并发问题,可能带来灾难性的后果,也不是不可以,我们可以加锁达到同步,只是在性能上就 要折衷了。
声明局部变量,或者扩展RequestProcessor,让每次都创建一个Action,或者在spring中用scope=”prototype”来管理,不申明类变量就可以保证线程安全。因为只存在一个Action类实例,所有线程会共享类变量。
struts2 在struts1的基础上做了改进 ,对于struts2 ,每次请求过来都会new一个新的action , 所以说struts2的action没有线程安全问题,是线程安全的 , 但同时也带来一个问题,每次都new一个action ,这样action的实例太多 , 在性能方面还是存在一定的缺陷的。




4.使用struts的原因:
JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。
基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件。




5.在struts配置文件中action元素包含哪些属性和子元素?

path属性:指定请求访问Action的路径

type属性:指定Action的完整类名

name属性:指定需要传递给Action的ActionForm Bean

scope属性:指定ActionForm Bean的存放范围

validate属性:指定是否执行表单验证

input属性:指定当表单验证失败时的转发路径。

元素还包含一个子元素,它定义了一个请求转发路径。



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

7.struts2有哪些优点?
1.在软件设计上Struts2的应用可以不依赖于Servlet API和struts API。 Struts2的这种设计属于无侵入式设计;  
2.拦截器,实现如参数拦截注入等功能;  
3.类型转换器,可以把特殊的请求参数转换成需要的类型;  
4.多种表现层技术,如:JSP、freeMarker、Velocity等;  
5.Struts2的输入校验可以对指定某个方法进行校验;  
6.提供了全局范围、包范围和Action范围的国际化资源文件管理实现 

在此强调一下很重要!很大程度就是看你自己对某语言的感觉、感悟、以及感情!

原创粉丝点击