Добавление динамического сервлета с использованием сервлета 3.0 вызывает исключение - PullRequest
5 голосов
/ 20 декабря 2010

Мне нужно создать add сервлеты во время выполнения.Когда я запускаю следующий код.

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: Невозможно настроить отображение для сервлета 1114600676 контекста сервлета /123-LBS, потому что этот контекст сервлета уже инициализирован

Невозможно добавить новые сервлеты во время выполнения, т.е. после инициализации контекста сервлета, или я что-то не так делаю?

1 Ответ

7 голосов
/ 20 декабря 2010

Невозможно добавить новые сервлеты во время выполнения, т.е. после инициализации контекста сервлета?

Это правильно.Вы должны сделать это в ServletContextListener#contextInitialized().

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

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

Однако для ваших конкретных функциональных требований лучше подходит один сервлет контроллера в сочетании с шаблоном команды.Затем вы можете добавить команды (действия) во время выполнения и перехватить их на основе URI запроса.См. Также мой ответ о веб-приложениях Design Patterns для ознакомления.

...