java - 使用 servlet 3.0 添加动态 servlet 会抛出异常

标签 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: Unable to configure mapping for servlet 1114600676 of servlet context /123-LBS, because this servlet context has already been initialized

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

最佳答案

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

没错。您需要在 ServletContextListener#contextInitialized() 中完成.

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

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

但是,对于您的特定功能需求,结合命令模式的单个 Controller servlet 更适合。然后,您可以在运行时添加命令(操作)并根据请求 URI 对其进行拦截。另见 my answer on Design Patterns web based applications开始。

关于java - 使用 servlet 3.0 添加动态 servlet 会抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4490648/

相关文章:

java - 我可以创建一个表现得像原始类型的类吗?

java - 如何让 Hibernate/Spring/JPA 自动更新新实体的 ID

java - 使用 WebPBEConfigServlet 的 jasypt Web 配置 - 密码存储在哪里?

java - 表单提交和 HttpServletRequest

java - 爆炸的 Artifact 无法用 glassfish 上传

java - Android 动态行创建中的 IllegalStateException

小型/中型/大型桌面应用程序的 JavaFX 最佳实践指南?

java - 使用 jquery 中 servlet 中的 json 获取不同变量上的两个数组

java - 记录 Web 应用程序中第三方代码创建的线程中未捕获的异常

java - 如何避免线程中断异常