什么是Struts2?

Apache Struts2是一个用Java构建Web运用程序的开源框架。
Struts2基于OpenSymphony WebWork框架。
它从Struts1中得到了很大的改进,使其更加灵巧,易于利用和扩展。
Struts2的核心组件是Action,Interceptors和Result页面。

Struts2供应了许多方法来创建Action类并通过struts.xml或注释来配置它们。
我们可以为常见任务创建自己的拦截器
Struts2附带了很多标签,并利用OGNL表达式措辞。
我们可以创建自己的类型转换器来渲染结果页面。
结果页面可以是JSP和FreeMarker模板。

jsp动态加载radio面试都邑碰到哪些关于Struts2的问题 Java

2.

Struts2的核心组件是什么?

Struts2的核心组件是:

动作类 拦截器 结果页面,FreeMarker模板的JSP ValueStack,OGNL和Tag Libraries Struts 2架构图,struts2 ,struts2试题

3.

什么是Struts2中的拦截器?

拦截器是Struts2 Framework的支柱。
Struts2拦截器卖力框架完成的大部分处理,例如将要求参数通报给动作类,使Servlet API要求,相应,会话可用于Action类,验证,i18n支持等。

ActionInvocation卖力封装Action类和拦截器并按顺序触发它们。
在ActionInvocation中利用的最主要的方法是invoke()方法,它跟踪拦截器链并调用下一个拦截器或动作。
这是Java EE框架中任务链模式的最佳示例之一。

4.

Struts2拦截器实现了哪种设计模式?

Struts2拦截器基于拦截滤波器设计模式。
拦截器堆栈中拦截器的调用非常类似于任务链设计模式。

5.

在Struts2中创建Action类有哪些不同的方法?

Struts2供应了创建动作类的不同方法。

通过实现Action接口 利用Struts2 @Action注释 通过扩展ActionSupport类 任何返回String的execute()方法的普通java类都可以配置为Action类。

6.

Struts2动作和拦截器是否是线程安全的?

Struts2 Action类是线程安全的,由于工具是为每个处理它的要求实例化的。

Struts2拦截器是单例类,并且创建了一个新线程来处理要求,因此它不是线程安全的,我们须要仔细实现它们以避免共享数据的任何问题。

7.

哪个类是Struts2中的前端掌握器?

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter是Struts2中的Front Controller类,每个要求处理都从这个类开始。
早期版本的Struts2 org.apache.struts2.dispatcher.FilterDispatcher用作Front Controller类。

8.

Struts2中拦截器有哪些好处?

拦截器的一些好处是:

拦截器在实现高度分离关注方面起着至关主要的浸染。

Struts2拦截器是可配置的,我们可以为我们想要的任何动作配置它。

我们可以创建自己的自定义拦截器来实行一些常见任务,例如要求参数记录,身份验证等。
这有助于我们在一个位置处理常见任务,从而降落掩护本钱。

我们可以创建拦截器堆栈以用于不同的操作。

9.

什么是ValueStack和OGNL?

ValueStack是Struts2存储运用程序数据以处理客户端要求的存储区域。
数据存储在ActionContext利用ThreadLocal的工具中,以具有特定于特定要求线程的值。

工具图导航措辞(OGNL)是一种功能强大的表达式措辞,用于处理存储在ValueStack上的数据。
正如您在架构图中看到的,拦截器和结果页面都可以利用OGNL访问存储在ValueStack上的数据。

10.

列举Struts2中引入的一些有用的注释?

Struts2中引入的一些主要注释是:

@Action创建动作类@Actions为多个动作配置单个类@Namespace和@Namespaces用于创建不同的模块@Result用于结果页面@ResultPath用于配置结果页面位置

11.

供应一些您利用过的主要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>

12.

Struts2中动作映命中命名空间的用场是什么?

Struts2命名空间配置许可我们轻松创建模块。
我们可以利用命名空间根据其功能分离我们的操作类,例如admin,user,customer等。

13.

哪个拦截器卖力将要求参数映射到动作类Java Bean属性?

com.opensymphony.xwork2.interceptor.ParametersInterceptor拦截器卖力将要求参数映射到Action类的java bean属性。
此拦截器在struts-default包中配置,名称为“params”。
此拦截器是basicStack和defaultStack拦截器堆栈的一部分。

14.

哪个拦截器卖力i18n支持?

com.opensymphony.xwork2.interceptor.I18nInterceptor拦截器卖力Struts2运用程序中的i18n支持。
此拦截器在struts-default包中配置,名称为“i18n”,它是i18nStack和defaultStack的一部分。

15.

对我们的操作类利用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逻辑。

16.

我们若何才能在动作类中得到Servlet API要求,相应,HttpSession等工具?

Struts2操作类不供应对Servlet API组件的直接访问,例如Request,Response和Session。
但是,有时我们须要在操作类中进行这些访问,例如检讨HTTP方法或设置相应中的cookie。

这便是为什么Struts2 API供应了一堆 Aware接口,我们可以实现这些接口来访问这些工具。
Struts2 API利用依赖注入在操作类中注入Servlet API组件。
一些主要的Aware接口是SessionAware,ApplicationAware,ServletRequestAware和ServletResponseAware。

17.

execAndWait拦截器有什么用?

Struts2为永劫光运行的动作类供应了execAndWait拦截器。
我们可以利用此拦截器将中间相应页面返回给客户端,一旦处理完成,终极相应将返回给客户端。
此拦截器在struts-default包中定义,实现在ExecuteAndWaitInterceptor类中。

18.

Struts2中令牌拦截器的用场是什么?

Web运用程序的紧张问题之一是双表单提交。
如果不把稳,双重表单提交可能会导致向客户收取双倍金额或两次更新数据库值。
我们可以利用令牌拦截器来办理双表格提交问题。
这个拦截器是在struts-default包中定义的,但它不是任何拦截器堆栈的一部分,以是我们须要在我们的动作类中手动包含它。

19.

我们如何在Struts2运用程序中集成log4j?

Struts2供应了log4j API的大略集成以便进行日志记录,我们须要的只是WEB-INF / classes目录中的log4j配置文件。

20.

什么是不同的Struts2标签?我们若何才能利用它们?

Struts2供应了许多自定义标记,我们可以在结果页面中利用它们来创建客户端要求的视图。
这些标签大致分为三类 - 数据标签,掌握标签和UI标签。

我们可以通过利用taglib指令在JSP页面中添加这些标记来利用这些标记。

<%@ taglib uri=\公众/struts-tags\"大众 prefix=\公众s\"大众 %>

一些主要的Data标签是property,set,push,bean,action,include,i18n和text标签。

掌握标签用于处理和导航凑集中的数据。
一些主要的Control标签是if-elseif-else,iterator,append,merge,sort,subset和generator标签。

Struts2 UI标签用于天生HTML标记措辞,将HTML表单数据绑定到动作类属性,类型转换,验证和i18n支持。
一些主要的UI标签是form,textfield,password,textarea,checkbox,select,radio和submit标签。

21.

什么是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。

22.

我们如何编写自己的拦截器并将其映射为动作?

我们可以实现com.opensymphony.xwork2.interceptor.Interceptor接口来创建自己的拦截器。
一旦拦截器类准备就绪,我们须要在我们想要利用它的struts.xml包中定义它。
我们还可以利用自定义拦截器和defaultStack拦截器创建拦截器堆栈。
之后我们可以为我们想要利用拦截器的动作类配置它。

23.

什么是拦截器的生命周期?

拦截器接口定义了三个方法 - init(),destroy()和intercept()。
init和destroy是拦截器的生命周期方法。
拦截器是Singleton类,Struts2初始化一个新线程来处理每个要求。
创建拦截器实例时调用init()方法,我们可以初始化此方法中的任何资源。
运用程序关闭时调用destroy()方法,我们可以开释此方法中的任何资源。

intercept()是每次客户端要求通过拦截器时调用的方法。

24.

什么是拦截器堆栈?

拦截器堆栈可帮助我们将多个拦截器组合在一起以供进一步利用。
struts-default包创建了一些最常用的拦截器堆栈--basicStack和defaultStack。
我们可以在包的开头创建我们自己的拦截器堆栈,然后配置我们的动作类来利用它。

25.

什么是struts-default包,它有什么好处?

struts-default是一个抽象包,它定义了所有Struts2拦截器和常用的拦截器堆栈。
建议在配置运用程序包时扩展此程序包,以避免再次配置拦截器。
这是为了帮助开拓职员肃清在我们的运用程序中配置拦截器和结果页面的繁琐任务。

26.

Struts2操作URI的默认后缀是什么?我们如何变动它?

Struts2操作的默认URI后缀是.action,在Struts1中,默认后缀为.do。
我们可以通过在Struts2配置文件中定义struts.action.extension常量值来变动此后缀:

<constant name=\"大众struts.action.extension\"大众 value=\公众action,do\公众></constant>

27.

结果页面的默认位置是什么?我们如何变动它?

默认情形下,Struts2在{WEBAPP-ROOT} / {Namespace} /目录中查找结果页面,但有时我们希望将结果页面保存在另一个位置,我们可以在Struts2配置文件中供应struts.convention.result.path常量值来变动结果页面位置。

另一种方法是在操作类中利用@ResultPath批注来供应结果页面位置。

28.

我们如何在Struts2运用程序中上传文件?

文件上载是Web运用程序中的常见任务之一。
这便是为什么Struts2通过FileUploadInterceptor供应对文件上传的内置支持。
此拦截器在struts-default包中配置,并供应选项以设置文件的最大大小和可以上载到做事器的文件类型。

29.

开拓Struts2运用程序时要遵照哪些最佳实践?

开拓Struts2运用程序时的一些最佳实践是:

在创建程序包时始终考试测验扩展struts-default程序包,以避免在配置拦截器时涌当代码冗余。
对付全体运用程序中的常见任务,例如记录要求参数,请考试测验利用拦截器。
始终将动作类java bean属性保存在单独的bean中以便重用代码并实现ModelDriven接口。
如果您有将在多个操作中利用的自定义拦截器,请为此创建拦截器堆栈,然后利用它。
考试测验利用基于功能区域的命名空间配置在不同模块中划分运用程序。
考试测验在结果页面中利用Struts2标记进行代码解释,如果须要,可以创建自己的类型转换器。
利用开拓模式可以加快开拓速率,但请确保生产代码不以dev模式运行。
利用Struts2 i18n支持资源包并支持本地化。
Struts2供应了许多可以拥有资源包的地方,但是考试测验保留一个全局资源包,一个用于动作类以避免稠浊。
struts-default包配置所有拦截器并创建不同的拦截器堆栈。
考试测验仅利用所需的内容,例如,如果您没有本地化哀求,则可以避免利用i18n拦截器。

30.

如何处理Struts2中运用程序抛出的非常?

Struts2为非常处理供应了一个非常强大的框架。
我们可以在包中指定全局结果,然后将特定的例外映射到这些结果页面。
非常映射可以在全局包级别和操作级别完成。

当发生一些未由运用程序处理的意外非常时,让非常结果页面向用户供应一些信息是个好主张。
struts.xml文件中的示例配置如下所示。

<package name=\"大众user\公众 namespace=\"大众/\"大众 extends=\"大众struts-default\公众><global-results> <result name=\"大众exception\"大众>/exception.jsp</result> <result name=\"大众runtime_exception\公众>/runtime_exception.jsp</result> <result name=\公众error\"大众>/error.jsp</result></global-results><global-exception-mappings> <exception-mapping exception=\"大众java.lang.Exception\"大众 result=\"大众exception\公众></exception-mapping> <exception-mapping exception=\公众java.lang.Error\公众 result=\公众error\"大众></exception-mapping> <exception-mapping exception=\"大众java.lang.RuntimeException\"大众 result=\"大众runtime_exception\"大众></exception-mapping></global-exception-mappings> <action name=\"大众myaction\"大众 class=\"大众com.journaldev.struts2.exception.MyAction\公众> </action> <action name=\公众myspecialaction\"大众 class=\"大众com.journaldev.struts2.exception.MySpecialAction\"大众> <exception-mapping exception=\"大众java.io.IOException\"大众 result=\"大众login\"大众></exception-mapping> <result name=\公众login\"大众>/error.jsp</result> </action></package>

末了,我自己是一名从事了多年开拓的Java老程序员,辞职目前在做自己的Java私人定制课程,今年年初我花了一个月整理了一份最适宜2019年学习的Java学习干货,可以送给每一位喜好Java的小伙伴,想要获取的可以关注我的头条号并在后台私信我:01,即可免费获取。