1

我的一个项目使用 Spring MVC 来处理 URL 映射和调度逻辑。我现在必须使用第三方库,它使用自己的HttpServlet作为其功能的主要入口点,但由于它是另一个库的可选插入式替代品,我不能只将<servlet>声明放在 web.xml 中:I' d 宁愿使用 aController和 Spring 配置文件在此类实现之间切换,而无需编辑 web.xml。

Spring 是否提供 OOTB 来处理此类情况?我似乎没有马上找到它。

提前致谢!

4

2 回答 2

2

由于在您的中注册第三方 servletweb.xml是不可能的,我认为您最好的选择是在您的 中创建 servlet 的单例实例ApplicationContext,然后创建一个委托给所述 servletservice方法的自定义视图。

您可以在本教程中看到自定义视图的示例。

于 2012-12-05T22:56:29.820 回答
1

在这里回答我自己的问题,以防我的方法对其他人有用。

我需要考虑两个关键因素:

  • servlet 的正确初始化
  • 让 servlet 完全控制 HTTP 层(例如设置 HTTP 标头等)

在我的具体情况下,不需要正确处理 servlet 破坏,因为它是无操作的。

我最终编写了一个专用的Controller, 仅在激活特定的 Spring 配置文件时才被实例化,该配置文件负责实例化和初始化 Servlet。然后,所有的请求都会直接在一个voidhandler 方法中处理,如下:

public class ServletDelegatingController implements ServletConfig {
    private final DelegateServlet delegate = new DelegateServlet();

    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { 
        delegate.service(request, response);
    }



    // properly initializes the servlet
    public void setServletConfig(ServletConfig servletConfig) {
        try {
            delegate.init(servletConfig);
        } catch (ServletException e) {
            throw new IllegalStateException("Failure while initializing the servlet", e);
        }
    }
}

对于看起来如下delegating-servlet.xmlDispatcherServlet

<beans profile="custom">
    <bean id="cmisServiceFactory"
          class="com.foo.ServletDelegatingController"/>
</beans>
于 2012-12-06T16:14:01.970 回答