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应用当中的常用的设计模式。
具体如下图所示:
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 的工作流程?
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年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》