繁体   English   中英

Spring JavaConfig如何将dispatcher-servlet映射到root以外的其他对象

[英]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时,这就是发生的情况:

  1. 由于/Page/已映射到DispatcherServlet ,因此将处理请求的任务正确地分配给了所需的servlet。
  2. 进入DispatcherServlet ,原始请求将用于查找处理程序。 在执行此操作时, /Page/Test与被映射到/Test Controller进行了比较。 两者不匹配,因此服务器响应为404

更新您的控制器以映射到/Page/Test ,您的代码应该可以按预期工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM