本帖最后由 谷粒姐姐 于 2018-3-5 11:05 编辑
srtuts2 struts2的执行流程? 1.请求到达struts2的核心过滤器 StrutsPrepareAndExecuteFilter 2.StrutsPrepareAndExecuteFilter会将请求转发给ActionMapper。ActionMapper负责识别当前的请求是否需要Struts2做出处理 3.若该请求是一个 Struts2 请求,则生成代理对象 ActionProxy 4.ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类,然后创建ActionInvocation实例 5 ActionInvocation 实例在调用 Action 的过程前后,涉及到相关拦截器的调用。 6. Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置,找到对应的返回结果,渲染结果。 7.ActionInvocation实例倒序执行拦截器 8.把结果响应到到客户端 Struts2中的拦截器有什么用?列举框架提供的拦截器名称?(至少3种,可用中文名) 拦截器是struts2的核心,拦截器是在访问某个Action或Action的某个方法,之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现。拦截器栈(Interceptor Stack)类似于过滤器链。拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器栈的拦截器就会按其之前定义的顺序被调用。 常用的拦截器有:fileUpload:提供文件上传。 i18n:记录用户选择的区域环境 logger:输出Action的名字 params:将请求中的参数设置到Action中去。 什么是OGNL OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图。 值栈(ValueStack) 值栈是对应每一个请求对象的轻量级的数据存储中心,在这里统一管理着数据,供Action、Result、Interceptor等Struts2的其他部分使用,这样数据被集中管理起来而不凌乱。简单的说,值栈能够线程安全的为每个请求提供公共的数据存取服务。当有请求的时候,Struts2会为每个请求创建一个新的值栈,也就是说,值栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据。 正是因为值栈和请求的对应关系,因此值栈能保证线程安全的为每个请求提供公共的数据存取服务。 值栈的内部结构? 值栈由两部分组成 root :compoundRoot其实就是一个ArrayList. context :OgnlContext其实就是一个Map。context中有root的引用,context中还存在 request、 session、application、 attr、 parameters 对象引用 * 操作值栈 默认指 操作 root 元素 值栈ValueStack 和 ActionContext关系? 每一个Action都有一个属于自己的值栈,ActionContext是Action的上下文,值栈对象是请求时创建的,创建ActionContext 对象过程中,创建值栈对象,ActionContext对象持有对ValueStack对象的引用。 如何获得值栈对象? 获得值栈对象 有两种方法 1.(ValueStack)ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY); 2.ValueStack valueStack2 = ActionContext.getContext().getValueStack(); EL为什么能访问值栈中的数据? 因为Struts2对Request对象进行了包装,重写了Request的getAttribute()方法 Action书写的的三种格式 1.第一种 Action可以是 POJO ,不需要继承任何父类,实现任何接口 2.实现Action接口 3.继承ActionSupport,因为此类中实现了很多的实用接口,提供了很多默认方法,这些默认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。 struts2的Action中如何使用ServletAPI? 1、 在Action 中解耦合方式 间接访问 Servlet API ----使用 ActionContext 对象 actionContext = ActionContext.getContext(); 1) actionContext.getParameters(); 获得所有请求参数Map集合 2) actionContext.put("company", "传智播客"); / actionContext.get("company") 对request范围存取数据 3) actionContext.getSession(); 获得session数据Map,对Session范围存取数据 4) actionContext.getApplication(); 获得ServletContext数据Map,对应用访问存取数据 2、 使用接口注入的方式,操作Servlet API (耦合) ServletContextAware : 注入ServletContext对象 ServletRequestAware :注入 request对象 ServletResponseAware : 注入response对象 3、 在Action中直接通过 ServletActionContext 获得Servlet API ServletActionContext.getRequest() : 获得request对象 (session) ServletActionContext.getResponse() : 获得response 对象 ServletActionContext.getServletContext() : 获得ServletContext对象
|