Spring MVC中的Multi DispatcherServlets(Java Config)

时间:2016-08-30 14:15:58

标签: java spring spring-mvc

我刚刚进入Spring Framework技术,并且我创建了一个包含很少WebServices(Webstore,社交媒体网站等)的网站。我想要的是,每个web服务都拥有它拥有自己的ViewResolver的DispatcherServlet。所以我的项目结构如下:

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

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

  • 首先,我创建了扩展WebMvcConfigureAdapterViewResolver的AppConfig类 为主站点视图实现AppInitializer。接下来我创建了一个AbstractAnnotationConfigDispatcherServletInitializer类,它扩展了AbstractAnnotationConfigDispatcherServletInitializer类,并且在其中我已经配置了RootConfigClass和servlet映射
  • 其次我遇到了问题 - 即我无法为Dispatcher Servlet#2创建另一个类(不能有两个扩展WebApplicationInitializer的类),我是什么?我发现正在创建一个实现接口servlet.addMapping("/webstore/");的类。我做了什么,最后工作了Second DispatcherServlet
  • 第三,我从第二点开始重新执行步骤,并有三个工作调度程序Servlet(理论上

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

    2. 我可以通过DispatcherServlet#2(http://example.com/webstore

    3. 访问我的网站主站点
    4. 我可以通过DispatcherServlet#3(http://example.com/social

    5. 访问我的网络服务

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

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

1 个答案:

答案 0 :(得分:1)

  

我的概念是否都很好?我的意思是使用实现的类   WebApplicationInitializer用于使用更多DispatcherServlet或那里   另一种方式?我只谈论基于Java的配置类,没有   个XML。

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

关于

 Is my concept even good at all?

为什么你想拥有三个独立的servlet?这三个不同的应用程序是否捆绑在一起?如果是这种情况,我不会将它们放在同一个包中,而是制作三个3个不同的应用程序。您还可以使用单个Dispatchetservlet,它映射到每个URL并为每个组件分别设置控制器。这将降低整个项目的复杂性。所以它可能是两种方式。如果不了解你想要做的事情,没有人可以说这是对还是错。

  

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

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