Struts2面试题及答案(16道常见经典题解析)

Struts2面试题及答案(16道常见经典题解析)-mikechen

Struts面试题经常是Java面试问到的话题,今天给大家总结了一份Struts面试题及答案@mikechen

Struts的理解?

Struts2是Apache软件组织推出的一个基于MVC模式的轻量级Web框架,其实它就是一个大大的Servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。

Struts框架可以减少你应用MVC(Model- View -Controller)设计模式的开发时间,从而提高开发效率。

 

Struts的工作原理?

谈到Struts就不得不提到MVC设计模式,MVC即Model-View-Controller的缩写,它是web应用当中的常用的设计模式。

具体如下图所示:

Struts2面试题及答案(16道常见经典题解析)-mikechen

MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化,Struts是MVC的一种实现。

1)控制(Controller)

在Struts中ActionServlet起着一个控制器(Controller)的作用,这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点,它截取和分发这些请求到相应的动作类,这些动作类都是Action类的子类。

另外控制组件也负责用相应的请求参数填充 Action Form,通常称之为FromBean,并传给动作类:通常称之为ActionBean。

动作类实现核心商业逻辑,所有这些控制逻辑利用Struts-config.xml文件来配置。

 

2)视图(JSP)

主要是由Jsp来控制页面输出的。它接收到Action Form中的数据,利用html,taglib,bean,logic等显示数据。

 

3)模型(JavaBean)

在Struts中,主要存在三种bean,分别是:Action,ActionForm,EJB或者Java Bean。ActionForm用来封装客户请求信息,Action取得ActionForm中的数据,再由EJB或者Java Bean进行处理。

 

Struts有哪些优缺点?

优点:

1) 实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现;

2)struts提供了丰富的标签库,比如:jstl等,大大提高了开发的效率;

3) Struts2提供丰富的拦截器实现,Struts2 的拦截器是一个 Action 级别的 AOP, Struts2 中的 许多特性都是通过拦截器来实现的, 例如异常处理,文件上传,验证等。拦截器 是可配置与重用;

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

5)Struts能很好的与 hibernate、spring整合。

 

缺点:

1) 传参麻烦,要经过默认的拦截器,参数过多就会臃肿,而且参数校验繁琐;

2) 安全性有待提高,被爆漏洞多。

 

struts2框架的核心控制器是什么?作用?

1)Struts2框架的核心控制器是:StrutsPrepareAndExecuteFilter:
2)作用:负责拦截由

<url-pattern>/*</url-pattern>

指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。

 

Struts2 的工作流程?

Struts2面试题及答案(16道常见经典题解析)-mikechen

1)客户端初始化一个指向Servlet容器的请求,比如:浏览器发送请求,该请求经过过滤器Filter后指向核心控制器FilterDispatcher;
2)核心控制器,根据请求询问ActionMapper,需要调用哪个Action;
3)ActionMapper把决定告诉核心控制器,核心控制器再把请求的处理交给ActionProxy;
4)ActionProxy,通过Configuration Manager询问框架的配置文件,找到需要调用的Action类,创建一个ActionInvocation的实例;
5)ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器Intercepter的调用;
6)一旦Action执行完毕ActionInvocation负责根据struts.xml中的配置找到对应的返回结果;
7)响应的返回是通过我们在web.xml中配置的过滤器;
8)如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理sreadlocal ActionContext,如果ActionContextCleanUp不使用则将会去清理sreadlocals。

 

Struts2是如何启动的?

struts2框架是通过Filter启动的,即StrutsPrepareAndExecuteFilter,此过滤器为struts2的核心过滤器;

StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作;

struts2读取到struts.xml的内容后是将内容封装进javabean对象然后存放在内存中,以后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件。

 

Struts2 拦截器 和 过滤器 的区别?

①、过滤器依赖于 Servlet 容器,而拦截器不依赖于 Servlet 容器。

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

③、拦截器可以访问 Action 上下文(ActionContext)、值栈里的对象 (ValueStack),而过滤器不能.

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

 

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

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

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

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

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

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

 

谈谈Struts2 中的拦截器?

拦截器是Struts2框架的核心,它主要完成解析请求参数,将请求参数赋值给Action属性,执行数据校验,文件上传等工作。

Struts2设计的灵巧性,拦截器起了关键性的作用,当需要扩展Struts2功能时,只需要提供对应拦截器,并将它配置在Struts2容器中即可。

Struts2内建了大量的拦截器,这些拦截器以name-class对的形式配置在struts-default. xml文件中,其中name是拦截器的名字,就是以后我们使用该拦截器的唯一标识。

 

Struts2常用的拦截器有哪些?

常用的拦截器有:

  • chain:在不同请求之间将请求参数在不同名字件转换,请求内容不变;
  • fileUpload:提供文件上传;
  • i18n:记录用户选择的区域环境;
  • logger:输出Action的名字;
  • params:将请求中的参数设置到Action中去。

 

Struts2 中的默认包 struts-default 有什么作用?

struts-default 包是 struts2 内置的,它定义了 struts2 内部的众 多拦截器和 Result 类型,而 Struts2 很多核心的功能都是通过这些内置的拦 截器实现,如:从请求中把请求参数封装到 action、文件上传和数据验证等等 都是通过拦截器实现的。当包继承了 struts-default 包才能使用 struts2 为我 们提供的这些功能

 

Struts2如何使用 Ajax 功能 ?

  • JSON plugin
  • DOJO plugin
  • DWR plugin
  • 使用 Stream 结果类型

 

Struts2中的type类型有哪些?

可以参看 struts-default.xml 中的相关配置:

  • dispatcher(转发)
  • chain(转发到Action)
  • redirect(重定向)
  • redirectAction(重定向到Action)
  • json

 

ActionContext、ServletContext、pageContext的区别?

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

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

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

生命周期是JSP四个域对象中最小的。

 

Struts2与Struts1的与区别?

1)struts1与struts2都是mvc框架的经典实现模式,Struts2不是从Struts1升级而来,而是有WebWork改名而来;

2)struts1的前端控制器是一个Servlet,名称为ActionServlet,struts2的前端控制器是一个filter;

3)struts1的action需要继承Action类,struts2的action可以不继承任何类;

4)在struts1中使用formbean封装请求参数,在struts2中直接使用action的属性来封装请求参数;

5)与Struts1不同Struts2对用户的每一次请求都会创建一个Action,所以Struts2中的Action是线程安全的;

 

SpringMVC 和 Struts2 的区别?

  • Struts2是类级别的拦截,一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文;
  • Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上Struts2是比较耗费内存的;
  •  拦截器实现机制上Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大;
  •  SpringMVC的入口是Servlet,而Struts2是filter(这里要指出,filter和servlet是不同的),这就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。
  • SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱,Spring MVC和Spring是无缝的。
  • 设计思想上,Struts2更加符合OOP的编程思想,SpringMVC就比较谨慎,是servlet上扩展;
  • SpringMVC开发效率和性能高于Struts2,SpringMVC可以认为已经100%零配置。

 

 

 

 

 

 

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法