使用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; } }