Wicket源码初读
程序员文章站
2022-07-15 15:16:10
...
项目需要用到Wicket,对于我来说,这可真是个新兴事物。市面上用此框架的例子极少,但幸好有前人书写了《Wicket开发指南》,到底还是或多或少安慰了我对陌生事物恐惧的心灵。
1. 我们从web.xml开始着手:
在web.xml中描述使用WicketFilter作为Wicket的请求处理类,并使用applicationClassName作为外部参数,显然,这样做的目的是将WebApplication绑定到一个Filter。
2. 分析WicketFilter的初始化
如web.xml配置表现出的可能行为一致,WicketFilter通过WebAppFactory创建WebApp,并将自身和WebApp进行了绑定、执行WebApp的初始化。
3. 分析WebApplication的初始化
从图中表现分析WebApp的内部调用主要以定义HTML的链接解析为主。
另外,在上一步:“WicketFilter的初始化”中,对WebApp的最后几个调用来看,在完成内部初始化后,还调用外部定义的初始化方法init和组件的初始化方法initializeComponents。
WicketFilter初始化分析完毕,现在就来分析请求处理过程:
1. 先热热身,引用指南中对请求结构的描述:
2. 分析WicketFilter的请求处理
doFilter中没有重要的代码,看看核心的doGet:
这样看来,处理一个新的请求需要:
1. 包装HttpServletRequest到WebRequest;
2. 包装HttpServletResponse到WebResponse;
3. 建立一个新的请求上下文;
4. 调用WebApp的newRequestCycle建立请求过程;
5. 调用WebRequestCycle的request,处理请求。
3. 分析WebRequestCycle的request
图中的请求处理步骤描述:
1. 预备请求 (PREPAPE_REQUEST=1)
2. 目标处理 (RESOLVE_TARGET=2)
3. 事件处理 (PROCESS_EVENTS=3)
4. 响应请求 (RESPOND=4)
5. 分离请求 (DETACH_REQUEST=5)
6. 完成请求 (DONE=6)
其中,在1,2,3步中出现的任何错误都会直接跳入到第4步中。
关注“事件处理”和“请求响应”可以发现,它是将处理分派到对应的Target对象,由这些对象处理请求以返回结果。
至此源码的初读完毕,希望它对您有些许帮助。
1. 我们从web.xml开始着手:
<filter> <filter-name>MyApplication</filter-name> <filter-class> org.apache.wicket.protocol.http.WicketFilter</filter-class> <init-param> <param-name>applicationClassName</param-name> <param-value>com.web.MyApplication</param-value> </init-param> </filter> <filter-mapping> <filter-name>MyApplication</filter-name> <url-pattern>/do/*</url-pattern> </filter-mapping>
在web.xml中描述使用WicketFilter作为Wicket的请求处理类,并使用applicationClassName作为外部参数,显然,这样做的目的是将WebApplication绑定到一个Filter。
2. 分析WicketFilter的初始化
如web.xml配置表现出的可能行为一致,WicketFilter通过WebAppFactory创建WebApp,并将自身和WebApp进行了绑定、执行WebApp的初始化。
3. 分析WebApplication的初始化
从图中表现分析WebApp的内部调用主要以定义HTML的链接解析为主。
另外,在上一步:“WicketFilter的初始化”中,对WebApp的最后几个调用来看,在完成内部初始化后,还调用外部定义的初始化方法init和组件的初始化方法initializeComponents。
WicketFilter初始化分析完毕,现在就来分析请求处理过程:
1. 先热热身,引用指南中对请求结构的描述:
2. 分析WicketFilter的请求处理
doFilter中没有重要的代码,看看核心的doGet:
这样看来,处理一个新的请求需要:
1. 包装HttpServletRequest到WebRequest;
2. 包装HttpServletResponse到WebResponse;
3. 建立一个新的请求上下文;
4. 调用WebApp的newRequestCycle建立请求过程;
5. 调用WebRequestCycle的request,处理请求。
3. 分析WebRequestCycle的request
图中的请求处理步骤描述:
1. 预备请求 (PREPAPE_REQUEST=1)
2. 目标处理 (RESOLVE_TARGET=2)
3. 事件处理 (PROCESS_EVENTS=3)
4. 响应请求 (RESPOND=4)
5. 分离请求 (DETACH_REQUEST=5)
6. 完成请求 (DONE=6)
其中,在1,2,3步中出现的任何错误都会直接跳入到第4步中。
关注“事件处理”和“请求响应”可以发现,它是将处理分派到对应的Target对象,由这些对象处理请求以返回结果。
至此源码的初读完毕,希望它对您有些许帮助。
上一篇: 面试技巧(4)
下一篇: Nginx 重新加载配置