使用servlet 3.0添加动态servlet会引发异常

时间:2010-12-20 14:44:28

标签: java servlets glassfish

我需要在运行时创建添加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的servlet 1114600676   context / 123-LBS,因为这个servlet   上下文已经初始化

在运行时添加新的servlet是不可能的,即在初始化Servlet Context之后还是我做错了什么?

1 个答案:

答案 0 :(得分:7)

  

是否无法在运行时添加新的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) {
        // ...
    }
}

但是,对于您的特定功能要求,单个控制器servlet与命令模式相结合更适合。然后,您可以在运行时添加命令(操作),并根据请求URI对其进行拦截。另请参阅my answer on Design Patterns web based applications了解一下。