读书人

struts2请求处理历程源代码分析(1)

发布时间: 2013-04-07 12:50:11 作者: rapoo

struts2请求处理过程源代码分析(1)

网上对于struts2请求处理流程的讲解还是比较多的,有的还是非常详细的,所以这里我就简单地将大概流程总结下,有了个大概印象后理解起源码就会有一定的思路了:

struts2的请求处理过程实际上是在初始化中加载的配置及容器的基础上,通过请求的url分析出命名空间、action名称、方法名称,在利用命名空间检索出该命名空间下配置的所有antion,在通过action名称找到具体的action,生成action实例,如果该action上配置了拦截器则依次调用拦截器,之后调用action中方法名称指定的方法,最后通过配置中的result返回相应视图。

版本:struts2-2.1.6 ?xwork-2.1.2

下面就通过源码进行分析下:

struts2中处理请求是通过过滤器org.apache.struts2.dispatcher.FilterDispatcher的doFilter()方法实现的,如下:

?

ValueStack就是通常所说的"值栈",系统每次请求时都会创建个新的ValueStack,其中会保存着本次请求处理的所有中间数据,如:请求的action实例、各种servlet内置对象(request、response、session、application等)、请求参数等。F5看下定义:

?

直接看(String) getStack().findValue(value, String.class) ?调用getStack()获得ValueStack,这个ValueStack实在Property实例生成时通过构造方法传入的。之后调用ValueStack的findValue()方法, 其中参数value就是<s:property value=""/>标签的value属性值。我们在上面说过ValueStack的实现类默认使用的是com.opensymphony.xwork2.ognl.OgnlValueStack类,F5进入其findValue():


public Object getValue(String name, Map<String, Object> context, Object root, Class resultType) throws OgnlException {        return Ognl.getValue(compile(name), context, root, resultType);    }

实际上,上面的方法只是将name做处理后直接调用ognl的getValue()方法。context作为ognl的上下文,root作为ognl的根对象,name是属性名。此时的root中就存放着当前action的实例。return返回的值就是<s:property value=""/>标签最终所获得的值。说道这熟悉ognl的应该已经明白了。

?

?

?

?

?

?

?

?

读书人网 >开源软件

热点推荐