Spring JavaConfig如何将dispatcher-servlet映射到除

时间:2016-10-11 17:59:39

标签: java spring-mvc

我的最终目标是能够同时运行多个servlet(即:一个用于MVC,一个用于WebServices)。不幸的是,当servlet映射不是root(" /")时,我无法让servlet路由到控制器。

我原以为以下网址会触发我的控制器,但它没有。

http://localhost:8080/Sandbox/Page/Test

如果我删除了' / Page'来自servlet-mapping和' / Page'从URL -it工作正常。

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";
    }
}

WebApplicationConfiguration

@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/");
    }
}

的TestController

@Controller
@RequestMapping("/Test")
public class TestController {

    @RequestMapping({"", "load"})
    public ModelAndView load(final ModelAndView modelAndView) {

        modelAndView.setViewName("/test/test"); // improve this

        return modelAndView;
    }
}

2 个答案:

答案 0 :(得分:0)

我认为你的问题就在这些行中

resolver.setPrefix("/WEB-INF/page");

因为你使用

return new String[] { "/Page/" };

并且第一个字母是不同的。

答案 1 :(得分:0)

这有点不直观,但是点击http://localhost:8080/Sandbox/Page/Test时会发生什么:

  1. 由于/Page/映射到DispatcherServlet,因此处理请求的任务正确地提供给您想要的servlet。
  2. 进入DispatcherServlet后,原始请求将用于查找处理程序。在执行此操作时,/Page/Test会与Controller进行比较,/Test会映射到404。两者不匹配,因此服务器以/Page/Test
  3. 响应

    更新您的控制器以映射到settings,您的代码应按预期工作。