当前位置: 首页 > 工具软件 > Apache Wicket > 使用案例 >

Apache Wicket 学习 (Servlet & Filter)

汪弘盛
2023-12-01

如果使用 Wicket 的,那在 j2ee 的 web.xml 中或者使用 WicketServlet 或者使用 WicketFilter 来作为 wicket 与 J2EE 标准连接的入口。

 

那 WicketFilter 和 WicketServlet 究竟有什么不一样?

 

首先 ,明确 filter 和 servlet 的概念,

 

filter 是在 servlet 2.3 的标准添加的 feature,filter 可以通过配置后对一个符合 url mapping 的请求进行处理,包括对 request 的头信息以及消息体内数据的一些处理,也包括对 response 的处理,例如,将 response 的流引向另一个流对象

然后 filter 还可以组成一个链,及一个 filter 执行完之后,交由下一个 filter 完成。

 

servlet 就是一些根本的理解了,生命周期加上对 request 和 response 的处理,然后通过 web.xml 文件进行 mapping 的配置。

 

其次 ,wicket filter 和 wicket servlet 的区别,

 

单从代码上查阅,其实 wicket servlet 在其 doGet 以及 doPost 中都调用的是 wicket filter 的 doGet 方法,然后有一个 fallback 作为当 wicket 一个 request 处理过程中出现问题,实质上是在 requestCycle 处理 request 的 resolve target 这一步出现 target 解析不到 (我的理解是,无法映射到一个 wicket page 或者 wicket 类来处理这个请求)时,在交由 servlet 容器来处理(应该就是交由容器内置其的 servlet 处理,如果有匹配到的话)。

甚至 wicket servlet 的 init 方法都调用了 wicket filter 的 init 方法。

 

而在 wicket filter 中的 doGet 才是真正的 wicket 的 requestCycle 的开始或者说入口。

 

不过从使用上讲,wicket filter 可以当做一个 符合 servlet-api 标准或者 j2ee 标准的 filter 来使用,如果你希望处理 advanced chaining of resources(这个可能需要去仔细查看 wicket filter 在调用 doGet 之前的逻辑,不过我的理解是,最大的区别 filter 会使用到 http status 304 的特性,有点类似看这个请求对应的资源是否有修改过,如果没有并且还为失效,那就返回 304,wicket 是通过查看 http header If-Modified-Since 值来判断是否需要返回用户最新的资源,实际上是一种缓存技术的使用),就使用 wicket filter。

 

另外 ,在使用 wicket filter 的过程中,也许是因为版本的原因(1.3.7),我试图添加一个动态的 404 错误页面,当仅仅使用 servlet 时,一切都是 ok 的,通过配置 web.xml 中相应的变量,都可以简单的获得这些值,但是当使用 wicket 框架 webpage 的时候,并且用 wicket filter 作为框架入口时,就无法正常的 map 到相应的 wicket 页面,这时,我将 filter 换成了 servlet,一切又 ok 了。我的理解,如果使用 filter 的话,在无法找到一个 servlet 页面时,filter 会交给容器继续处理这个请求,而容器找不到某一个 url 时,不会再返回 wicket 框架进行处理(因为入口只有 filter,而此时 filter 序列已经走完了,只能继续 servlet 处理)。而在使用 servlet 时,容器再找不到 url 时,因为有 wicket servlet 的存在,则会继续返回到 servlet 处理,找到了相应的页面续而处理。

 类似资料: