6

I need to create add servlets at runtime. When I run the following code.

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);

    }

I get the following error.

java.lang.IllegalStateException: PWC1422: Unable to configure mapping for servlet 1114600676 of servlet context /123-LBS, because this servlet context has already been initialized

Is it impossible to add new servlets at runtime i.e. after the Servlet Context is initialised or am I doing something wrong?

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
Wayne
  • 149
  • 3
  • 14

1 Answers1

8

Is it impossible to add new servlets at runtime i.e. after the Servlet Context is initialised?

That's correct. You need to do it in ServletContextListener#contextInitialized().

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

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

However, for your particular functional requirement, a single controller servlet in combination with command pattern is much better suited. You could then add commands (actions) during runtime and intercept on it based on the request URI. See also my answer on Design Patterns web based applications for a kickoff.

Community
  • 1
  • 1
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
  • 1
    Thanks, that was plan B. I really don't see the use of only being able to create servlets at init. – Wayne Dec 21 '10 at 09:32