【问题标题】:Adding multiple servlets in single web.xml在单个 web.xml 中添加多个 servlet
【发布时间】:2023-03-06 14:39:02
【问题描述】:

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

web.xml:

<servlet>
    <servlet-name>spring-ws</servlet-name>
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
    <init-param>
        <param-name>transformWsdlLocations</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>spring-ws</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

<session-config>
    <session-timeout>240</session-timeout>
</session-config>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-ws-servlet.xml
     /WEB-INF/health-page-servlet.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>health-page</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>health-page</servlet-name>
    <url-pattern>/health.htm</url-pattern>
</servlet-mapping>

如果你能找出我做错了什么,请告诉我。

我尝试了以下链接,但它对我不起作用 Can I use Spring MVC and Spring WS in one single application?

【问题讨论】:

  • “spring-ws”servlet 缺少 servlet 声明

标签: java spring servlets


【解决方案1】:

我在我的项目中使用 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);
    }
}

【讨论】:

    【解决方案2】:

    这行不通。映射到/* 的请求超过了所有 请求。您需要将其映射到 / 上,以便它只会拦截与所有其他现有 servlet 不匹配的请求(包括隐式映射到 *.jsp 的 JSP servlet 和所有“正常”静态资源,如 CSS/ JS/图像文件!)。另见Difference between / and /* in servlet mapping url pattern。

    如果还需要能够提供静态资源,那么最好将其映射到更具体的 URL 模式,例如 /ws/*,并创建一个 Filter,它会检查请求 URI,然后进行相应的转发。该过滤器又可以安全地映射到/*。另请参阅此答案以获取更具体的代码示例:How to access static resources when mapping a global front controller servlet on /*。

    【讨论】:

    • 我认为映射将被使用从最具体到最不具体?
    • @Dave:如果有/*,则不会。这种映射只能用于过滤器。
    • 所以这被认为与目录匹配不同,例如 /foo/*?
    • @Dave:是的。 /*(和一个空字符串)匹配 all 请求。自己尝试并检查 servlet 规范。
    • 我尝试使用 spring-ws/ 这个春天-ws servlet 停止工作,/ws/* 中的 ws 文件夹应该包含什么?只有 spring-ws-servlet.xml 或其他文件。同样为 servlet spring-ws 做 URL 匹配 / ,另一个 servlet(health-page) 开始工作正常。
    【解决方案3】:

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

    【讨论】:

    • 规格顺序无关。
    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2017-09-19
    • 2013-12-30
    • 2010-12-24
    相关资源
    最近更新 更多