A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 谷粒姐姐 于 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对象
   


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马