现在我不想在我的web.xml中添加带有寄存器的Servlet但使用注释,并在我的项目中使用它而不重启。
答案 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检测到新的页面并自动加载它,则应该允许热部署单个页面。
当然,这只是一个概念证明。将类名称作为请求参数是非常糟糕的做法,因为您正在向客户端公开内部。