Struts2是用Java开发Web应用程序的著名框架之一。 最近,我写了很多Struts2教程 ,在这篇文章中,我列出了一些重要的Struts2面试问题以及答案,以帮助您进行面试。
- 什么是Struts2?
- Struts1和Struts2之间有什么区别,或者Struts2比Struts1更好?
- 什么是Struts2核心组件?
- Struts2中的拦截器是什么?
- Struts2拦截器实现哪种设计模式?
- 在Struts2中创建Action类的不同方式有哪些?
- Struts2动作和拦截器是否是线程安全的?
- Struts2中的Front Controller是哪个类?
- Struts2中的Interceptor有什么好处?
- 什么是ValueStack和OGNL?
- 命名一些在Struts2中引入的有用注释?
- 提供一些重要的Struts2常量?
- Struts2中的动作映射中名称空间的用途是什么?
- 哪个拦截器负责将请求参数映射到动作类Java Bean属性?
- 哪个拦截器负责i18n支持?
- 将Action接口和ActionSupport类用于我们的操作类有什么区别,您希望使用哪一个?
- 我们如何在动作类中获取Servlet API请求,响应,HttpSession等对象?
- execAndWait拦截器有什么用?
- Struts2中的令牌拦截器有什么用?
- 我们如何将log4j集成到Struts2应用程序中?
- 有什么不同的Struts2标签? 我们如何使用它们?
- Struts2中的自定义类型转换器是什么?
- 我们如何编写自己的拦截器并将其映射为行动?
- 拦截器的生命周期是多少?
- 什么是拦截器堆栈?
- 什么是struts-default软件包,它有什么好处?
- Struts2操作URI的默认后缀是什么,我们如何更改它?
- 结果页面的默认位置是什么,我们如何更改它?
- 我们如何在Struts2应用程序中上传文件?
- 开发Struts2应用程序时应遵循的最佳实践是什么?
-
什么是Struts2?
Apache Struts2是一个开放源代码框架,可以用Java构建Web应用程序。 Struts2基于OpenSymphony WebWork框架。 它比Struts1有了很大的改进,使其更加灵活,易于使用和扩展。 Struts2的核心组件是“操作”,“拦截器”和“结果”页面。
Struts2提供了许多方法来创建Action类并通过struts.xml或通过注释对其进行配置。 我们可以为常见任务创建自己的拦截器。 Struts2带有很多标签,并使用OGNL表达式语言。 我们可以创建自己的类型转换器来呈现结果页面。 结果页面可以是JSP和FreeMarker模板。
-
Struts1和Struts2之间有什么区别,或者Struts2比Struts1更好?
Struts2旨在克服Struts1的缺点,并使它更加灵活,可扩展。 一些明显的区别是:
组件 Struts1 Struts2 动作班 Struts1动作类被强制扩展一个Abstract Class,使其无法扩展。 Struts2动作类非常灵活,我们可以通过实现Action接口,扩展ActionSupport类或仅具有execute()方法来创建它们。 线程安全 Struts1操作类是Singleton且不是线程安全的,因此在开发人员方面要格外小心,以免由于多线程而产生任何副作用。 每个请求都会实例化Struts2动作类,因此不存在多线程处理并使它们成为线程安全的。 Servlet API耦合 Struts1 API与Servlet API紧密耦合,并且Request和Response对象传递给操作类execute()方法。 Struts2 API与Servlet API松散耦合,并自动将表单bean数据映射到我们最常用的动作类java bean属性。 但是,如果需要引用Servlet API类,则可以使用* Aware接口。 测试中 由于Servlet API耦合,Struts1动作类很难测试。 Struts2 Action类就像普通的Java类一样,我们可以通过实例化它们并设置它们的属性来轻松地对其进行测试。 请求参数映射 Struts1要求我们创建ActionForm类来保存请求参数,并且需要在struts配置文件中对其进行配置。 Struts2请求参数映射是动态完成的,我们需要做的是在动作类中具有Java Bean属性,或者实现ModelDriven接口以提供用于映射的Java Bean类名称。 标签支持 Struts1使用JSTL标签,因此受到限制。 Struts2使用OGNL并提供各种UI,控件和数据标签。 它更加通用且易于使用。 验证方式 Struts1支持通过手动validate()方法进行验证 Struts2支持手动验证以及验证框架集成。 视图渲染 Struts1使用标准的JSP技术为JSP页面提供bean值以供查看。 Struts2使用ValueStack存储请求参数和属性,我们可以使用OGNL和Struts2标签访问它们。 模块支持 Struts1模块设计复杂,看起来像单独的项目 Struts2为软件包提供“命名空间”配置,以轻松创建模块。 -
什么是Struts2核心组件?
Struts2的核心组件是:
- 动作班
- 拦截器
- 结果页面,FreeMarker模板的JSP
- ValueStack,OGNL和标签库
-
Struts2中的拦截器是什么?
拦截器是Struts2框架的基础。 Struts2拦截器负责框架完成的大多数处理,例如将请求参数传递给动作类,使Servlet API请求,响应,可用于动作类的会话,验证,i18n支持等。
ActionInvocation负责封装Action类和拦截器,并按顺序触发它们。 在ActionInvocation中使用的最重要的方法是invoke()方法,该方法跟踪拦截器链并调用下一个拦截器或操作。 这是Java EE框架中“责任链”模式的最佳示例之一。
-
Struts2拦截器实现哪种设计模式?
Struts2拦截器基于拦截过滤器设计模式。 在拦截器堆栈中调用拦截器非常类似于责任链设计模式。
-
在Struts2中创建Action类的不同方式有哪些?
Struts2提供了创建动作类的不同方法。
- 通过实现动作界面
- 使用Struts2 @Action注释
- 通过扩展ActionSupport类
- 任何将execute()方法返回String的普通Java类都可以配置为Action类。
-
Struts2动作和拦截器是否是线程安全的?
Struts2 Action类是线程安全的,因为会为处理该请求的每个请求实例化一个对象。
Struts2拦截器是单例类,并且创建了一个新线程来处理请求,因此它不是线程安全的,我们需要仔细实现它们,以避免共享数据出现任何问题。
-
Struts2中的Front Controller是哪个类?
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
是Struts2中的Front Controller类,每个请求处理都从该类开始。 早期版本的Struts2使用org.apache.struts2.dispatcher.FilterDispatcher
作为Front Controller类。 -
Struts2中的Interceptor有什么好处?
拦截器的一些好处是:
- 拦截器在实现高级别关注点分离方面起着至关重要的作用。
- Struts2拦截器是可配置的,我们可以将其配置为所需的任何操作。
- 我们可以创建自己的自定义拦截器来执行一些常见任务,例如请求参数记录,身份验证等。这有助于我们在单个位置处理常见任务,从而降低了维护成本。
- 我们可以创建拦截器堆栈以用于不同的动作。
-
什么是ValueStack和OGNL?
ValueStack是Struts2将应用程序数据存储在其中的存储区域,用于处理客户端请求。 数据存储在使用ThreadLocal的
ActionContext
对象中,该对象具有特定于特定请求线程的值。对象图导航语言(OGNL)是一种功能强大的表达语言,用于处理存储在ValueStack上的数据。 从体系结构图中可以看到,拦截器和结果页面都可以使用OGNL访问存储在ValueStack上的数据。
-
命名一些在Struts2中引入的有用注释?
Struts2中引入的一些重要注释是:
- @Action创建动作类
- @Actions为多个动作配置单个类
- @Namespace和@Namespaces用于创建不同的模块
- 结果页的@Result
- @ResultPath用于配置结果页面的位置
-
提供一些重要的Struts2常量?
我使用的一些Struts2常数是:
- struts.devMode以开发模式运行我们的应用程序。 此模式不会重新加载属性文件,并提供额外的日志记录和调试功能。 这在开发应用程序时非常有用,但在将代码移至生产环境时应将其关闭。
- struts.convention.result.path来配置结果页面的位置。 默认情况下,Struts2在{WEBAPP-ROOT} / {Namespace} /中查找结果页面,我们可以使用此常量更改位置。
- struts.custom.i18n.resources定义用于i18n支持的全局资源束。
- struts.action.extension为Struts2应用程序配置URL后缀。 默认后缀为.action,但有时我们可能希望将其更改为.do或其他名称。
我们可以在struts.xml文件中配置上述常量,如下所示。
<constant name="struts.devMode" value="true"></constant> <constant name="struts.action.extension" value="action,do"></constant> <constant name="struts.custom.i18n.resources" value="global"></constant> <constant name="struts.convention.result.path" value="/"></constant>
-
Struts2中的动作映射中名称空间的用途是什么?
Struts2名称空间配置使我们可以轻松创建模块。 我们可以使用名称空间根据动作类的功能来分隔它们,例如admin,user,customer等。
-
哪个拦截器负责将请求参数映射到动作类Java Bean属性?
com.opensymphony.xwork2.interceptor.ParametersInterceptor
拦截器负责将请求参数映射到Action类java bean属性。 该拦截器在struts-default软件包中配置为“ params”。 此拦截器是basicStack和defaultStack拦截器堆栈的一部分。 -
哪个拦截器负责i18n支持?
com.opensymphony.xwork2.interceptor.I18nInterceptor
拦截器负责Struts2应用程序中的i18n支持。 该拦截器在名为“ i18n”的struts-default软件包中配置,并且是i18nStack和defaultStack的一部分。 -
将Action接口和ActionSupport类用于我们的操作类有什么区别,您希望使用哪一个?
我们可以实现Action接口来创建我们的动作类。 该接口具有我们需要实现的单个方法execute()。 使用此接口的唯一好处是它包含一些可用于结果页的常量,这些常量是SUCCESS,ERROR,NONE,INPUT和LOGIN。
ActionSupport类是Action接口的默认实现,它也实现与Validation和i18n支持相关的接口。 ActionSupport类实现Action,Validateable,ValidationAware,TextProvider和LocaleProvider接口。 我们可以重写ActionSupport类的validate()方法以在我们的操作类中包括字段级验证登录。
根据需求,我们可以使用任何方法来创建struts 2动作类,我最喜欢的是ActionSupport类,因为它有助于在动作类中轻松编写验证和i18n逻辑。
-
我们如何在动作类中获取Servlet API请求,响应,HttpSession等对象?
Struts2操作类不提供对Servlet API组件(如请求,响应和会话)的直接访问。 但是有时我们需要在操作类中进行这些访问,例如检查HTTP方法或设置cookie以响应。
因此,Struts2 API提供了一堆* Aware接口,我们可以实现这些接口来访问这些对象。 Struts2 API使用依赖项注入将Servlet API组件注入到动作类中。 一些重要的Aware接口是SessionAware,ApplicationAware,ServletRequestAware和ServletResponseAware。
您可以在Struts2 Action Classes教程中的如何获取Servlet API会话中了解有关它们的更多信息。
-
execAndWait拦截器有什么用?
Struts2为长时间运行的动作类提供了execAndWait拦截器。 我们可以使用此拦截器将中间响应页面返回给客户端,一旦处理完成,最终响应将返回给客户端。 此拦截器在struts-default包中定义,实现在
ExecuteAndWaitInterceptor
类中提供。查看Struts2 execAndWait拦截器示例,以了解有关此拦截器以及如何使用它的更多信息。
-
Struts2中的令牌拦截器有什么用?
Web应用程序的主要问题之一是双重表单提交。 如果不小心,重复提交表单可能导致向客户收取双倍的费用或两次更新数据库值。 我们可以使用令牌拦截器来解决双重表单提交问题。 这个拦截器是在struts-default包中定义的,但它不是任何拦截器堆栈的一部分,因此我们需要在操作类中手动添加它。
在Struts2令牌拦截器示例中了解更多信息。
-
我们如何将log4j集成到Struts2应用程序中?
Struts2为日志目的提供了log4j API的轻松集成,我们所需要的只是WEB-INF / classes目录中的log4j配置文件。
您可以在Struts2 Log4j集成中签出示例项目。
-
我们如何使用它们?
Struts2提供了许多自定义标签,我们可以在结果页中使用它们来创建客户端请求的视图。 这些标签大致分为三类-数据标签,控制标签和UI标签。
我们可以通过使用taglib指令在JSP页面中添加这些标记来使用这些标记。
<%@ taglib uri="/struts-tags" prefix="s" %>
一些重要的数据标签是属性,设置,推送,Bean,操作,包含,i18n和文本标签。 在Struts2数据标签中了解更多信息 。
控制标签用于操作和导航集合中的数据。 一些重要的控制标签是if-elseif-else,迭代器,附加,合并,排序,子集和生成器标签。 在Struts2控制标签中了解更多信息。
Struts2 UI标记用于生成HTML标记语言,将HTML表单数据绑定到动作类属性,类型转换,验证和i18n支持。 一些重要的UI标签是表单,文本字段,密码,文本区域,复选框,选择,广播和提交标签。 在Struts2 UI标签上阅读有关它们的更多信息。
-
Struts2中的自定义类型转换器是什么?
Struts2支持OGNL表达式语言,它在Struts 2中执行两项重要任务-数据传输和类型转换。
OGNL非常灵活,我们可以轻松地对其进行扩展以创建自己的自定义转换器类。 创建和配置定制类型转换器类非常容易,第一步是修复定制类的输入格式。 第二步是实现转换器类。 类型转换器类应实现com.opensymphony.xwork2.conversion.TypeConverter接口。 由于在Web应用程序中,我们总是以String形式获取请求,并以String形式发送响应,因此Struts 2 API提供了TypeConverter接口的默认实现StrutsTypeConverter。 StrutsTypeConverter包含两个抽象方法– convertFromString将String转换为Object,convertToString将Object转换为String。
有关实现的详细信息,请阅读Struts2 OGNL示例教程 。
-
我们如何编写自己的拦截器并将其映射为行动?
我们可以实现
com.opensymphony.xwork2.interceptor.Interceptor
接口来创建我们自己的拦截器。 拦截器类准备就绪后,我们需要在struts.xml包中定义要使用的类。 我们还可以使用我们的自定义拦截器和defaultStack拦截器创建拦截器堆栈。 之后,我们可以为要使用拦截器的操作类配置它。使用自定义拦截器的最佳示例之一是验证会话,请在Struts2 Interceptor Tutorial中阅读有关会话的更多信息。
-
拦截器的生命周期是多少?
拦截器接口定义了三种方法-init(),destroy()和intercept()。 初始化和销毁是拦截器的生命周期方法。 拦截器是Singleton类,Struts2初始化一个新线程来处理每个请求。 创建拦截器实例时将调用init()方法,我们可以在此方法中初始化任何资源。 当应用程序关闭时会调用destroy()方法,我们可以在此方法中释放任何资源。
exclude()是每次客户端请求通过拦截器时调用的方法。
-
什么是拦截器堆栈?
拦截器堆栈可帮助我们将一个包装中的多个拦截器组合在一起以备将来使用。 struts-default软件包创建一些最常用的拦截器堆栈-basicStack和defaultStack。 我们可以在包的开头创建自己的拦截器堆栈,然后配置操作类以使用它。
-
什么是struts-default软件包,它有什么好处?
struts-default是一个抽象包,它定义了所有Struts2拦截器和常用的拦截器堆栈。 建议在配置我们的应用程序包时扩展此程序包,以避免再次配置拦截器。 通过消除在我们的应用程序中配置拦截器和结果页面的繁琐任务,可以帮助开发人员。
-
Struts2操作URI的默认后缀是什么,我们如何更改它?
Struts2操作的默认URI后缀为.action,在Struts1中的默认后缀为.do。 我们可以通过在Struts2配置文件中将struts.action.extension常量值定义为以下内容来更改此后缀:
<constant name="struts.action.extension" value="action,do"></constant>
-
结果页面的默认位置是什么,我们如何更改它?
默认情况下,Struts2在{WEBAPP-ROOT} / {Namespace} /目录中查找结果页面,但有时我们希望将结果页面保留在另一个位置,我们可以在Struts2配置文件中提供struts.convention.result.path常量值来更改结果页面位置。
另一种方法是在操作类中使用@ResultPath批注提供结果页面的位置。
-
我们如何在Struts2应用程序中上传文件?
文件上传是Web应用程序中的常见任务之一。 这就是Struts2为通过FileUploadInterceptor上传文件提供内置支持的原因。 该拦截器在struts-default程序包中进行配置,并提供选项来设置文件的最大大小和可以上传到服务器的文件类型。
在Struts2文件上传示例中阅读有关FileUpload拦截器的更多信息。
-
开发Struts2应用程序时应遵循的最佳实践是什么?
开发Struts2应用程序时的一些最佳实践是:
- 创建软件包时,请始终尝试扩展struts-default软件包,以避免配置拦截器时的代码冗余。
- 对于整个应用程序中的常见任务,例如记录请求参数,请尝试使用拦截器。
- 始终将动作类的Java Bean属性保留在单独的Bean中,以供代码重用并实现ModelDriven接口。
- 如果您有要在多个操作中使用的自定义拦截器,请为其创建拦截器堆栈,然后使用它。
- 尝试根据功能区域将应用程序划分为具有名称空间配置的不同模块。
- 尝试在结果页面中使用Struts2标记以澄清代码,如果需要,请创建自己的类型转换器。
- 使用开发模式可以加快开发速度,但是请确保生产代码不在开发模式下运行。
- 将Struts2 i18n支持用于资源包并支持本地化。
- Struts2提供了许多地方,您可以在其中拥有资源包,但尝试保留一个全局资源包和一个动作类资源包,以避免混淆。
- struts-default软件包配置所有拦截器并创建不同的拦截器堆栈。 尝试仅使用所需的内容,例如,如果您没有本地化要求,则可以避免使用i18n拦截器。
-
这就是Struts2面试问答的全部内容,如果您遇到任何我遗漏的重要问题,请通过评论告知我。
翻译自: https://www.javacodegeeks.com/2013/11/struts2-interview-questions-and-answers.html