[英]Spring JavaConfig how to map dispatcher-servlet to something other than root
我的最终目标是能够同时运行多个servlet(即:一个用于MVC,一个用于WebServices)。 不幸的是,当servlet映射不是root(“ /”)时,我无法将servlet路由到控制器。
我本以为以下URL会触发我的控制器,但不会。
http://localhost:8080/Sandbox/Page/Test
如果我从servlet映射中删除了“ / Page”,而从URL中删除了“ / Page”,则可以正常工作。
http://localhost:8080/Sandbox/Test
网络初始化器
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { WebApplicationConfiguration.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/Page/" };
}
@Override
protected String getServletName() {
return "dispatcher";
}
}
Web应用程序配置
@EnableWebMvc
@EnableAspectJAutoProxy(proxyTargetClass = true)
@Configuration
@ComponentScan(basePackages = {"com.myapp.sandbox.business",
"com.myapp.sandbox.page",
"com.myapp.sandbox.utility"})
public class WebApplicationConfiguration extends WebMvcConfigurerAdapter {
/**
* Defines a {@link ViewResolver} as a Spring managed bean.
*
* @return the viewResolver
*/
@Bean
public ViewResolver viewResolver() {
final InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/page");
resolver.setSuffix(".jsp");
return resolver;
}
/**
* Registers resource handlers with Spring.
*
* @param registry the {@link ResourceHandlerRegistry}
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/view/**").addResourceLocations("/view/");
}
}
测试控制器
@Controller
@RequestMapping("/Test")
public class TestController {
@RequestMapping({"", "load"})
public ModelAndView load(final ModelAndView modelAndView) {
modelAndView.setViewName("/test/test"); // improve this
return modelAndView;
}
}
我认为您的问题出在这些方面
resolver.setPrefix("/WEB-INF/page");
因为你用
return new String[] { "/Page/" };
和第一个字母是不同的。
这有点不直观,但是当您点击http://localhost:8080/Sandbox/Page/Test
时,这就是发生的情况:
/Page/
已映射到DispatcherServlet
,因此将处理请求的任务正确地分配给了所需的servlet。 DispatcherServlet
,原始请求将用于查找处理程序。 在执行此操作时, /Page/Test
与被映射到/Test
Controller
进行了比较。 两者不匹配,因此服务器响应为404
更新您的控制器以映射到/Page/Test
,您的代码应该可以按预期工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.