【问题标题】:Spring with FreeMarker: Could not resolve view with name 'Home' in servlet with name 'MyServlet'带有 FreeMarker 的 Spring:无法解析名称为“MyServlet”的 servlet 中名称为“Home”的视图
【发布时间】:2012-10-26 11:02:07
【问题描述】:

我正在尝试创建一个非常简单的 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

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <context-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </context-param>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.jverstry.Configuration</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file></welcome-file>
    </welcome-file-list>

</web-app>

网页配置

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

    }

}

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

【问题讨论】:

    标签: java spring model-view-controller freemarker


    【解决方案1】:

    搜索了很多,没有设置前缀解决了这个问题:

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

    【讨论】:

      【解决方案2】:

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

          <!-- freemarker config -->
      <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
      </bean>
      
      <!-- 
      
        View resolvers can also be configured with ResourceBundles or XML files. If you need
        different view resolving based on Locale, you have to use the resource bundle resolver.
      
      -->
      <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="cache" value="true"/>
        <property name="prefix" value=""/>
        <property name="suffix" value=".ftl"/>
      </bean>
      

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

      【讨论】:

      • 这不是我在 WebConfig 中所做的吗?
      • @JVerstry 对你的 web.xml 一切都好
      猜你喜欢
      • 2018-06-02
      • 2015-08-10
      • 1970-01-01
      • 2015-01-18
      • 2018-12-20
      • 1970-01-01
      • 2016-12-27
      • 2015-07-11
      • 1970-01-01
      相关资源
      最近更新 更多