Struts面试笔记

Struts2面试题
一、struts2工做流程
Struts 2框架自己大体能够分为3个部分:
核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。
核心控制器FilterDispatcher是Struts 2框架的基础,
包含了框架内部的控制流程和处理机制。
业务控制器Action和业务逻辑组件是须要用户来本身实现的。
用户在开发Action和业务逻辑组件的同时,还须要编写相关的配置文件,
供核心控制器FilterDispatcher来使用。
Struts 2的工做流程相对于Struts 1要简单,与WebWork框架基本相同,
因此说Struts 2是WebWork的升级版本。基本简要流程以下:
1 、客户端初始化一个指向Servlet容器的请求;
二、 这个请求通过一系列的过滤器(Filter)
(这些过滤器中有一个叫作ActionContextCleanUp的可选过滤器,
这个过滤器对于Struts2和其余框架的集成颇有帮助,例如:SiteMesh Plugin)
3 、接着FilterDispatcher被调用,
FilterDispatcher询问ActionMapper来决定这个请是否须要调用某个Action
四、若是ActionMapper决定须要调用某个Action,
FilterDispatcher把请求的处理交给ActionProxy
五、ActionProxy经过Configuration Manager询问框架的配置文件,
找到须要调用的Action类
六、ActionProxy建立一个ActionInvocation的实例。
七、ActionInvocation实例使用命名模式来调用,
在调用Action的过程先后,涉及到相关拦截器(Intercepter)的调用。
八、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果 。返回结果一般是(但不老是,也可 能是另外的一个Action链)一个须要被表示的JSP或者FreeMarker的模版。 在表示的过程当中可使用Struts2 框架中继承的标签。 在这个过程当中须要涉及到ActionMapper
九、响应的返回是经过咱们在web.xml中配置的过滤器
十、若是ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理sreadlocal ActionContext;若是ActionContextCleanUp不使用,则将会去清理sreadlocals。
二、说下Struts的设计模式
MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被建立,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否须要表单验证,若是须要就调用ActionForm的Validate()验证后选择将请求发送到哪一个Action,若是Action不存在,ActionServlet会先建立这个对象,而后调用Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生
成动态的网页,返回给客户。
三、拦截器和过滤器的区别
一、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
二、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
三、拦截器只能对Action请求起做用,而过滤器则能够对几乎全部请求起做用。
四、拦截器能够访问Action上下文、值栈里的对象,而过滤器不能。
五、在Action的生命周期中,拦截器能够屡次调用,而过滤器只能在容器初始化时被调用一次。
四、struts1于struts2的比较
一、Action 类:
Struts1要求Action类继承一个抽象基类。Struts1的一个广泛问题是使用抽象类编程而不是接口。
Struts 2 Action类能够实现一个Action接口,也可实现其余接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去 实现经常使用的接口。Action接口不是必须的,任何有execute标识的POJO对象均可以用做Struts2的Action对象。
二、线程模式:
Struts1 Action是单例模式而且必须是线程安全的,由于仅有Action的一个实例来处理全部的请求。单例策略限制了Struts1 Action能做的事,而且要在开发时特别当心。Action资源必须是线程安全的或同步的。
Struts2 Action对象为每个请求产生一个实例,所以没有线程安全问题。(实际上,servlet容器给每一个请求产生许多可丢弃的对象,而且不会致使性能和垃圾回收问题)
三、Servlet 依赖:
Struts1 Action 依赖于Servlet API ,由于当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
Struts 2 Action不依赖于容器,容许Action脱离容器单独被测试。若是须要,Struts2 Action仍然能够访问初始的request和response。可是,其余的元素减小或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
四、可测性:
测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
Struts 2 Action能够经过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
五、捕获输入:
Struts1 使用ActionForm对象捕获输入。全部的ActionForm必须继承一个基类。由于其余JavaBean不能用做ActionForm,开发者经 常建立多余的类捕获输入。动态Bean(DynaBeans)能够做为建立传统ActionForm的选择,可是,开发者多是在从新描述(建立)已经存 在的JavaBean(仍然会致使有冗余的javabean)。
Struts 2直接使用Action属性做为输入属性,消除了对第二个输入对象的需求。输入属性多是有本身(子)属性的rich对象类型。Action属性可以经过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,可以用做输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。
六、表达式语言:
Struts1 整合了JSTL,所以使用JSTL EL。这种EL有基本对象图遍历,可是对集合和索引属性的支持很弱。
Struts2可使用JSTL,可是也支持一个更强大和灵活的表达式语言-- "Object Graph Notation Language " (OGNL).
七、绑定值到页面(view):
Struts 1使用标准JSP机制把对象绑定到页面中来访问。
Struts 2 使用 "ValueStack "技术,使taglib可以访问值而不须要把你的页面(view)和对象绑定起来。ValueStack策略容许经过一系列名称相同但类型不一样的属性重用页面(view)。
八、类型转换:
Struts 1 ActionForm 属性一般都是String类型。Struts1使用Commons-Beanutils进行类型转换。每一个类一个转换器,对每个实例来讲是不可配置的。
Struts2 使用OGNL进行类型转换。提供基本和经常使用对象的转换器。
九、校验:
Struts 1支持在ActionForm的validate方法中手动校验,或者经过Commons Validator的扩展来校验。同一个类能够有不一样的校验内容,但不能校验子对象。
Struts2支持经过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
十、Action执行的控制:
Struts1支持每个模块有单独的Request Processors(生命周期),可是模块中的全部Action必须共享相同的生命周期。
Struts2支持经过拦截器堆栈(Interceptor Stacks)为每个Action建立不一样的生命周期。堆栈可以根据须要和不一样的Action一块儿使用。
为何要使用Struts2
Struts2 是一个至关强大的Java Web开源框架,是一个基于POJO的Action的MVC Web框架。它基于当年的Webwork和XWork框架,继承其优势,同时作了至关的改进。
1.Struts2基于MVC架构,框架结构清晰,开发流程一目了然,开发人员能够很好的掌控开发的过程。
2使用OGNL进行参数传递。
OGNL提供了在Struts2里访问各类做用域中的数据的简单方式,你能够方便的获取Request,Attribute,Application,Session,Parameters中的数据。大大简化了开发人员在获取这些数据时的代码量。
3强大的拦截器
Struts2 的拦截器是一个Action级别的AOP,Struts2中的许多特性都是经过拦截器来实现的,例如异常处理,文件上传,验证等。拦截器是可配置与重用的,能够将一些通用的功能如:登陆验证,权限验证等置于拦截器中以完成一些Java Web项目中比较通用的功能。在我实现的的一Web项目中,就是使用Struts2的拦截器来完成了系统中的权限验证功能。
4易于测试
Struts2的Action都是简单的POJO,这样能够方便的对Struts2的Action编写测试用例,大大方便了5Java Web项目的测试。
易于扩展的插件机制在Struts2添加扩展是一件愉快而轻松的事情,只须要将所须要的Jar包放到WEB-INF/lib文件夹中,在struts.xml中做一些简单的设置就能够实现扩展。
6模块化管理
Struts2已经把模块化做为了体系架构中的基本思想,能够经过三种方法来将应用程序模块化:将配置信息拆分红多个文件把自包含的应用模块建立为插件建立新的框架特性,即将与特定应用无关的新功能组织成插件,以添加到多个应用中去。
7全局结果与声明式异常
为应用程序添加全局的Result,和在配置文件中对异常进行处理,这样当处理过程当中出现指定异常时,能够跳转到特定页面。
他的如此之多的优势,是不少人比较的青睐,与spring ,Hibernate进行结合,组成了如今比较流行的ssh框架,固然每一个公司都要本身的框架,也是ssh变异的产品。
struts2有哪些优势?
1)在软件设计上Struts2的应用能够不依赖于Servlet API和struts API。 Struts2的这种设计属于无侵入式设计;
2)拦截器,实现如参数拦截注入等功能;
3)类型转换器,能够把特殊的请求参数转换成须要的类型;
4)多种表现层技术,如:JSP、freeMarker、Velocity等;
5)Struts2的输入校验能够对指定某个方法进行校验;
6)提供了全局范围、包范围和Action范围的国际化资源文件管理实现
struts2是如何启动的?
struts2框架是经过Filter启动的,即StrutsPrepareAndExecuteFilter,此过滤器为struts2的核心过滤器;
StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操做。struts2读取到struts.xml的内容后,是将内容封装进javabean对象而后存放在内存中,之后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件。
struts2框架的核心控制器是什么?它有什么做用?
1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。
2)做用:
负责拦截由<url-pattern>/*</url-pattern>指定的全部用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认状况下,若是用户请求的路径
不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,不然struts2框架将略过该请求的处理。
能够经过常量"struts.action.extension"修改action的后缀,如:
<constant name="struts.action.extension" value="do"/>
若是用户须要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。
<constant name="struts.action.extension" value="do,go"/>
struts2配置文件的加载顺序? html

struts.xml ——> struts.properties
常量能够在struts.xml或struts.properties中配置,若是在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.
struts.xml文件的做用:通知Struts2框架加载对应的Action资源

struts2常量的修改方式? java

常量能够在struts.xml或struts.properties中配置,两种配置方式以下:
1)在struts.xml文件中配置常量
<constant name="struts.action.extension" value="do"/>
2)在struts.properties中配置常量(struts.properties文件放置在src下):
struts.action.extension=do

struts2如何访问HttpServletRequest、HttpSession、ServletContext三个域对象? web

方案一:
HttpServletRequest request =ServletActionContext.getRequest();
HttpServletResponse response =ServletActionContext.getResponse();
HttpSession session= request.getSession();
ServletContext servletContext=ServletActionContext.getServletContext();

方案二:
类 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware
注意:框架自动传入对应的域对象


struts2是如何管理action的?这种管理方式有什么好处? 面试

struts2框架中使用包来管理Action,包的做用和java中的类包是很是相似的。
主要用于管理一组业务功能相关的action。在实际应用中,咱们应该把一组业务功能相关的Action放在同一个包下。
struts2中的默认包struts-default有什么做用? spring

1)struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型,而Struts2不少核心的功能都是经过这些内置的拦截器实现,如:从请求中
把请求参数封装到action、文件上传和数据验证等等都是经过拦截器实现的。当包继承了struts-default包才能使用struts2为咱们提供的这些功能。
2)struts-default包是在struts-default.xml中定义,struts-default.xml也是Struts2默认配置文件。 Struts2每次都会自动加载 struts-default.xml文件。
3)一般每一个包都应该继承struts-default包。



struts2如何对指定的方法进行验证? 编程

1)validate()方法会校验action中全部与execute方法签名相同的方法;
2)要校验指定的方法经过重写validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写;
3)当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action能够继承ActionSupport), 若是系统 的fieldErrors包含失败信息,struts2会将请求转发到名为input的result;
4)在input视图中能够经过<s:fielderror/>显示失败信息。
5)先执行validateXxxx()->validate()->若是出错了,会转发<result name="input"/>所指定的页面,若是不出错,会直接进行Action::execute()方法


struts2默认能解决get和post提交方式的乱码问题吗? 设计模式

不能。struts.i18n.encoding=UTF-8属性值只能解析POST提交下的乱码问题。

请你写出struts2中至少5个的默认拦截器? 数组

fileUpload 提供文件上传功能
i18n 记录用户选择的locale
cookies 使用配置的name,value来是指cookies
checkbox 添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认状况下不提交没有选中的checkbox。
chain 让前一个Action的属性能够被后一个Action访问,如今和chain类型的result()结合使用。
alias 在不一样请求之间将请求参数在不一样名字件转换,请求内容不变


值栈ValueStack的原理与生命周期? 浏览器

1)ValueStack贯穿整个 Action 的生命周期,保存在request域中,因此ValueStack和request的生命周期同样。当Struts2接受一个请求时,会迅速建立ActionContext,
ValueStack,action。而后把action存放进ValueStack,因此action的实例变量能够被OGNL访问。 请求来的时候,action、ValueStack的生命开始,请求结束,action、 ValueStack的生命结束;
2)action是多例的,和Servlet不同,Servelt是单例的;
3)每一个action的都有一个对应的值栈,值栈存放的数据类型是该action的实例,以及该action中的实例变量,Action对象默认保存在栈顶;
4)ValueStack本质上就是一个ArrayList;
5)关于ContextMap,Struts 会把下面这些映射压入 ContextMap 中:
parameters : 该 Map 中包含当前请求的请求参数
request : 该 Map 中包含当前 request 对象中的全部属性 session :该 Map 中包含当前 session 对象中的全部属性
application :该 Map 中包含当前 application 对象中的全部属性
attr:该 Map 按以下顺序来检索某个属性: request, session, application
6)使用OGNL访问值栈的内容时,不须要#号,而访问request、session、application、attr时,须要加#号;
7)注意: Struts2中,OGNL表达式须要配合Struts标签才可使用。如:<s:property value="name"/>
8)在struts2配置文件中引用ognl表达式 ,引用值栈的值 ,此时使用的"$",而不是#或者%;


ActionContext、ServletContext、pageContext的区别? tomcat

1)ActionContext是当前的Action的上下文环境,经过ActionContext能够获取到request、session、ServletContext等与Action有关的对象的引用;
2)ServletContext是域对象,一个web应用中只有一个ServletContext,生命周期伴随整个web应用;
3)pageContext是JSP中的最重要的一个内置对象,能够经过pageContext获取其余域对象的应用,同时它是一个域对象,做用范围只针对当前页面,当前页面结束时,pageContext销毁,
生命周期是JSP四个域对象中最小的。

result的type属性中有哪几种结果类型?

一共10种:
dispatcher
struts默认的结果类型,把控制权转发给应用程序里的某个资源不能把控制权转发给一个外部资源,若须要把控制权重定向到一个外部资源, 应该使用
redirect结果类型
redirect 把响应重定向到另外一个资源(包括一个外部资源)
redirectAction 把响应重定向到另外一个 Action
freemarker、velocity、chain、httpheader、xslt、plainText、stream


拦截器的生命周期与工做过程?

1)每一个拦截器都是实现了Interceptor接口的 Java 类;
2)init(): 该方法将在拦截器被建立后当即被调用, 它在拦截器的生命周期内只被调用一次. 能够在该方法中对相关资源进行必要的初始化;
3)intercept(ActionInvocation invocation): 每拦截一个动做请求, 该方法就会被调用一次;
4)destroy: 该方法将在拦截器被销毁以前被调用, 它在拦截器的生命周期内也只被调用一次;
5)struts2中有内置了18个拦截器。

struts2如何完成文件的上传?

一、JSP页面: 1)JSP页面的上传文件的组件:<s: file name=”upload” />,若是须要一次上传多个文件, 就必须使用多个 file 标签, 但它们的名字必须是相同的,即: name=“xxx”的值必须同样; 2)必须把表单的enctype属性设置为:multipart/form-data; 3)表单的方法必须为post,由于post提交的数据在消息体中,而无大小限制。 二、对应的action: 1)在 Action 中新添加 3 个和文件上传相关的属性; 2)若是是上传单个文件, uploadImage属性的类型就是 java.io.File, 它表明被上传的文件, 第二个和第三个属性的类型是 String, 它们分别表明上传文 件的文件名和文件类型,定义方式是分别是: jsp页面file组件的名称+ContentType, jsp页面file组件的名称+FileName 3)若是上上传多个文件, 可使用数组或 List struts的工做原理一、初始化,读取struts-config.xml、web.xml等配置文件(全部配置文件的初始化)二、发送HTTP请求,客户端发送以.do结尾的请求三、填充FormBean(实例化、复位、填充数据、校验、保存)四、将请求转发到Action(调用Action的execute()方法)五、处理业务(能够调用后台类,返回ActionForward对象)六、返回目标响应对象(从Action返回到ActionServlet)七、转换Http请求到目标响应对象(查找响应,根据返回的Forward keyword)八、Http响应,返回到Jsp页面用本身的话简要阐述struts2的执行流程。Struts 2框架自己大体能够分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。业务控制器Action和业务逻辑组件是须要用户来本身实现的。用户在开发Action和业务逻辑组件的同时,还须要编写相关的配置文件,供核心控制器FilterDispatcher来使用。Struts 2的工做流程相对于Struts 1要简单,与WebWork框架基本相同,因此说Struts 2是WebWork的升级版本。基本简要流程以下:一、客户端浏览器发出HTTP请求。二、根据web.xml配置,该请求被FilterDispatcher接收。三、根据struts.xml配置,找到须要调用的Action类和方法, 并经过IoC方式,将值注入给Aciton。四、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。五、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。六、返回HTTP响应到客户端浏览器。它是以Webwork的设计思想为核心,吸取struts1的优势,能够说 struts2是struts1和Webwork结合的产物。 struts2 的工做原理图: 一个请求在Struts2框架中的处理分为如下几个步骤: 1.客户端发出一个指向servlet容器的请求(tomcat); 2.这个请求会通过图中的几个过滤器,最后会到达FilterDispatcher过滤器。 3.过滤器FilterDispatcher是struts2框架的心脏,在处理用户请求时,它和请求一块儿相互配合访问struts2 的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。 如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一 些基本信息,ActionMapper存有action的配置信息。在请求过程当中全部的对象(Action,Results, Interceptors,等)都是经过ObjectFactory来建立的。过滤器会经过询问ActionMapper类来查找请求中 须要用到的Action。 4.若是找到须要调用的Action,过滤器会把请求的处理交给ActionProxy。ActionProxy为Action的代理对象 。ActionProxy经过ConfigurationManager询问框架的配置文件,找到须要调用的Action类。 5.ActionProxy建立一个ActionInvocation的实例。ActionInvocation在ActionProxy层之下,它表示了 Action的执行状态,或者说它控制的Action的执行步骤。它持有Action实例和全部的Interceptor。 6.ActionInvocation实例使用命名模式来调用,1. ActionInvocation初始化时,根据配置,加载Action相 关的全部Interceptor。2. 经过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。在 调用Action的过程先后,涉及到相关拦截器(intercepetor)的调用。 7. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果 一般是(但不老是,也多是另外的一个Action链)一个须要被表示的JSP或者FreeMarker的模版。在表 示的过程当中可使用Struts2 框架中继承的标签。