在Servlet 3.0中,有一种方法可以在ServletContextListener的contextInitialized()方法中以编程方式添加监听器。 Servlet和过滤器可以编程方式添加如下(如果我错了,请更正以下代码)
public void contextInitialized(ServletContextEvent sce) {
ServletContext sc = sce.getServletContext();
// Register Servlet
ServletRegistration sr = sc.addServlet("DynamicServlet",
"com.sample.DynamicServlet");
sr.setInitParameter("servletInitName", "servletInitValue");
sr.addMapping("/dynamic");
// Register Filter
FilterRegistration fr = sc.addFilter("DynamicFilter","com.sample.TestFilter");
fr.setInitParameter("filterInitName", "filterInitValue");
fr.addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST),
true, "DynamicServlet");
}
同样,我希望是否有人可以分享一个以编程方式添加监听器的示例,因为我不知道该怎么做。
还可以以编程方式添加ServletContextListener
吗?如果是,那么我应该在哪里添加它?因为所有Servlet,Listeners,Filter及其实例化都是从contextInitialized()
方法完成的。所以,如果我必须以编程方式实例化它,我应该在哪里声明它?
先谢谢
答案 0 :(得分:0)
您可以通过调用ServletContextListener
,自Servlet 3.0以编程方式添加ServletContext.addListener(Class<? extends EventListener>)
。
但是,这只能在调用任何ServletContainerInitializer.onStartup
之前运行的ServletContextListeners
进行。
ServletContext.addListener(Class<? extends EventListener>)
的Javadoc读取:
将此给定类类型的侦听器添加到此ServletContext 给定的listenerClass必须实现以下一个或多个 接口:
ServletContextAttributeListener ServletRequestListener ServletRequestAttributeListener HttpSessionAttributeListener HttpSessionIdListener HttpSessionListener
如果传递此ServletContext
ServletContainerInitializer.onStartup(...)
,然后给定的listenerClass也可以 除了列出的接口之外,还要实现ServletContextListener
上方。