servlet生命周期中一个愚蠢的错误

2023-02-15 补充:直到现在,我仍然对这个错误记忆犹新。它时刻提醒着我:对自己使用的技术,一定要“知其然而知其所以然”。

问题

在SSI框架中需要用到一个servlet,servlet需要从spring 容器中读取几个bean。于是,我给servlet写了这么一个init方法:

public void init(){
wac = WebApplicationContextUtils
    .getRequiredWebApplicationContext(getServletContext());
req = (RequestData) wac.getBean("ReqData");
……
}

 
结果发现,这个servlet中每一次操作,都是针对同一个req数据进行的,而丝毫不管页面请求中包含了怎样的数据。

分析

很郁闷,但是这个问题出得很蠢。

init方法只在一个servlet第一次被初始化时才调用一次,并且只调用这一次,而不是在每一个请求到来时都调用一次。因此,只有第一次请求这 个servlet服务的时候,页面的req信息被spring注入了;此后每一次请求,这个servlet都没有再跟spring打任何交道,当然也不会 读到正确的数据了。

郁闷,为这事儿加了一周末的班。

解决

在sevlet的doService方法里去解析req就好了。