【问题标题】:Multi DispatcherServlets in Spring MVC (Java Config)Spring MVC(Java Config)中的多 DispatcherServlet
【发布时间】:2016-08-30 14:15:58
【问题描述】:

我是 Spring Framework 技术的新手,我正在制作一个包含少量 Web 服务(Webstore、社交媒体网站等)的网站。我想要的是,每个 web 服务都拥有 DispatcherServlet 和自己的 ViewResolver。所以我的项目结构如下:

  • 主站点 - DispatcherServlet #1 仅映射到 http://example.com(是的,我知道我可以只使用静态 html 站点,但它是用于学习目的。
  • Webservice no.1 例如 Webstore - DispatcherServlet #2 仅映射到 /webstore/*
  • 2 号 Web 服务,例如社交媒体网站 - DispatcherServlet #3 仅映射到 /social/*

在配置中我使用的是 Java 类,所以我所做的是:

  • 首先,我创建了扩展 WebMvcConfigureAdapter 的 AppConfig 类和 为主要站点视图实现ViewResolver。接下来,我创建了一个扩展 AbstractAnnotationConfigDispatcherServletInitializer 类的 AppInitializer 类,并在其中配置了 RootConfigClass 和 servlet 映射
  • 其次,我遇到了问题 - 即我无法为 Dispatcher Servlet #2 创建另一个类(不能有两个扩展 AbstractAnnotationConfigDispatcherServletInitializer 的类),我发现是创建将实现接口的类WebApplicationInitializer。我做到了,终于有了第二个 DispatcherServlet
  • 第三,我从第二点开始重复步骤,并拥有三个工作 Dispatcher Servlet(理论上...)

    1. 我可以通过 DispatcherServlet #1 访问我的主站点
      (http://example.com)

    2. 我可以通过 DispatcherServlet #2 (http://example.com/webstore) 访问我的网上商店主站点

    3. 我可以通过 DispatcherServlet #3(http://example.com/social) 访问我的网络服务

但毕竟,当我创建另一个视图指向时,例如登录部分(http://example.com/webstore/login)它根本不起作用。错误表示 Dispatcher Servlet #1 无法处理映射请求,该地址应与 Dispatcher Servlet #2 绑定。我为解决这个问题所做的是将 servlet 映射的 Dispatcher Servlet #2 配置类部分从 servlet.addMapping("/webstore/"); 更改为 servlet.addMapping("/webstore/*");,我读过这不是最好的主意,但它确实有效。 当我键入控制器不处理(不存在)的地址时出现问题,例如(http://example.com/webstore/thisaddressdoesntexists),视图控制器从http://example.com/webstore 返回主默认视图,而不是 404 未找到页面。这不是我打算实施的行为。除了那个小“功能”之外,一切正常。所有特定的请求都由其特定的 DispatcherServlet 提供。最后的问题是:

  • 如何防止加载默认视图,在这种情况下,当我指向不存在的 url 并加载错误代码站点时?
  • 我的概念真的好吗?我的意思是使用实现 WebApplicationInitializer 的类来使用更多 DispatcherServlets 还是有另一种方法?我只是在谈论基于 Java 的配置类,没有 xml。

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    我的概念真的好吗?我的意思是使用实现的类 WebApplicationInitializer 用于使用更多 DispatcherServlets 或那里 是另一种方式吗?我只是在谈论基于 Java 的配置类,不 xmls。

    对于多个 servlet,您需要有一个实现 WebApplicationInitializer 的类,并为根上下文提供包含所有 bean 的 contextLoader 类,并为每个 servlet 定义一个包含所有 bean 的单独类(通常是扩展 WebAppConfigurer 的类)。您还需要为每个单独的 servlet 提供映射。看看here是怎么做的例子(最后2个回复)

    关于

     Is my concept even good at all?
    

    为什么要拥有三个独立的 servlet?这三个不同的应用程序捆绑在一起吗?如果是这种情况,我不会将它们放在同一个包中,而是制作三个 3 个不同的应用程序。您还可以使用单个 Dispatchetservlet 映射到每个 url 并为每个组件具有单独的控制器。这将降低整个项目的复杂性。所以它可能是任何一种方式。如果不知道更多关于您正在尝试做的事情,没有人可以说它是对还是错。

    如何防止加载默认视图,在这种情况下,当 我指向不存在的 url 并加载错误代码站点?

    有关错误处理页面,请查看here。您通常将 @ResponseStatus 用于特定的 HTTP 错误代码或使用 @ExceptionHandler 用于通用错误。在这两种情况下,您都需要重定向到默认错误页面。

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 2013-05-18
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      相关资源
      最近更新 更多