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就好了。