没有任何XML的Spring配置

时间:2015-03-24 08:31:29

标签: java spring jsp spring-mvc java-ee

我想创建一个根本不使用任何XML的spring应用程序(没有web.xml,没有context.xml或任何东西)。到目前为止它似乎工作得很好,除了我的视图解析器有一些问题,我无法自己解决。

这是我的WebApplicationInitializer

public class AppConfig implements WebApplicationInitializer {

    private AnnotationConfigWebApplicationContext getContext() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("fi.cogniti.service.config");
        return context;
    }

    @Override
    public void onStartup(javax.servlet.ServletContext servletContext) throws ServletException {
        WebApplicationContext context = getContext();
        servletContext.addListener(new ContextLoaderListener(context));
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(
            context));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/*");

        // Enabling spring security
        // servletContext.addFilter("springSecurityFilterChain", new DelegatingFilterProxy("springSecurityFilterChain"))
        // .addMappingForUrlPatterns(null, false, "/*");
    }
}

和我的弹簧配置

@Configuration
@EnableWebMvc
@ComponentScan("fi.cogniti.service")
public class SpringConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
    }

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setViewClass(JstlView.class);
        resolver.setPrefix("/pages/");
        resolver.setSuffix(".jsp");

        return resolver;
    }
}

最后是我的控制器

@Controller
@RequestMapping("/")
public class HomeController {

    @RequestMapping
    public String entry() {
        return "index";
    }
}

index.jsp位于src/main/webapp/pages/index.jsp

因此,如果在我的控制器中我使用注释@ResponseBody,那么控制器会给我响应" index"因此我知道我的配置至少在某种程度上有效,但是,如果我删除注释希望它会返回index.jsp的内容,我只会得到404错误。

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

更改:

    dispatcher.addMapping("/*");

与某些内容不匹配的内容(否则会出现this错误)。例如:

dispatcher.addMapping("*.html");

通过这种方式,http://localhost:8080/.html应该显示jsp(将控制器中的@RequestMapping("/")更改为'人'更多的东西)

您还应该更改此行,包括WEB-INF

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

我不确定WebApplicationInitializer是否正在执行(请检查this,他们建议使用ServletContextInitializer,但仍然会产生问题)。

如果是这种情况,则无法使用.addMapping("*.html")。如果是这种情况,您可以将以下行添加到SpringConfig以获得相同的结果:

@Bean
public DispatcherServlet dispatcherServlet() {
    return new DispatcherServlet();
}

@Bean
public ServletRegistrationBean dispatcherServletRegistration() {
ServletRegistrationBean registration = new ServletRegistrationBean(
        dispatcherServlet(), "*.html");

registration
        .setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);

    return registration;
}

答案 1 :(得分:0)

目前所有人都可以访问所有jsp文件,建议将它们放在WEB-INF中而不是顶层。

然后将视图解析器的配置修改为以下内容。

@Bean
public ViewResolver getViewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/pages/");
    resolver.setSuffix(".jsp");
    return resolver;
}

您无需设置viewClass属性,因为这是您确定的属性。

接下来添加以下内容,让DispatcherServlet传递无法自行处理的请求。由于您将servlet映射到/

,因此需要这样做
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

通过这两项更改,您可以确保所有人都可以访问您的jsps,并再次处理默认资源。

我强烈建议使用Spring Boot,这样可以简化您的生活。

答案 2 :(得分:-1)

在您的控制器中,该方法应如下所示:

@RequestMapping(method = RequestMethod.GET)
public ModelAndView entry() {
    return new ModelAndView("index");
}