使用servlet 3.0添加动态servlet会引发exception

我需要在运行时创建添加servlet。 当我运行以下代码时。

protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { out.println(""); out.println(""); out.println(" URI out"); out.println(""); out.println(""); Integer generatedKey = Math.abs(randomiser.nextInt()); out.print(generatedKey); createServlet(Integer.toString(generatedKey),request.getServletContext()); } finally { out.println(""); out.println(""); out.close(); } } private void createServlet(String generatedKey, ServletContext servletContext) { String servletMapping = "/"+generatedKey; ServletRegistration sr = servletContext.addServlet(generatedKey, "com.path.lbs.servlets.testDynamic"); sr.setInitParameter("keyname", generatedKey); sr.addMapping(servletMapping); } 

我收到以下错误。

java.lang.IllegalStateException:PWC1422:无法为servlet上下文/ 123-LBS的servlet 1114600676配置映射,因为此servlet上下文已经初始化

是否无法在运行时添加新的servlet,即在Servlet Context初始化之后或者我做错了什么?

是否无法在运行时添加新的servlet,即在初始化Servlet Context之后?

那是对的。 您需要在ServletContextListener#contextInitialized()

 @WebListener public class Config implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent event) { // Do it here. } @Override public void contextDestroyed(ServletContextEvent event) { // ... } } 

但是,对于您的特定function要求,单个控制器servlet与命令模式相结合更适合。 然后,您可以在运行时添加命令(操作),并根据请求URI对其进行拦截。 另请参阅我对设计模式基于Web的应用程序的回答 。