一、简述struts2的执行流程
- 请求发给StrutsPrepareAndExecuteFilter
- StrutsPrepareAndExecuteFilter判断该请求是不是一个struts请求
- 若是struts请求,则StrutsPrepareAndExecuteFilter将请求的处理交给ActionProxy
- ActionProxy创建一个ActionInvocation实例,并进行初始化
- ActionInvocation实例在调用action的过程前后,涉及到相关拦截器的调用
- Action执行完毕后,ActionInvocation负责根据struts.xml中的配置找到相应的返回结果。调用结果的execute方法,渲染结果
- 执行各个拦截器invocatioin.invoke()之后的代码
- 把结果发送到客户端
二.struts2拦截器和过滤器的区别
- 过滤器依赖于servlet容器,拦截器不依赖于servlet容器
- struts2拦截器只对action请求起作用,而过滤器则可以对几乎对所有请求起拦截作用
- 拦截器可以访问Acion上下文(ActionContext)、值栈里的对象(ValueStack),而过滤器不能
- 在Action的生命周期中,拦截器可以被多次调用,而过滤器只能在容器初始化时被调用一次
三、struts2的优点
- 基于MVC架构,框架结构清晰
- 使用OGNL:OGNL可以快捷的访问值栈中的数据、调用值栈中的对象的方法
- 拦截器:struts的拦截器是一个Action级别的AOP,struts2中的许多特性都是通过拦截器实现的,例如异常处理,文件上传,验证等。拦截器是可配置和重用的
- 多种表现层技术:如JSP、FreeMarker、Velocity等
四、struts2如何访问HttpServletRequest、HttpSession、ServletContext三个域对象
- 与servlet API解耦的方式
- 通过ActionContext访问域对象对应的Map对象
- 通过实现Aware接口使struts2注入对应的Map对象
2.与Servlet API耦合的方式
- 通过ServletActionContext直接获取Servlet API对象
- 通过实现ServletXxxAware接口方式使struts2注入对应的Map对象
五、struts2默认的struts-default包有什么作用
- struts-default包是struts内置的,它定义了struts2内部的众多拦截器和Result类型,而struts2很多核心的功能都是通过这些内置的拦截器实现,如;从请求中吧请求参数封装到action、文件上传和数据验证等都是通过拦截器实现的。当包集成了struts-default包才能使用struts2为我们提供的这些功能。
- struts-default包是在struts-default.xml中定义,struts-default.xml也是struts2 的默认配置文件。struts2每次都会自动加载struts-default.xml文件。
- 通常每个包都应该继承struts-default包。
六、说出struts2中至少5个默认的拦截器
exception;fileUpload;i18N;modelDriven;params;prepare; token;tokenSession;validation等
七、谈谈ValueStack
- ValueStack贯穿Action的整个生命周期,保存在request域中,所以ValueStack和request的生命周期一样。当struts2接受一个请求是,会迅速创建ActionContext,ValueStack,Action。然后把Action存放进ValueStack,所以Action的实例变量可以被OGNL访问。请求来的时候,Action、ValueStack的生命开始;请求结束,Action、ValueStakc的生命结束。
- 值栈是多实例的,因为Acion是多例的(和Servlet不一样,Servlet是单例的),而每个Action都有一个对应的值栈,Action对象默认保存在栈顶。
- ValueStack本质上就是一个ArrayList(查看源代码得到);
- 使用OGNL访问值栈的内容是,不需要#好,而访问request、session、application、attr时,需要加#号;
- struts2重写了request的getAttribute()方法,所以可以使用EL直接访问值栈中的内容
八、ActionContext、ServletContext、PageContext的区别
- ActionContext是struts2的API:是当前的Action的上下文环境
- ServletContext和PageContext是Servlet的API
九、struts2有那就中结果类型
参看struts-default.xml中的相关配置:dispatcher、chain、redirect等。
十、拦截器和生命后期与工作过程
每个拦截器都需要实现Interceptor接口
- init():在拦截器被创建后立即被调用,它在拦截器的声明后期内只被调用一次。可以在该方法中对相关资源进行必要的初始化;
- intercept(ActionInvocation invocation):每拦截一个动作请求,该方法就会被调用一次;
- destroy():在方法将在拦截器被销毁之前被调用,它在拦截器的生命周期内也只被调用一次。
十一、如何在struts中使用Ajax 功能
- JSON plugin
- DOJO plugin
- DWR plugin
- 使用Stream结果类型