您的位置:首页 > 编程语言 > Java开发

Struts2 源码分析——过滤器(Filter)

2017-03-15 09:46 246 查看
StrutsPrepareFilter 类的源码
上面的源码也做了一些简单的注解。当然这是笔者的理解。如果你看了源码觉得笔者理解的不对。没事!只要读者自己心里面明白原理的话就可以了。我们可以看到了好多的类,对于笔者来讲以前有过经验,看起来比较轻松。但是对于四年前初学者的我来讲,那真是天书。笔者一个一个解释给读者听也不现实。这里笔者只把主要的相关类拿出来讲解。希望读者们见谅!StrutsPrepareFilter类现实于接口StrutsStatics。这接口都是大量常量。而StrutsPrepareFilter类本身有二个成员变量。其中一个成员变量prepare(PrepareOperations类)的工作如下。

prepare成员变量的工作:

1.设置request请求的本地化。即是:本地语言和编码格式。

2.创建一个新的action上下文。对于上下文不理解的读者可以查看相关的文章。如果不行的话,笔者认为你可以理解为进入房间的门一样子。action请求则是房间。新建一个房间就有一个新的门。新action请求就有一个新的action上下文。

3.把当前的Dispatcher实例存放到当前的本地线程(ThreadLocal)中。而Dispatcher类是一个重要的核心类,struts2的action请求就是靠他来执行的。(对于Dispatcher类的作用不理解的话。没有事。后面我会对Dispatcher进行讲解)

4.把HttpServletRequest请求封装成为StrutsRequestWrapper或是MultiPartRequestWrapper。可以说这部分的工作也是靠Dispatcher实例来执行的。

5.找到action映射类(ActionMapping)的实例。并把他存在到request请求里面。他对应的Key为“struts.actionMapping”; 读者会问ActionMapping类是什么东东。现在可以理解为里面存放用户action的配置信息。大白话就是用户在地址栏上输入URL找到对应的action类。

以上是prepare成员变量的工作,他是主要目的就是根据request请求找到对应action映射。以便于StrutsExecuteFilter类根据action映射类里面的信息找到对应的用户action类,并执行。从这里笔者就可以明显感觉出来,StrutsPrepareFilter类是执行action请求之前的相关准备工作。那么敏感的读者就会问:“正常在这之前应该会加载或初始化相关的配置信息才对啊?不然他后面执行action请求什么工作呢?”。没有错。让我们看一下过滤器(Filter)的方法init吧。可以明确的指出加载相关的配置信息就在这里进行的。他的工作如下

init方法:

1.查看用户是否有自定义日志类。如果有,初始化并实例用户定义的日志类。存放到LoggerFactory类里面。LoggerFactory类里面用的是单例模式。

2.实例化Dispatcher类,并初始化加载相关的配置的信息文件。如 default.properties文件,struts-default.xml文件等等。

3.实例化PrepareOperations类,Dispatcher实例存放进去。为之后的request请求工作做准备。即是上面PrepareOperations类所讲的。

4.加载用户自定义不应该被外部访问的action相对应的正则表达式。这边也就是StrutsPrepareFilter类里面的另一个成员变量。

正如上述所讲的就是StrutsPrepareFilter类的工作。简单点讲就是为action请求执行之前做好一切准备的类。其中init方法就是用于加载相关配置文件,初始化信息的工作。而PrepareOperations类是用于request请求的处理。其中包设置格式,找对应的action映射类等等操作。即是ActionMapping类。

StrutsExecuteFilter类的工作
上面讲到StrutsPrepareFilter类的工作,那么对于StrutsExecuteFilter类的工作就显得很简单。就是执行action请求。让我们先看一下代码吧。如下

StrutsExecuteFilter类的源码
笔者在这个类上的注解比较简单,主要是笔者不知道这个类什么样子去讲。因为这个类比StrutsPrepareFilter类来讲简单多了。工作也很单一。所以笔者一下子不知道要什么样子去注解。笔者认为这个类的重点有二个地方。一是lazyInit方法,二是ExecuteOperations类的工作。而其中lazyInit方法主要是用于初始化相关需要的类。并没有值得注意的点。那么为什么笔者却要说他是重点之一呢?问题在于他还有一个工作是初始化静态内容加载器(StaticContentLoader类)。可惜不是本章的重点。所以笔者要讲的是ExecuteOperations类的工作。如下

ExecuteOperations类的工作:

1.组装相关的Map类。如requestMap,params,session 等。

2.找到ActionProxy类。该类是用于执行action请求的。也是关键的类。(后面章节会讲到)

3.组装action请求执行的结果。也是关键的类。(后面章节会讲到)

StrutsExecuteFilter类的工作目前只需要知道他是执行action请求的。如果读者不明白不要担心。笔者后面会讲到。

本章总结
本章的重点并不是要知道如何去执行action请求。而是知道在执行action请求之前要做些什么工作。只要明白了这一点我们就知道目标是什么。所以在本章笔者在讲StrutsPrepareFilter类的时候,讲的比较多。就是要让读者明白准备工作都有哪些什么。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: