使用FreeMarker的Spring:无法解析名为“MyServlet”的servlet中名为“Home”的视图

我正在尝试创建一个非常简单的FreeMarker和Spring集成。 但是,当我运行我的示例时,我得到一个例外:

GRAVE: Servlet.service() for servlet MyServlet threw exception javax.servlet.ServletException: Could not resolve view with name 'Home' in servlet with name 'MyServlet' at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1162) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:662) 

我不知道配置有什么问题:

web.xml中

    contextClass org.springframework.web.context.support.AnnotationConfigWebApplicationContext   contextConfigLocation com.jverstry.Configuration   org.springframework.web.context.ContextLoaderListener   MyServlet org.springframework.web.servlet.DispatcherServlet  contextConfigLocation   1   MyServlet /      

Web配置

 @EnableWebMvc @Configuration @ComponentScan(basePackages = "com.jverstry") public class WebConfig extends WebMvcConfigurerAdapter { @Bean public ViewResolver getViewResolver() { FreeMarkerViewResolver resolver = new FreeMarkerViewResolver(); resolver.setCache(true); resolver.setPrefix("WEB-INF/pages/"); resolver.setSuffix(".ftl"); return resolver; } @Bean public FreeMarkerConfigurer getFreemarkerConfig() { FreeMarkerConfigurer result = new FreeMarkerConfigurer(); result.setTemplateLoaderPath("WEB-INF/pages/"); return result; } } 

调节器

 @Controller public class MyController { @RequestMapping(value = "/") public String home(@ModelAttribute("model") ModelMap model) { model.addAttribute("MsTime", System.currentTimeMillis()); return "Home"; } } 

PS :当然, WEB-INF/pages/有一个Home.ftl文件。

经过大量搜索后,未设置前缀解决了问题:

 @Bean public ViewResolver getViewResolver() { FreeMarkerViewResolver resolver = new FreeMarkerViewResolver(); resolver.setCache(false); // resolver.setPrefix(""); resolver.setSuffix(".ftl"); return resolver; } 

freemaker的配置(在spring参考文档中找到) http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/#view-velocity

            

和java配置版本将是:

 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver; @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Bean public ViewResolver viewResolver() { FreeMarkerViewResolver resolver = new FreeMarkerViewResolver(); resolver.setCache(true); resolver.setPrefix(""); resolver.setSuffix(".ftl"); return resolver; } @Bean public FreeMarkerConfigurer freemarkerConfig() { FreeMarkerConfigurer result = new FreeMarkerConfigurer(); result.setTemplateLoaderPath("/WEB-INF/pages/"); return result; } }