2016-12-15 100 views
0

现在,我不想在我的web.xml中添加一个带有注册的Servlet,但使用注释,并在我的项目中使用它而不重新启动。我可以在不重新启动我的项目的情况下添加servlet

+0

请说明你的问题 –

+0

我认为这是一个很好的问题,很清楚。 Op想要将一个新的servlet添加到正在运行的Web应用程序中。 –

+0

不清楚的是“重启”的含义。没有重新启动服务器,或没有重新启动(/重新部署)的Web应用程序? – Gimby

回答

0

您可以使用注释@WebServlet有你的servlet class.Something如下

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

了解更多详情请查看到This

0

的Tomcat允许重装类:https://www.mulesoft.com/tcat/tomcat-reload 你可以用它来检测到更改时重新加载应用程序。重新加载意味着应用程序继续运行,但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检测到一个新的页面并自动加载它,这应该允许热部署一个页面。

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

相关问题