Struts2面试问题

转载自   Struts2面试问题

1.什么是Struts2?

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

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

 

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中引入的一些重要注释是:

  1. @Action创建动作类

  2. @Actions为多个动作配置单个类

  3. @Namespace和@Namespaces用于创建不同的模块

  4. @Result用于结果页面

  5. @ResultPath用于配置结果页面位置

 

11.提供一些您使用过的重要Struts2常量?

  1. struts.devMode在开发模式下运行我们的应用程序。此模式会重新加载属性文件,并提供额外的日志记录和调试功能。它在开发我们的应用程序时非常有用,但我们应该在将代码转移到生产时将其关闭。

  2. struts.convention.result.path用于配置结果页面的位置。默认情况下,Struts2在{WEBAPP-ROOT} / {Namespace} /中查找结果页面,我们可以使用此常量更改位置。

  3. struts.custom.i18n.resources为i18n支持定义全局资源包。

  4. 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应用程序时的一些最佳实践是:

  1. 在创建程序包时始终尝试扩展struts-default程序包,以避免在配置拦截器时出现代码冗余。

  2. 对于整个应用程序中的常见任务,例如记录请求参数,请尝试使用拦截器。

  3. 始终将动作类java bean属性保存在单独的bean中以便重用代码并实现ModelDriven接口。

  4. 如果您有将在多个操作中使用的自定义拦截器,请为此创建拦截器堆栈,然后使用它。

  5. 尝试使用基于功能区域的命名空间配置在不同模块中划分应用程序。

  6. 尝试在结果页面中使用Struts2标记进行代码说明,如果需要,可以创建自己的类型转换器。

  7. 使用开发模式可以加快开发速度,但请确保生产代码不以dev模式运行。

  8. 使用Struts2 i18n支持资源包并支持本地化。

  9. Struts2提供了许多可以拥有资源包的地方,但是尝试保留一个全局资源包,一个用于动作类以避免混淆。

  10. 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>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌工程师文化中的几个核心原则

转载自 谷歌工程师文化中的几个核心原则 每周&#xff0c;一组谷歌员工都会在厕所的墙壁上粘贴一页来分享本周的测试小建议。有时这页纸会讨论依赖注入&#xff0c;并提供一个简单的示例展示如何用不同语言使用它&#xff1b;有时它可能会分享如何安装一个用于测量团队代码库…

初探CSRF在ASP.NET Core中的处理方式

前言 前几天&#xff0c;有个朋友问我关于AntiForgeryToken问题&#xff0c;由于对这一块的理解也并不深入&#xff0c;所以就去研究了一番&#xff0c;梳理了一下。 在梳理之前&#xff0c;还需要简单了解一下背景知识。 AntiForgeryToken 可以说是处理/预防CSRF的一种处理…

HBase体系架构说明

HBase体系架构说明&#xff01; client&#xff1a;两种—-Hbase shell 命令行接口 JavaAPI client访问Region不能直接访问&#xff0c;首先client需要先连接到zookeeper&#xff0c;zookeeper管理HMaster&#xff0c;说明&#xff0c;hdfs集群&#xff0c;在没有zookeepe…

asp.net core 编译mvc,routing,security源代码进行本地调试

因为各种原因&#xff0c;需要查看asp.net core mvc的源代码来理解运行机制等等&#xff0c;虽说源代码查看已经能很好的理解了。但是能够直接调试还是最直观的。所有就有了本次尝试。因调试设置源代码调试太辍笔&#xff0c;所以不用这个方法&#xff0c;转而使用编译源代码的…

并查集判断是否有环存在

题目描述 思路分析 代码实现 package com.atguigu.disjointSet;public class djset {public static int VERTICES6;public static void initialise(int parent[]){int i;for (i 0; i < VERTICES; i) {parent[i]-1;}}public static int find_root(int x,int parent[]){int …

Visual Studio 2017更新,侧重于提高稳定性

Microsoft已对其旗舰开发软件产品Visual Studio 2017&#xff08;VS2017&#xff09;的安装程序和设置引擎做了全新设计&#xff0c;意在能快速地部署更新到VS2017。VS2017的第一个命名版本更新在VS2017首发的一个月后就可用&#xff0c;这充分体现了这一全新设计的优势所在。 …

阅读器关闭时尝试调用Read无效时的解决方法

今天在写asp .netmvc的项目时&#xff0c;发现了个困扰我很久的问题&#xff0c;经过仔细研究终于解决了。 问题如下&#xff1a; 首先来看一下原来有问题的代码&#xff1a; public static SqlDataReader Excutereader(string sql,params SqlParameter [] param) {using (SqlC…

.NET或将引入类型类和扩展

类型类是另外一项正被考虑引入.NET未来版本的特性。在提案“外观和扩展&#xff08;Shapes and Extensions&#xff09;”中&#xff0c;该特性被称为外观&#xff0c;它们将大幅提升.NET泛型的能力。Mads Torgersen这样描述类型类&#xff1a; 接口抽象的是作为类型实例的对象…

成为更优秀的程序员:退后一步看问题

转载自 成为更优秀的程序员&#xff1a;退后一步看问题 一天&#xff0c;在工作中… Bug #3890 来自客户&#xff1a; 有个程序出现了错误&#xff0c;程序提示说“SpeedCalculator::compute()里出现了除零情况”。 请尽快修复&#xff01; 你打开SpeedCalculator.php&#…

深夜福利, 小试linuxkit

前言 今天小编的朋友圈被DockerCon和linuxkit刷屏了&#xff0c;再不出来写点linuxkit的东东恐怕就要跟不上时代了。小编翻阅了N多的有关linuxkit的文章&#xff0c;发现绝大多数都是英文的讲解&#xff0c;小编本着对读者负责的态度决定先将linuxkit的文章翻译成中文&#xff…

.NET Core 2.0及.NET Standard 2.0

.NET Core 2.0的发布时间&#xff0c;.NET Core 2.0预览版及.NET Standard 2.0 Preview大概在5月中旬或下旬发布。 .NET Core 2.0正式版本发布时间大约在Q3 2017发布&#xff0c;具体我估计大概在8月份左右。同时一起发布的也就是.NET Standard 2.0。 MilestoneRelease Date.…

Linux清理磁盘挂载点方法(亲测有效)

问题现象 Linux操作系统云服务器根目录空间占用率过高。例如&#xff0c;以图1为例&#xff0c;根目录空间占用率为96%。 根目录空间占用率过高 查询当前系统存在一个约42G 大小的文件access_log&#xff0c;这个文件应该是apache产生的访问日志文件&#xff0c;从日志大小来…

.NET程序在Linux容器中的演变

本文将首先讨论镜像的构建时间和启动时间&#xff0c;接着会将一个简单的.NET程序运行在基于容器的应用上&#xff0c;然后观察镜像大小的变化&#xff0c;最终缩短镜像的构建和加载时间。此外&#xff0c;代码优化是本文的另一个主题。 现在&#xff0c;.NET开发人员可以无障…

微服务的概念——《微服务设计》读书笔记

《领域驱动设计》&#xff08;Eric Evans&#xff09;&#xff1a;告诉我们用代码呈现真实世界的重要性&#xff0c;并且告诉我们如何更好地建模。 持续交付理论&#xff1a;如何更有效及更高效地发布软件品&#xff0c;并指出保持每次提交均可发布的重要性。 六边形架构理论&a…

想要玩转实现负载均衡,你知道这些吗?

转载自 想要玩转实现负载均衡&#xff0c;你知道这些吗&#xff1f; 一、前言 互联网早期&#xff0c;业务流量比较小并且业务逻辑比较简单&#xff0c;单台服务器便可以满足基本的需求&#xff1b;但随着互联网的发展&#xff0c;业务流量越来越大并且业务逻辑也越来越复杂&…

netcore实践:跨平台动态加载native组件

缘起netcore框架下实现基于zmq的应用。在.net framework时代&#xff0c;我们进行zmq开发由很多的选择&#xff0c;比较常用的有clrzmq4和NetMQ。 其中clrzmq是基于libzmq的Interop包装&#xff0c; NetMQ是100%C#的zmq实现&#xff08;基于AsyncIO组件&#xff09;。以上两种…

如何实现酷狗音乐pc页面点击播放时,打开多个歌曲播放时,始终在一个播放页面,(标签页的通讯)

大致有两种思路&#xff0c; 一种是通过wind.open()方法传第二个参数&#xff0c; A页面&#xff1a; //点击跳转播放页函数function toPlayPage(){window.open(path/xxxx/xxxx?name音乐名,music)//第二个参数写一个定值&#xff0c;代表跳转页面都为music标签页&#xff0…

Redis进阶之内存模型

转载自 Redis进阶之内存模型 前言 Redis是目前最火爆的内存数据库之一&#xff0c;通过在内存中读写数据&#xff0c;大大提高了读写速度&#xff0c;可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时&#xff0c;会接触Redis的5种对象类型&#xff08;字符…

C#将引入可空的引用类型

是的&#xff0c;标题没错。C#其中一份新提案假定&#xff0c;所有的引用类型在默认情况下都是不可空的。在新语法下&#xff0c;你需要显式地标明一个引用变量是可空的&#xff0c;就像对值类型所做的那样。 和值类型一样&#xff0c;T是指不可空类型&#xff0c;而T?是指可…