在单个web.xml中添加多个servlet

我试图在一个web.xml中运行两个Servlet类但它不工作,每个servlet类独立工作正常。

web.xml

  spring-ws org.springframework.ws.transport.http.MessageDispatcherServlet  transformWsdlLocations true  2   spring-ws /*   240   contextConfigLocation /WEB-INF/spring-ws-servlet.xml /WEB-INF/health-page-servlet.xml   org.springframework.web.context.ContextLoaderListener   health-page org.springframework.web.servlet.DispatcherServlet 1   health-page /health.htm  

如果你能解决我正在做的事情,请告诉我。

我尝试了下面的链接,但它对我不起作用我可以在一个应用程序中使用Spring MVC和Spring WS吗?

这不会起作用。 映射在/*上的那个超过了所有请求。 您需要在/上映射它,以便它只拦截与所有其他现有servlet不匹配的请求(包括隐式映射到*.jsp的JSP servlet和所有“普通”静态资源,如CSS / JS /图像文件!)。 另请参阅servlet映射url模式中的/和/ *之间的差异 。

如果还需要能够提供静态资源,那么最好将其映射到更具体的URL模式,如/ws/*并创建一个Filter来检查请求URI,然后相应地转发。 该filter可以安全地映射到/* 。 有关更具体的代码示例,请参阅此答案: 如何在/ *上映射全局前端控制器servlet时访问静态资源 。

我在我的项目中使用Java配置,以下代码可以正常工作:

 public class Initializer implements WebApplicationInitializer { public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(ApplicationConfiguration.class); ctx.setServletContext(servletContext); MessageDispatcherServlet messageDispatcherServlet = new MessageDispatcherServlet(); messageDispatcherServlet.setApplicationContext(ctx); messageDispatcherServlet.setTransformWsdlLocations(true); Dynamic dynamic = servletContext.addServlet("messageDispatcherServlet", messageDispatcherServlet); dynamic.addMapping("/ws/*"); dynamic.setLoadOnStartup(1); dynamic = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); dynamic.addMapping("/"); dynamic.setLoadOnStartup(1); } } 

你有获得请求的spring-ws部分的/ *映射。 你需要提出一个不同的策略…尝试将/health.htm放在/ *映射之前。