读书人

由servlet2.3升级到servlet2.4时运用了

发布时间: 2012-08-21 13:00:21 作者: rapoo

由servlet2.3升级到servlet2.4时使用了displaytag的el版本的页面没数据了

背景:

?

??? 项目需要在web.xml中配置的过滤器不仅能够拦截浏览器向服务器直接发出的request请求,同时也应该能够拦截转发请求,即通过调用request.getRequestDispatcher(forwardURI).forward(request, response)由服务器内部通过转发的方式直接产生的请求,但是这在servlet2.3规范中是做不到的。

?

解决方案:

?

??? Servlet2.4规范通过给<filter-mapping>增加子元素<dispatcher>解决了这个问题,<dispatcher>元素有四种可能的取值:REQUEST、FORWARD、INCLUDE和ERROR,分别代表不同的请求类型,其中forward即代表转发。

?

??? 所以我首先将web.xml从2.3版本升级到2.4,升级过程如下:

??? 升级前的2.3版本:

???? 升级后的2.4版本(2.4版本的部署描述符是基于XML Schema定义的):

???? 接下来为要过滤转发请求的<filter-mapping>增加<dispatcher>元素,关键代码如下:

???? 接下来就是我解决这个问题的漫漫征途,因为我在这之前并未改动过项目的其它任何文件,所以问题的根源显然在升级web.xml上,但是究竟是为什么呢?

??? 我首先对出现问题的JSP页面在升级前后tomcat将其编译的servlet源码进行了对比,结果确实发现了有价值的线索。

??? 使用Servlet2.3版本时tomcat对其编译产生的servlet文件的源码片段:?

??? 也就是在name和size属性上不再使用el表达式,displaytag标签会调用表达式管理器去进行解释,这与web容器是无关的。

读书人网 >软件架构设计

热点推荐