我需要在运行时创建添加 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/