1、Struts2如何启动?
Struts2通过在web.xml文件中配置的StrutsPrepareAndExecuteFilter过滤器启动,容器在启动的时候,会执行过滤器中的init方法,在init方法中会加载struts.xml配置文件,并将配置文件的信息实例化化成一个bean,加载进内存中,以后每次请求就会从内存中读取数据,而不会每次都读取struts.xml文件。
2、Struts2配置文件的加载顺序?
default.properties -> struts-default.xml -> struts-plugins.xml -> struts.xml -> struts.locale
3、Struts2的工作流程?
1)客户端初始化一个指向Servlet容器的请求;
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
9)响应的返回是通过我们在web.xml中配置的过滤器
10)如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,则将会去清理sreadlocals。
4、StrutsPrepareAndExecuteFilter过滤器的作用?
StrutsPrepareAndExecuteFilter过滤器的作用主要负责拦截url,可以下web.xml中通过配置需要拦截的请求,默认情况下,如果用户的请求没有后缀或以.action结尾,则会将请求转入Struts2框架处理。
5、Struts2如何管理Action?
Struts2通过package管理Action,包的功能Java中的包相似,通常是将业务功能相同的Action放在同一个package下。
6、Struts2中的struts-default的作用?
struts-default包是Struts2中的默认包,其提供了很多功能,在struts-default.xml中定义了很多拦截器和Result,Struts2的很多功能都是通过拦截器实现,例如:参数绑定、数据验证等,只有我们的包继承了struts-default包才能使用这些功能。
struts-default.xml在容器启动的时候加载,通常每个包都应该继承struts-default
7、Struts2中Action的组成?
访问的action通常有:命名空间+action.后缀 /base/actionName.action
8、命名空间的说明?
在说明extends用法的时候,我们引用了这样一个url:http://localhost:8080/struts2/base/helloWorld.action。
如果我们把url改成这样:http://localhost:8080/struts2/base/a/helloWorld.action。行吗?答案是可以的。
再改成这样的url:http://localhost:8080/struts2/base/a/b/helloWorld.action ,行吗?答案也是可以的。
如果这样呢http://localhost:8080/struts2/helloWorld.action可以吗?这样就不行了。为什么?
查找步骤:
1、 struts2会在当前的命名空间下查找相应的action
2、 如果找不到,则会在上级目录中查找,一直查找到根目录
3、 如果根目录也找不到,报错。
4、 如果直接访问的就是根目录,找不到,这样的情况就会直接报错。不会再去子目录中进行查找。
9、ActionSupport的说明?
ActionSupport类实现了Action接口,所以我们可以直接继承ActionSupport类。
ActionSupport中的execute方法没有实现,默认返回success。
10、在Action如果不指定class会怎么样?
在struts-default.xml中有如下属性<default-calss-ref class="com.opensymphony.xwork2.ActionSupport">
可以看出,如果不写class会默认找ActionSupport。
11、通配符说明?
通配符说明见博客。
12、Struts2常量的修改方式?
常量可以在struts.xml或struts.properties中配置,两种配置方式如下:
1、在struts.xml文件中配置常量
<constant name="struts.action.extension" value="do"/>
2、在struts.properties中配置常量(struts.properties文件放置在src下):
struts.action.extension=do
13、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()方法
14、Struts2能解决get和post方式的乱码问题吗?
不能。struts.i18n.encoding=UTF-8属性值只能解析POST提交下的乱码问题。
15、拦截器和过滤器的区别?
1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
16、写出Struts2的5种拦截器?
17、值栈的原理和生命周期?
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表达式 ,引用值栈的值 ,此时使用的"$",而不是#或者%;
18、ActionContext、ServletContext、pageContext的区别?
1、ActionContext是当前的Action的上下文环境,通过ActionContext可以获取到request、session、ServletContext等与Action有关的对象的引用;
2、ServletContext是域对象,一个web应用中只有一个ServletContext,生命周期伴随整个web应用;
3、pageContext是JSP中的最重要的一个内置对象,可以通过pageContext获取其他域对象的应用,同时它是一个域对象,作用范围只针对当前页面,当前页面结束时, pageContext销毁, 生命周期是JSP四个域对象中最小的。
19、简述Struts2的结果集类型?
dispatcher
struts默认的结果类型,把控制权转发给应用程序里的某个资源不能把控制权转发给一个外部资源,若需要把控制权重定向到一个外部资源, 应该使用
redirect结果类型
redirect 把响应重定向到另一个资源(包括一个外部资源)
redirectAction 把响应重定向到另一个 Action
freemarker、velocity、chain、httpheader、xslt、plainText、stream
20、Struts2的类型转换?
21、Struts2如何实现文件上传?