使用Servlet 3.0添加动态Servlet会抛出异常

6

我需要在运行时创建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("<html>");
            out.println("<head>");
            out.println("<title> URI out</title>");
            out.println("</head>");
            out.println("<body>");
            Integer generatedKey = Math.abs(randomiser.nextInt());
            out.print(generatedKey);

            createServlet(Integer.toString(generatedKey),request.getServletContext());

        } finally {
            out.println("</body>");
            out.println("</html>");
            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 1114600676的servlet上下文/123-LBS配置映射,因为此servlet上下文已经被初始化

在 Servlet 上下文初始化后是否不可能在运行时添加新的 Servlet,或者我做错了什么?
1个回答

8

在 Servlet 上下文初始化之后,是否不可能在运行时添加新的 Servlet?

是的。您需要在 ServletContextListener#contextInitialized() 中完成操作。

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

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // ...
    }
}

然而,针对您特定的功能要求,一个单一的控制器Servlet与命令模式相结合更加适合。您可以在运行时添加命令(操作),并根据请求URI进行拦截。参见我在设计模式Web应用程序中的回答作为启动。


1
谢谢,那是备选计划。我真的看不出只能在init时创建servlet的用处。 - Wayne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接