gpt4 book ai didi

java - Spring MVC 中的多 DispatcherServlet (Java 配置)

转载 作者:行者123 更新时间:2023-11-30 07:11:08 25 4
gpt4 key购买 nike

我刚刚接触 Spring 框架技术,我正在制作一个包含少量 Web 服务(网上商店、社交媒体网站等)的网站。我想要的是,每个 Web 服务都拥有带有自己的 ViewResolver 的 DispatcherServlet。所以我的项目结构如下:

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

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

  • 首先,我创建了扩展 WebMvcConfigureAdapter 的 AppConfig 类和实现ViewResolver主要站点 View 。接下来我创建了一个 AppInitializer扩展类 AbstractAnnotationConfigDispatcherServletInitializer类并在其内部配置了 RootConfigClass 和 servlet 映射
  • 其次,我遇到了问题 - 即我无法为 Dispatcher Servlet #2 创建另一个类(不能有两个扩展 AbstractAnnotationConfigDispatcherServletInitializer 的类),我发现正在创建将实现接口(interface)的类WebApplicationInitializer 。我这样做了,终于有了第二个 DispatcherServlet
  • 第三,我重复了第二点的步骤,并拥有三个工作调度程序 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 绑定(bind)。我为解决此问题所做的是将 servlet 映射的 Dispatcher Servlet #2 配置类部分从 servlet.addMapping("/webstore/"); 更改为至servlet.addMapping("/webstore/*");我读过的不是最好的主意,但它有效。当我输入 Controller 无法处理(不存在)的地址(如( http://example.com/webstore/thisaddressdoesntexists )时,就会出现问题, View Controller 从 http://example.com/webstore 返回主默认 View ,而不是 404 未找到页面。这不是我想要实现的行为。除了那个小“功能”之外,一切都运行良好。所有特定请求都通过其特定的 DispatcherServlet 提供服务。最后的问题是:

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

最佳答案

Is my concept even good at all? I mean using classes which implements WebApplicationInitializer for using more DispatcherServlets or there is another way? I'm only talking about Java-Based Config Classes, no xmls.

对于多个 servlet,您需要有一个实现 WebApplicationInitializer 的类,并提供包含根上下文的所有 bean 的 contextLoader 类,并为每个 servlet 定义一个包含所有 bean 的单独类(通常是扩展 WebAppConfigurer 的类)。您还需要为每个单独的 servlet 提供映射。看看here作为示例,它是如何完成的(最后 2 个响应)

至于

 Is my concept even good at all?

为什么要拥有三个独立的 servlet?这三个不同的应用程序捆绑在一起吗?如果是这样的话,我不会将它们放在同一个包中,而是制作三个 3 个不同的应用程序。您还可以使用单个 Dispatchetservlet,它映射到每个 url,并为每个组件提供单独的 Controller 。这将降低整个项目的复杂性。所以这两种情况都可以。如果不更多地了解您正在尝试做的事情,没有人可以说它是对还是错。

How to prevent from loading default view, in this case scenario, when I'm pointing to non-existing url and load error code sites?

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

关于java - Spring MVC 中的多 DispatcherServlet (Java 配置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39229981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com