基于图片作者就知晓大家根本分析便是橙红色(Servlet,按照图片作者就精通我们最主要分析便是橙红色(Servlet

其它这里有声惠氏下:小编那里只想讲一些关于struts2连锁的文化。而像SiteMesh之类的撰稿人并不会长远。

图片 1图片 2

据悉图片小编就明白我们任重(英文名:rèn zhòng)而道远分析便是橙蓝色(Servlet
Filters)。也就是风传的过滤器(Filter)。相信看过笔者后边多少个章节的读者都知晓struts2的配置格局有三种。即是StrutsPrepareFilter+StrutsExecuteFilter和StrutsPrepareAndExecuteFilter。不管是哪种大多数都是一样子。小编用的是StrutsPrepareFilter+StrutsExecuteFilter来分析。那么让大家看看关于她们到底做了些什么。Prepare意为“准备”。猜的没有错。StrutsPrepareFilter类就是为了打开struts2事先加载一个连锁的配备和履行的必备音讯。同理,Execute意为“运行”。大家也就足以想像StrutsExecuteFilter类就是举行struts2。所谓分析就是要有一种敢于想像和狐疑的心情。然后在验证就行了。

图片 3图片 4

2.找到ActionProxy类。该类是用来执行action请求的。也是重大的类。(后边章节会讲到)

StrutsExecuteFilter类的源码

图片 5图片 6

章节简言
StrutsPrepareFilter类的工作

3.把当前的Dispatcher实例存放到当前的当地线程(ThreadLocal)中。而Dispatcher类是一个重大的基本类,struts2的action请求就是靠她来实施的。(对于Dispatcher类的意义不知情的话。没有事。后边我会对Dispatcher举办讲解)

2.创立一个新的action上下文。对于上下文不通晓的读者可以查看相关的篇章。即使那多少个的话,小编觉得你能够领略为进入房间的门一样子。action请求则是房间。新建一个房间就有一个新的门。新action请求就有一个新的action上下文。

上述是prepare成员变量的行事,他是第一目标就是依照request请求找到对应action映射。以造福StrutsExecuteFilter类依照action映射类里面的音信找到相应的用户action类,并实施。从此间小编就可以分明感觉出来,StrutsPrepareFilter类是执行action请求之前的有关准备工作。那么敏感的读者就会问:“正常在那前边应该会加载或早先化相关的配备音信才对呀?不然她背后执行action请求什么工作吗?”。没有错。让大家看一下过滤器(Filter)的办法init吧。可以肯定的提议加载相关的配置新闻就在此处开展的。他的劳作如下

地点的源码也做了部分简单的表明。当然那是小编的知道。如若您看了源码觉得小编了然的歇斯底里。没事!只要读者自己心里面了解原理的话就足以了。我们可以观望了累累的类,对于作者来讲在此之前有过经验,看起来比较轻松。可是对于四年前初学者的本身来讲,那正是天书。作者一个一个表明给读者听也不具体。那里作者只把关键的相关类拿出来讲解。希望读者们见谅!StrutsPrepareFilter类现实于接口StrutsStatics。那接口都是大批量常量。而StrutsPrepareFilter类本身有二个成员变量。其中一个分子变量prepare(PrepareOperations类)的劳作如下。

ExecuteOperations类的做事:

上边讲到StrutsPrepareFilter类的劳作,那么对于StrutsExecuteFilter类的干活就显示很粗略。就是执行action请求。让大家先看一下代码吧。如下

1.翻看用户是还是不是有自定义日志类。即使有,初阶化并实例用户定义的日志类。存放到LoggerFactory类里面。LoggerFactory类里面用的是单例形式。

StrutsExecuteFilter类的办事近来只需求精晓她是执行action请求的。若是读者不知情不要顾虑。作者后边会讲到。

 1 package org.apache.struts2.dispatcher.filter;
 2 
 3 import org.apache.struts2.StrutsStatics;
 4 import org.apache.struts2.dispatcher.Dispatcher;
 5 import org.apache.struts2.dispatcher.mapper.ActionMapping;
 6 import org.apache.struts2.dispatcher.ExecuteOperations;
 7 import org.apache.struts2.dispatcher.InitOperations;
 8 import org.apache.struts2.dispatcher.PrepareOperations;
 9 
10 import javax.servlet.*;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 import java.io.IOException;
14 
15 public class StrutsExecuteFilter implements StrutsStatics, Filter {
16     protected PrepareOperations prepare;//用于每一次请求之前,执行一些功能的类。
17     protected ExecuteOperations execute;//用于执行请求的功能类。
18 
19     protected FilterConfig filterConfig;
20 
21     public void init(FilterConfig filterConfig) throws ServletException {
22         this.filterConfig = filterConfig;
23     }
24 
25     protected synchronized void lazyInit() {
26         if (execute == null) {
27             InitOperations init = new InitOperations();//用于初始化的功能类
28             Dispatcher dispatcher = init.findDispatcherOnThread();
29             init.initStaticContentLoader(new FilterHostConfig(filterConfig), dispatcher);
30 
31             prepare = new PrepareOperations(dispatcher);
32             execute = new ExecuteOperations(dispatcher);
33         }
34 
35     }
36 
37     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
38 
39         HttpServletRequest request = (HttpServletRequest) req;
40         HttpServletResponse response = (HttpServletResponse) res;
41 
42         if (excludeUrl(request)) {//用于判断是否在排除的action之内。如果是就跳过。
43             chain.doFilter(request, response);
44             return;
45         }
46 
47         if (execute == null) {
48             lazyInit();//初始化相关的信息类。
49         }
50 
51         ActionMapping mapping = prepare.findActionMapping(request, response);//找到ActionMapping实例
52 
53   
54         Integer recursionCounter = (Integer) request.getAttribute(PrepareOperations.CLEANUP_RECURSION_COUNTER);
55 
56         if (mapping == null || recursionCounter > 1) {
57             boolean handled = execute.executeStaticResourceRequest(request, response);
58             if (!handled) {
59                 chain.doFilter(request, response);
60             }
61         } else {
62             execute.executeAction(request, response, mapping);//执行action请求
63         }
64     }
65 
66     private boolean excludeUrl(HttpServletRequest request) {
67         return request.getAttribute(StrutsPrepareFilter.REQUEST_EXCLUDED_FROM_ACTION_MAPPING) != null;
68     }
69 
70     public void destroy() {
71         prepare = null;
72         execute = null;
73         filterConfig = null;
74     }
75 
76 }

图片 7图片 8

StrutsPrepareFilter类的工作

3.把当前的Dispatcher实例存放到当前的地面线程(ThreadLocal)中。而Dispatcher类是一个根本的主题类,struts2的action请求就是靠他来推行的。(对于Dispatcher类的职能不晓得的话。没有事。后面我会对Dispatcher举办教学)

本章的重大并不是要知道什么去执行action请求。而是精通在执行action请求从前要做些什么工作。只要精通了这点大家就知晓对象是哪些。所以在本章笔者在讲StrutsPrepareFilter类的时候,讲的可比多。就是要让读者知道准备工作都有如何什么。

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

 1 package org.apache.struts2.dispatcher.filter;
 2 
 3 import org.apache.struts2.StrutsStatics;
 4 import org.apache.struts2.dispatcher.Dispatcher;
 5 import org.apache.struts2.dispatcher.InitOperations;
 6 import org.apache.struts2.dispatcher.PrepareOperations;
 7 
 8 import javax.servlet.Filter;
 9 import javax.servlet.FilterChain;
10 import javax.servlet.FilterConfig;
11 import javax.servlet.ServletException;
12 import javax.servlet.ServletRequest;
13 import javax.servlet.ServletResponse;
14 import javax.servlet.http.HttpServletRequest;
15 import javax.servlet.http.HttpServletResponse;
16 import java.io.IOException;
17 import java.util.List;
18 import java.util.regex.Pattern;
19 
20 public class StrutsPrepareFilter implements StrutsStatics, Filter {
21 
22     protected static final String REQUEST_EXCLUDED_FROM_ACTION_MAPPING = StrutsPrepareFilter.class.getName() + ".REQUEST_EXCLUDED_FROM_ACTION_MAPPING";
23 
24     protected PrepareOperations prepare;//用于每一次请求之前,执行一些功能的类。
25     protected List<Pattern> excludedPatterns = null;
26 
27     public void init(FilterConfig filterConfig) throws ServletException {
28         InitOperations init = new InitOperations();//用于初始化相关的功能操作。你可以理解为工具类一样子。
29         Dispatcher dispatcher = null;//这个类相当的重要。他的作用连接着StrutsExecuteFilter。这里可以命名为调结者。
30         try {
31             FilterHostConfig config = new FilterHostConfig(filterConfig);//这里可以理解为把filterConfig在进行封装FilterHostConfig更为主便操作和理解。
32             init.initLogging(config);//获取名为loggerFactory的参数,并实例化这个类。一般为去用户自定义日志。
33             dispatcher = init.initDispatcher(config);//初化调结者。这里是重要。
34 
35             prepare = new PrepareOperations(dispatcher);
36             this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);//加载排除在内的action的正则表达式
37 
38             postInit(dispatcher, filterConfig);
39         } finally {
40             if (dispatcher != null) {
41                 dispatcher.cleanUpAfterInit();
42             }
43             init.cleanup();
44         }
45     }
46 
47     protected void postInit(Dispatcher dispatcher, FilterConfig filterConfig) {
48     }
49 
50     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
51 
52         HttpServletRequest request = (HttpServletRequest) req;
53         HttpServletResponse response = (HttpServletResponse) res;
54 
55         try {
56             if (excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
57                 request.setAttribute(REQUEST_EXCLUDED_FROM_ACTION_MAPPING, new Object());
58             } else {
59                 prepare.setEncodingAndLocale(request, response);//设置请求的格式编码。
60                 prepare.createActionContext(request, response);//action的上下文
61                 prepare.assignDispatcherToThread();//把Dispatcher放入本地线程里面。
62                 request = prepare.wrapRequest(request);
63                 prepare.findActionMapping(request, response);//找到action映射的信息
64             }
65             chain.doFilter(request, response);
66         } finally {
67             prepare.cleanupRequest(request);
68         }
69     }
70 
71     public void destroy() {
72         prepare.cleanupDispatcher();
73     }
74 
75 }

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

4.加载用户自定义不应有被表面访问的action相呼应的正则表明式。那边也就是StrutsPrepareFilter类里面的另一个分子变量。

章节简言

StrutsExecuteFilter类的劳作近来只需求驾驭他是执行action请求的。若是读者不知晓不要担心。小编后边会讲到。

StrutsPrepareFilter那几个类必须在StrutsExecuteFilter类之前运行。否则就会出错。当然struts2运转起来的时候,框架也有有关的提拔您。那么先让我们看一下代码吧。如下

除此以外那里有扬言一下:小编那里只想讲一些有关struts2巢倾卵破的文化。而像SiteMesh之类的小编并不会深深。

 1 package org.apache.struts2.dispatcher.filter;
 2 
 3 import org.apache.struts2.StrutsStatics;
 4 import org.apache.struts2.dispatcher.Dispatcher;
 5 import org.apache.struts2.dispatcher.mapper.ActionMapping;
 6 import org.apache.struts2.dispatcher.ExecuteOperations;
 7 import org.apache.struts2.dispatcher.InitOperations;
 8 import org.apache.struts2.dispatcher.PrepareOperations;
 9 
10 import javax.servlet.*;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 import java.io.IOException;
14 
15 public class StrutsExecuteFilter implements StrutsStatics, Filter {
16     protected PrepareOperations prepare;//用于每一次请求之前,执行一些功能的类。
17     protected ExecuteOperations execute;//用于执行请求的功能类。
18 
19     protected FilterConfig filterConfig;
20 
21     public void init(FilterConfig filterConfig) throws ServletException {
22         this.filterConfig = filterConfig;
23     }
24 
25     protected synchronized void lazyInit() {
26         if (execute == null) {
27             InitOperations init = new InitOperations();//用于初始化的功能类
28             Dispatcher dispatcher = init.findDispatcherOnThread();
29             init.initStaticContentLoader(new FilterHostConfig(filterConfig), dispatcher);
30 
31             prepare = new PrepareOperations(dispatcher);
32             execute = new ExecuteOperations(dispatcher);
33         }
34 
35     }
36 
37     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
38 
39         HttpServletRequest request = (HttpServletRequest) req;
40         HttpServletResponse response = (HttpServletResponse) res;
41 
42         if (excludeUrl(request)) {//用于判断是否在排除的action之内。如果是就跳过。
43             chain.doFilter(request, response);
44             return;
45         }
46 
47         if (execute == null) {
48             lazyInit();//初始化相关的信息类。
49         }
50 
51         ActionMapping mapping = prepare.findActionMapping(request, response);//找到ActionMapping实例
52 
53   
54         Integer recursionCounter = (Integer) request.getAttribute(PrepareOperations.CLEANUP_RECURSION_COUNTER);
55 
56         if (mapping == null || recursionCounter > 1) {
57             boolean handled = execute.executeStaticResourceRequest(request, response);
58             if (!handled) {
59                 chain.doFilter(request, response);
60             }
61         } else {
62             execute.executeAction(request, response, mapping);//执行action请求
63         }
64     }
65 
66     private boolean excludeUrl(HttpServletRequest request) {
67         return request.getAttribute(StrutsPrepareFilter.REQUEST_EXCLUDED_FROM_ACTION_MAPPING) != null;
68     }
69 
70     public void destroy() {
71         prepare = null;
72         execute = null;
73         filterConfig = null;
74     }
75 
76 }

2.找到ActionProxy类。该类是用以执行action请求的。也是非同寻常的类。(前面章节会讲到)

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

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

4.加载用户自定义不应有被外表访问的action相呼应的正则表明式。那边也就是StrutsPrepareFilter类里面的另一个分子变量。

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

4.把HttpServletRequest请求封装成为StrutsRequestWrapper或是MultiPartRequestWrapper。可以说那部分的行事也是靠Dispatcher实例来举办的。

5.找到action映射类(ActionMapping)的实例。并把她存在到request请求里面。他对应的Key为“struts.actionMapping”;
读者会问ActionMapping类是何许东东。现在能够精通为内部存放用户action的安顿新闻。大白话就是用户在地方栏上输入URL找到相应的action类。

StrutsExecuteFilter类的源码

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

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

init方法:

图片 9

2.创立一个新的action上下文。对于上下文不明了的读者能够查阅相关的稿子。假如那多少个的话,小编认为你可以精通为进入房间的门一样子。action请求则是房间。新建一个屋子就有一个新的门。新action请求就有一个新的action上下文。

prepare成员变量的劳作:

StrutsPrepareFilter那几个类必须在StrutsExecuteFilter类此前运行。否则就会出错。当然struts2运行起来的时候,框架也有连带的提示您。那么先让我们看一下代码吧。如下

本章总结
本章总结

本章的关键并不是要清楚什么样去执行action请求。而是通晓在执行action请求之前要做些什么工作。只要知道了这点大家就了然对象是何等。所以在本章小编在讲StrutsPrepareFilter类的时候,讲的相比较多。就是要让读者知道准备干活都有啥什么。

作者在这几个类上的注释相比较简单,紧如果小编不驾驭这一个类什么体统去讲。因为这么些类比StrutsPrepareFilter类来讲简单多了。工作也很纯粹。所以作者一下子不知底要怎样样子去申明。作者认为这么些类的重中之重有二个地方。一是lazyInit方法,二是ExecuteOperations类的行事。而里面lazyInit方法紧若是用于先导化相关须要的类。并不曾值得注意的点。那么为啥小编却要说他是必不可缺之一吧?问题在于她还有一个行事是伊始化静态内容加载器(StaticContentLoader类)。可惜不是本章的第一。所以小编要讲的是ExecuteOperations类的办事。如下

5.找到action映射类(ActionMapping)的实例。并把她存在到request请求里面。他对应的Key为“struts.actionMapping”;
读者会问ActionMapping类是如何东东。现在得以知道为内部存放用户action的布局音信。大白话就是用户在地点栏上输入URL找到相应的action类。

正如上述所讲的就是StrutsPrepareFilter类的办事。不难点讲就是为action请求执行以前做好一切准备的类。其中init方法就是用以加载相关部署文件,早先化音讯的工作。而PrepareOperations类是用于request请求的处理。其中包设置格式,找对应的action映射类等等操作。即是ActionMapping类。

如上是prepare成员变量的干活,他是紧要目标就是基于request请求找到对应action映射。以方便StrutsExecuteFilter类按照action映射类里面的新闻找到相应的用户action类,并履行。从那里小编就可以明显感到出来,StrutsPrepareFilter类是执行action请求之前的相干准备工作。那么敏感的读者就会问:“正常在那以前应该会加载或初步化相关的安顿音信才对呀?不然她背后执行action请求什么工作吧?”。没有错。让我们看一下过滤器(Filter)的点子init吧。可以明确的指出加载相关的布置音讯就在此间进行的。他的工作如下

地方讲到StrutsPrepareFilter类的干活,那么对于StrutsExecuteFilter类的工作就显示很不难。就是执行action请求。让大家先看一下代码吧。如下

 1 package org.apache.struts2.dispatcher.filter;
 2 
 3 import org.apache.struts2.StrutsStatics;
 4 import org.apache.struts2.dispatcher.Dispatcher;
 5 import org.apache.struts2.dispatcher.InitOperations;
 6 import org.apache.struts2.dispatcher.PrepareOperations;
 7 
 8 import javax.servlet.Filter;
 9 import javax.servlet.FilterChain;
10 import javax.servlet.FilterConfig;
11 import javax.servlet.ServletException;
12 import javax.servlet.ServletRequest;
13 import javax.servlet.ServletResponse;
14 import javax.servlet.http.HttpServletRequest;
15 import javax.servlet.http.HttpServletResponse;
16 import java.io.IOException;
17 import java.util.List;
18 import java.util.regex.Pattern;
19 
20 public class StrutsPrepareFilter implements StrutsStatics, Filter {
21 
22     protected static final String REQUEST_EXCLUDED_FROM_ACTION_MAPPING = StrutsPrepareFilter.class.getName() + ".REQUEST_EXCLUDED_FROM_ACTION_MAPPING";
23 
24     protected PrepareOperations prepare;//用于每一次请求之前,执行一些功能的类。
25     protected List<Pattern> excludedPatterns = null;
26 
27     public void init(FilterConfig filterConfig) throws ServletException {
28         InitOperations init = new InitOperations();//用于初始化相关的功能操作。你可以理解为工具类一样子。
29         Dispatcher dispatcher = null;//这个类相当的重要。他的作用连接着StrutsExecuteFilter。这里可以命名为调结者。
30         try {
31             FilterHostConfig config = new FilterHostConfig(filterConfig);//这里可以理解为把filterConfig在进行封装FilterHostConfig更为主便操作和理解。
32             init.initLogging(config);//获取名为loggerFactory的参数,并实例化这个类。一般为去用户自定义日志。
33             dispatcher = init.initDispatcher(config);//初化调结者。这里是重要。
34 
35             prepare = new PrepareOperations(dispatcher);
36             this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);//加载排除在内的action的正则表达式
37 
38             postInit(dispatcher, filterConfig);
39         } finally {
40             if (dispatcher != null) {
41                 dispatcher.cleanUpAfterInit();
42             }
43             init.cleanup();
44         }
45     }
46 
47     protected void postInit(Dispatcher dispatcher, FilterConfig filterConfig) {
48     }
49 
50     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
51 
52         HttpServletRequest request = (HttpServletRequest) req;
53         HttpServletResponse response = (HttpServletResponse) res;
54 
55         try {
56             if (excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
57                 request.setAttribute(REQUEST_EXCLUDED_FROM_ACTION_MAPPING, new Object());
58             } else {
59                 prepare.setEncodingAndLocale(request, response);//设置请求的格式编码。
60                 prepare.createActionContext(request, response);//action的上下文
61                 prepare.assignDispatcherToThread();//把Dispatcher放入本地线程里面。
62                 request = prepare.wrapRequest(request);
63                 prepare.findActionMapping(request, response);//找到action映射的信息
64             }
65             chain.doFilter(request, response);
66         } finally {
67             prepare.cleanupRequest(request);
68         }
69     }
70 
71     public void destroy() {
72         prepare.cleanupDispatcher();
73     }
74 
75 }

2.实例化Dispatcher类,并起始化加载相关的安插的音信文件。如 default.properties文件,struts-default.xml文件等等。

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

依据图片作者就驾驭我们第一分析便是橙藏青色(Servlet
Filters)。也就是神话的过滤器(Filter)。相信看过作者前边多少个章节的读者都晓得struts2的布局方式有三种。即是StrutsPrepareFilter+StrutsExecuteFilter和StrutsPrepareAndExecuteFilter。不管是哪种超过一半都是一样子。小编用的是StrutsPrepareFilter+StrutsExecuteFilter来分析。那么让大家看看关于他们究竟做了些什么。Prepare意为“准备”。猜的从未有过错。StrutsPrepareFilter类就是为着打开struts2事先加载一个连锁的布局和施行的必需新闻。同理,Execute意为“运行”。大家也就可以想像StrutsExecuteFilter类就是执行struts2。所谓分析就是要有一种敢于想像和可疑的心情。然后在认证就行了。

init方法:

上一章小编试着建一个Hello
world的例证。是一个空荡荡的struts2事例。了解了运转struts2足足要求用到哪一部分Jar包。而这一章作者将基于前面章节(Struts2
源码分析——要旨机制
)里的编制图片来分析源码。倘诺还不知道大旨机制的情侣,请转到对应的章节举行阅读。作者为了方便读者读书,也把图纸在次贴到了本章中。如下

小编在那一个类上的注脚比较简单,重假如小编不了然这些类什么体统去讲。因为那些类比StrutsPrepareFilter类来讲不难多了。工作也很纯粹。所以作者一下子不了解要如何样子去注脚。小编以为那些类的第一有二个地方。一是lazyInit方法,二是ExecuteOperations类的行事。而内部lazyInit方法首倘若用于伊始化相关需求的类。并不曾值得注意的点。那么为啥小编却要说他是最首要之一吧?难点在于她还有一个办事是先导化静态内容加载器(StaticContentLoader类)。可惜不是本章的紧要性。所以作者要讲的是ExecuteOperations类的办事。如下

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

上一章作者试着建一个Hello
world的例证。是一个空荡荡的struts2事例。领悟了运行struts2最少必要用到哪一部分Jar包。而这一章小编将基于前边章节(Struts2
源码分析——焦点机制
)里的体制图片来分析源码。即便还不清楚主旨机制的朋友,请转到对应的章节进行阅读。作者为了有利于读者读书,也把图片在次贴到了本章中。如下

3.组装action请求执行的结果。也是非同小可的类。(前面章节会讲到)

3.组装action请求执行的结果。也是最主要的类。(前面章节会讲到)

StrutsExecuteFilter类的工作
StrutsExecuteFilter类的工作

StrutsPrepareFilter 类的源码

1.翻看用户是不是有自定义日志类。尽管有,起首化并实例用户定义的日志类。存放到LoggerFactory类里面。LoggerFactory类里面用的是单例情势。

地方的源码也做了一部分简练的注脚。当然那是小编的知晓。如若您看了源码觉得作者精晓的反常。没事!只要读者自己心里面驾驭原理的话就足以了。大家可以看来了诸多的类,对于小编来讲从前有过经验,看起来相比轻松。不过对于四年前初学者的自己来讲,那正是天书。作者一个一个演说给读者听也不现实。那里小编只把主要的相关类拿出去讲解。希望读者们见谅!StrutsPrepareFilter类现实于接口StrutsStatics。那接口都是多量常量。而StrutsPrepareFilter类本身有二个成员变量。其中一个分子变量prepare(PrepareOperations类)的干活如下。

StrutsPrepareFilter 类的源码

图片 10

ExecuteOperations类的劳作:

prepare成员变量的工作: