2019年Java面试题(十一) Struts2 2019-04-27

1. Struts2 拦截器 和 过滤器 的区别

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

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

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

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

2. 为什么要使用 Struts2 & Struts2 的优点:

①  基于 MVC 架构,框架结构清晰。

②  使用 OGNL: OGNL 可以快捷的访问值栈中的数据、调用值栈中对象的方法

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

③  多种表现层技术. 如:JSP、FreeMarker、Velocity 等

3. Struts2 如何访问 HttpServletRequest、HttpSession、ServletContext 三个域对象 ?

①  与 Servlet API 解耦的访问方式

      > 通过 ActionContext 访问域对象对应的 Map 对象

      > 通过实现 Aware 接口使 Struts2 注入对应的 Map 对象

② 与 Servlet API 耦合的访问方式

    > 通过 ServletActionContext 直接获取 Servlet API 对象

> 通过实现 ServletXxxAware 接口的方式使 Struts2 注入对应的对象

4. 说出 struts2 中至少 5 个的默认拦截器

exception;fileUpload;i18n;modelDriven;params;prepare;token;tokenSession;validation 等

5. ActionContext、ServletContext、pageContext的区别 ?

②   ActionContext Struts2 的 API:是当前的 Action 的上下文环境

② ServletContext 和 PageContext 是 Servlet 的 API

6. Struts2 有哪几种结果类型 ?

dispatcher、chain、redirect

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

每个拦截器都是需要实现 Interceptor 接口

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

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

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

8. 如何在 Struts2 中使用 Ajax 功能 ?

① . JSON plugin

② . DOJO plugin

③ . DWR plugin

④ . 使用 Stream 结果类型.

9. 用自己的话简要阐述struts2的执行流程

Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。 Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2是WebWork的升级版本。基本简要流程如下:1、客户端浏览器发出HTTP请求。2、根据web.xml配置,该请求被FilterDispatcher接收。3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。6、返回HTTP响应到客户端浏览器。

10. Struts工作原理

一个请求在Struts2框架中的处理大概分为以下几个步骤

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求

2、 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)

3、 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action

4、 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy

5、 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类

6、 ActionProxy创建一个ActionInvocation的实例。

7、 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8、 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

基本简要流程如下:1、客户端浏览器发出HTTP请求。2、根据web.xml配置,该请求被FilterDispatcher接收。3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。6、返回HTTP响应到客户端浏览器。

11. Struts2.0 有几种标签库

【参考答案】UI 标签、控制标签、数据标签、杂项标签

12. struts2 必备包有哪些?

【参考答案】

commons-fileupload-1.2.1.jar

freemarker-2.3.13.jar

ognl-2.6.11.jar

struts2-core-2.1.6.jar

xwork-2.1.2.jar

13. Spring MVC 与Struts2 MVC 的不同之处

【参考答案】

1、请求处理机制:spring mvc 是基于方法的设计,而sturts 是基于类,每次发一次请求都会实例一个action,每个action 都会被注入属性,而spring 基于方法,粒度更细。

2、参数传递:struts 是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。

3、设计思想上:struts 更加符合oop 的编程思想, spring 就比较谨慎,在servlet 上扩展。

4、intercepter 的实现机制:struts 有以自己的interceptor 机制,spring mvc 用的是独立的AOP 方式。这样导致struts 的配置文件量还是比spring mvc 大,虽然struts 的配置能继承,所以我觉得论使用上来讲,spring mvc 使用更加简洁,开发效率Spring MVC 确实比struts2高。

14. 3 个框架在项目在项目当中的用,BaseDao 是用来做什么的。

【参考答案】

DAO 组件主要提供数据库访问操作,针对不同数据源表持久化操作进行了封装,这样可以提供其它层的访问接口,使得组件之间解耦。而BaseDAO 是这些所有这些不同的持久化的DAO 的公共API 进行了封装,进一步抽象提取,使其它各组件DAO 从BaseDAO 中派生,增强系统的重用性、维护性、扩展性。

15. ThreadLocal 在项目中的实际意义?

【参考答案】

ThreadLocal 和其它同步机制相比从另一个角度来解决多线程的并发访问,它为每一个线程维护一个和该线程绑定的变量的副本,从而隔离了多个线程的数据,每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。还提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的整个变量封装进ThreadLocal

ThreadLocal 可以大量减少参数的传递,可以使代码简洁,但一个线程会绑定多个自己定义的局部对象,ThreadLocal 是抽象在线程上的对象创建工厂,目前的Tomcat5 使用了线程池,一个线程处理一个request,这样ThreadLocal 对象可以抽象的绑定在request 生命周期,不会存在线程危机,而且线程池也平衡了这些ThreadLocal

16. annotation 的使用方法和用途主要分为几类?

【参考答案】

1、内建Annotation——Java5.0 版在java 语法中经常用到的内建Annotation:

2、开发者自定义Annotation:由开发者自定义Annotation 类型;

3、使用第三方开发的Annotation 类型

17. Struts2 是怎么实现MVC 的?

【参考答案】

MVC 就是model view controller,三种组件,Struts2 实现Controller 主要由一系列的前端过滤器(Filter)实现Controller。Model 层主要由Struts2 的Action 组件实现。View 层主要是由Struts2 的标签库、Freemarker 等组件实现视图层

18. 在Struts2 中,配置文件中通配符是怎么表示和使用的?使用通配符后有什么好处

调用相同Action 中的不同方法

/login.jsp

/error.jsp

/welcome.jsp

其中表达式{1}的值name 属性值中第一个*的值。如果用户请求的URL 为loginAction.action,则调用Jcuckoo.LoginRegistAction 中的login 方法;

如果用户请求的URL 为registerAction.action,则调用Jcuckoo.LoginRegistAction 中的register 方法

示例2:带转视图

/input.jsp

/{1}.jsp

当处理结果是input 时,会转到/input.jsp 页面当处理结果是success 时,如果crud_create.action,则会执行Jcuckoo.CrudAction 中的create 方法,并且跳

转到/create.jsp;如果crud_delete.action,则会执行Jcuckoo.CrudAction 中的delete 方法,并且跳转到/delete.jsp;

优点:

使用通配符能规范命名格式,简洁配置文件,加速开发效率,也是Struts 倡导的一种开发模式。

19. Struts2 实现拦截器的原理?

拦截器是AOP 中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用。而Struts2 的Interceptor,其拦截的对象是Action 代码,可以定义在Action 代码之前或者之后执行拦截器的代码。

1. 整个结构就如同一个堆栈,除了Action 以外,堆栈中的其他元素是Interceptor

2. Action 位于堆栈的底部。由于堆栈"先进后出"的特性,而这些都是围绕着Action 的,当我们请求Action 时,必须首先把位于Action 上端的Interceptor 拿出来执行。

20. Struts2 的实现原理

1、客户端初始化一个指向Servlet 容器(例如Tomcat)的请求

2 、这个请求经过一系列的过滤器( Filter )( 这些过滤器中有一个叫做ActionContextCleanUp 的可选过滤器,这个过滤器对于Struts2 和其他框架的集成很有帮助,例如:SiteMesh Plugin);

3、接着FilterDispatcher 被调用,FilterDispatcher 询问ActionMapper 来决定这个请求是否需要调用某个Action;

4、如果ActionMapper 决定需要调用某个Action,FilterDispatcher 把请求的处理交给ActionProxy;

5、ActionProxy 通过Configuration Manager 询问框架的配置文件,找到需要调用的Action 类;

6、ActionProxy 创建一个ActionInvocation 的实例。

7、ActionInvocation 实例使用命名模式来调用,在调用Action 的过程前后,涉及到相关拦截器(Intercepter)的调用。

8、一旦Action 执行完毕,ActionInvocation 负责根据struts.xml 中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action 链)一个需要被表示的JSP 或者FreeMarker 的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

21. 为什么要用ORM? 和JDBC 有何不一样?

orm 是一种思想,就是把object 对象转变成数据库中的记录,或者把数据库中的记录转变成object 对象,我们可以用jdbc 来实现这种思想,orm 的思想本质就是建立是JDBC 上,对JDBC 的一种封装,这种封装可以省去了直接使用jdbc 的繁琐细节,提高了开发效率,现在用的较多的ORM 工具很多,一般我们公司采用的ORM 框架主要有hibernate 和MyBatis。当然也听说一些其他orm 工具,如toplink,ojb 等。

22. 说说struts1 与struts2 的区别。

1) Servlet 依赖性

由于Action 在被调用时,HttpServletRequest 和HttpServletResponse 被传递到execute()方法中,Struts1中的Action 对Servlet 的API 是有依赖性的.但如果在Struts2中,Action 就不会对容器有依赖了,因为Action 是由简单的POJO 组成的.在Struts2中,servlet 上下文以简单的Map 的形式表现出来,这使得Action 可以得到独立的测试.如果需要,Struts2也可以访问原始的请求与响应。不过,其他的框架元素减少或排除直接访问HttpServetRequest 或HttpServletResponse 的必要。

2) Action 类

使用抽象类而不是接口设计是Struts1设计上的问题,这已经在Struts2中得到了解决.Struts1中的Action 类需要继承框架中依赖的抽象基础类.但在Struts2中,Action 类可能会也可能不会实现接口来启用可选的或者自定义的服务.在Struts2中,Action 是不会依赖于容器的,因为它是由简单的POJO 组成的.Struts2提供了一个基础的ActionSupport 类来实现一些常用的接口。尽管这样,Action 接口仍然不是必须要继承的,任何含有execute 方法的POJO 对象都可以当作Action 对象来用。

3) 验证

Struts1与Struts2都支持通过validate 方法的手动验证.Struts1使用ActionForm 中的validate 方法或者通过扩展Commons Validator 来进行校验.然而,Struts2支持通过Validate 方法与Xwork 校验框架的手动验证. Xwork 框架支持验证链到子属性----使用为属性类文件和校验上下文定义的验证.

4) 线程模型

在Struts1中,Action 资源一定是线程安全或者同步的.所以Action 是singletons 并且线程安全的,一定只有一个Action 类的实例处理该Action 的所有请求,singleton 策略限制了Struts1的Action 所能完成的,并且需要更加谨慎的开发.但是在Struts2中,Action 对象对每一个请求都生成实例,所以在Struts2中不存在线程安全的问题。

5) 易测性

测试Struts1的程序会有些复杂.测试Struts1 Action 的主要它依赖容器。但是在Struts2中,Action 可以经由创建Action 的实例,设置属性和调用方法来得到测试。Struts2中的测试是很简单的,不依赖于容器。

6) 获取输入

Struts1使用ActionForm 来捕获输入,而且所有的ActionForm 需要继承一个框架依赖的基类.由于JavaBean 不能当作ActionForm 来用,开发人员不得不创建冗繁的类来获取输入.不过Struts2使用Action 属性(例如输入属性不依赖于底层框架)这避免了需要创建第二个输入对象,从此冗繁减少了.此外在Struts2中,Action 的属性可以通过标签在web 页面中得到访问,POJO 表单对象和POJO Action.甚至富对象类型,包括业务或域对象,都可以被当作输入/输出对象来使用。

7) 表达式语言

Struts1与JSTL 整合,所以它使用JSTL 表达式语言.Struts1的表达式语言含有遍历图表的基础对象,但是在集合和索引属性的支持上表现不好.Struts2同样支持JSTL,但是它也支持一种更强大且灵活的表达式语言----“对象图标记语言”(OGNL)

8) 将绑定值到视图中

在视图层,Struts1使用标准的JSP 来绑定对象(在模型层被处理的)到页面上下文来进行访问.然而Struts2使用一种叫做值栈的技术,这使得标签可以访问值而不需将视图与正在呈递的对象类型连接起来.值栈允许重用一些属性名相同但类型不同的视图类型.

9) 类型转换

通常Struts1的ActionForm 属性都是String 型的。Struts1使用Commons-Beanutils进行类型转换,这些针对每一个类的类型转换无法为每一个实例配置。然而Struts2使用OGNL 来进行类型转换.框架包含了针对基础类型,常见对象类型与原始类型的转换器。

10) Action 的生存周期

Struts1支持对每一个模块的请求处理器的分离(生命周期),但是同一模块下的所有Action 必须共享相同的生命周期。Struts2支持通过拦截器栈为每一个Action 创建不同的生命周期.自定义栈可以视需要对不同的Action 使用.

23. JDO 是什么?

JDO 是Java 对象持久化的新的规范,为java data object 的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO 提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API 的使用)。这些繁琐的例行工作已经转移到JDO 产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC 只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML 以及对象数据库(ODBMS)等等,使得应用可移植性更强。

24. Spring 与EJB 的区别?

1) 提供商无关性

EJB 3.0 是一个被设计为对提供商没有依赖性的开放的标准。EJB 3.0 规范由企业JAVA社区的主流开源组织和厂商共同编写和支持的。EJB 3.0 框架使开发者的应用程序实现可以独立于应用服务器。而Spring 一直是一个非标准的技术,尽管你在任何应用服务器都上可以使用Spring 框架,但基于Spring 的应用仍然被限制于Spring 本身和在你的应用中使用到的Spring 提供的各种特别服务。

2) 服务整合

Spring 框架是建立在应用服务器和服务库之上,它的服务整合代码(如数据访问模板和Helper 类)是基于框架的,并暴露给应用开发者。相反,EJB 3.0 框架是紧密整合到应用服务器中的,它的服务整合代码是封装在一个标准的接口下的。

3) 服务聚合的灵活性

由于Spring 中的服务整合代码是作为编程接口暴露给应用开发者的,因此开发人员可以根据需要来聚合多个服务。这个特性使你可以集成一个你自己的“轻量”级应用服务器。通常,EJB 3.0 应用服务器不提供给开发者这种按照你的需要来选择服务的灵活性。大多数情况,你会得到一系列已经预先打包好的特性,其中有些你可能是不需要的。

4) 声明式服务

EJB 3.0 和Spring 都将运行时服务(如事务管理、安全、日志、消息、和信息服务)连接给应用程序。由于这些服务同应用程序的业务逻辑并不是直接相关的,因此,它们不被应用程序本身来管理。相反,这些服务被服务容器(如EJB 3.0 和Spring)以不可见的方式在运行时提供给应用程序。开发人员(或系统管理员)通过配置来告诉容器什么时候,以怎样的方式来应用这些服务。

5) 注射依赖

Spring 和EJB 3.0 都提供了大量的DI 模式支持。但是,它们之间也有着根本的不同。Spring 支持了通常意义上的但是复杂的基于XML 配置文件的注射依赖API;EJB 3.0 支持的注射大多数通用服务对象(如,EJB 和容器对象)和JNDI 对象,它通过简单的JAVA 注解来完成。

25. Struts1.2 的工作原理

【参考答案】

1.ActionServlet 核心控制器会拦截所有*.do 的请求

2.从struts-config.xml 中找到用户请求的Action

3.通过struts-config.xml 中的配置再去找这个Action 对应的ActionForm,并实例化

4.把用户填写的数据自动填充到ActionForm 中(调用ActionForm 中的setXX()方法填充)

5.同时把ActionForm 放入到指定的范围中(request,session)

6.然后把请求转发给Action

7.Action 获取ActionForm 中的值然后调用业务逻辑层实现功能

8.在通过ActionMapping 查找Actionforward 实现转发;

26. struts 控制器组件的主要包括?

【参考答案】

ActionServlet 组件:充当struts 框架的中央控制器。

RequestProcessor 组件,充当每个子应用模块的请求处理器

Action 组件,负责处理一项具体的业务。

27. 说说你所知道的应用服务器?

BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,jBoss

你可能感兴趣的:(2019年Java面试题(十一) Struts2 2019-04-27)