我可以在不重启项目的情况下添加servlet

时间:2016-12-15 09:17:11

标签: java spring servlets

现在我不想在我的web.xml中添加带有寄存器的Servlet但使用注释,并在我的项目中使用它而不重启。

2 个答案:

答案 0 :(得分:0)

您可以将注释@WebServlet与您的servlet类一起使用。如下所示

    @WebServlet(urlPatterns = "/HelloWorldServlet", loadOnStartup = 1)     
     public class HelloWorldServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
         //your stuff
    }
     }

有关详细信息,请查看This

答案 1 :(得分:0)

Tomcat允许重新加载类:https://www.mulesoft.com/tcat/tomcat-reload 您可以使用此选项在检测到更改时重新加载应用程序。重新加载意味着应用程序继续运行,但重新加载servlet上下文和所有servlet,包括任何新的servlet。我认为这将是最简单的解决方案,但可能不是您想要的,因为所有其他servlet也会重新加载。

作为替代方案,您可以使用' front controller'做一些事情(有点难看)。 servlet将请求转发给POJO控制器:

@WebServlet(value="/myapp")
public class FrontControllerServlet extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
    String pageClass = request.getParameter("pageClass");
    String pageClassFullyQualified = "com.myapp." + pageClass;
    Class<?> pageClass = Class.forName(pageClassFullyQualified);
    Constructor<?> constructor = pageClass.getConstructor();
    Object object = constructor.newInstance();
    Page page = (Page) object;
    page.handle(request, response);
}

页面界面:

public interface Page { 
    public void handle(HttpServletRequest request, HttpServletResponse response);
}

示例页面类:

package com.myapp;

public class MyPage implements Page {
    public void handle(HttpServletRequest request, HttpServletResponse response) {
        // handle the request
    }
}

使用页面类名称(没有包)调用应用程序:

http://localhost:8080/myapp?page=MyPage 

前端控制器应该实例化类并将请求/响应传递给它。如果Tomcat检测到新的页面并自动加载它,则应该允许热部署单个页面。

当然,这只是一个概念证明。将类名称作为请求参数是非常糟糕的做法,因为您正在向客户端公开内部。