我刚刚接触Spring Framework技术,并且正在制作一个网站,其中几乎不包含WebServices(Webstore,社交媒体网站等)。我想要的是,每个Web服务都将拥有自己的DispatcherServlet和自己的ViewResolver。所以我的项目结构如下:
主站点-仅将DispatcherServlet#1映射到http://example.com(是的,我知道我可以只使用静态html站点,但这是出于学习目的。
Web服务1例如Webstore-DispatcherServlet#2仅映射到
/网上商店/*
网络服务2,例如社交媒体网站-DispatcherServlet#3仅映射到/ social / *
在配置中,我使用的是Java类,所以我做了以下事情:
首先,我创建了扩展WebMvcConfigureAdapter
的AppConfig类,并
实现主站点视图的ViewResolver
。接下来,我创建了一个AppInitializer
类,该类扩展了AbstractAnnotationConfigDispatcherServletInitializer
类,并且在其中配置了RootConfigClass和servlet映射。
其次,我遇到了问题-即我无法为Dispatcher Servlet#2创建另一个类(不能有两个扩展AbstractAnnotationConfigDispatcherServletInitializer
的类),我发现正在创建将实现接口WebApplicationInitializer
的类。 。我做了,终于有了第二个DispatcherServlet
第三,从第二点开始,我重新整理了步骤,并使用了三个有效的Dispatcher Servlet(理论上是...)。
我可以通过DispatcherServlet#1访问我的主站点
(http://example.com)
我可以通过DispatcherServlet#2(http://example.com/webstore)访问我的网店主站点
而且我可以通过DispatcherServlet#3(http://example.com/social)访问我的Web服务
但是毕竟,当我创建另一个指向例如登录部分(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未找到页面返回主默认视图。这不是我打算实现的行为。除了一点点“功能”,一切都正常。所有specyfic请求均通过其specyfic DispatcherServlet进行处理。最后的问题是:
在这种情况下,当我指向不存在的url和加载错误代码站点时,如何防止加载默认视图?
我的概念还好吗?我的意思是使用实现WebApplicationInitializer的类来使用更多DispatcherServlets还是有另一种方法?我只在谈论基于Java的配置类,没有xml。
最佳答案
我的概念还好吗?我的意思是使用实现
WebApplicationInitializer用于使用更多DispatcherServlets或那里
是另一种方式?我只说基于Java的配置类,不
xmls。
对于多个servlet,您需要一个实现WebApplicationInitializer的类,并为contextLoader类提供用于根上下文的所有bean,并为每个servlet定义一个具有所有bean的单独类(通常是扩展WebAppConfigurer的类)。您还需要为每个单独的servlet提供一个映射。以here为例,看看它是如何完成的(最后两个响应)
至于
Is my concept even good at all?
您为什么要拥有三个单独的servlet?这三个不同的应用程序捆绑在一起了吗?如果是这种情况,我不会将它们放在同一个程序包中,而是制作三个3个不同的应用程序。您还可以使用单个Dispatchetservlet,它映射到每个URL,并对每个组件具有单独的控制器。这将降低整个项目的复杂性。因此,可能是任何一种方式。在不了解您要做什么的情况下,没人会说对与错。
在这种情况下,如何防止加载默认视图
我要指向不存在的URL和加载错误代码站点?
对于错误处理页面,请查看here。对于特定的HTTP错误代码,通常使用@ResponseStatus;对于一般性错误,通常使用@ExceptionHandler。在这两种情况下,您都需要重定向到默认错误页面。