1. 程式人生 > >無法正確解析FreeMarker視圖

無法正確解析FreeMarker視圖

來看 base resolve tty 但是 public rri frame 說明

在使用SpringMVC處理FreeMarker的時候,出現了無法解析視圖名的問題,報的異常說明的也非常清楚就是不能解析視圖

技術分享圖片

這個free就是一個FreeMarker的模板名,它的完整路徑是/WEB-INF/freemarker/free.ftl

既然是不能正確解析視圖,那麽一定是因為SpringMVC的視圖解析器沒有配置正確,先來看看配置的視圖解析器:

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
         UrlBasedViewResolverRegistration freeMarker 
= registry.freeMarker(); freeMarker.prefix("/WEB-INF/freemarker/"); freeMarker.suffix(".ftl"); }

因為我的SpringMVC配置是通過繼承WebMvcConfigurerAdapter實現的Java配置,所以就重寫了其的configureViewResolvers方法,這個方法名通俗易懂,是配置視圖解析器的簡寫方法。其實有使用SpringMVC處理過FreeMarker的同學應該就看到錯誤了,我自以為是的去配置前後綴(後綴還好,特別是前綴)。

想要配置FreeMarker其實還需要配置FreeMarkerConfigurer:

    @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer() {
        FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
        freeMarkerConfigurer.setTemplateLoaderPath("/WEB-INF/freemarker/");
        return freeMarkerConfigurer;
    }

對應的XML中的配置就是:

 <bean 
id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath"><value>/WEB-INF/freemarker/</value></property> </bean>

這是因為我們在這裏配置了templateLoaderPath,所以就不需要再配置前綴了,而且這個templateLoaderPath屬於必須的配置屬性。

那麽,就再修改一下ViewResolver:

@Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
         registry.freeMarker();
    }

其實看ViewResolverRegistry的方法調用也可以看出端倪,在調用jsp方法的時候有一個可以指定前後綴的重載方法,但是freeMarker方法只有這個空參數的方法。點進去freeMarker()會發現它的註釋寫的很清楚:會有一個默認的視圖名前綴(就是templateLoaderPath)和一個以".ftl"結尾的後綴。本身這個方法就是個簡寫ViewResolver的方法,就不要做多余的事了。

其實還有一種配置視圖解析器的方式:

    @Bean
    public ViewResolver viewResolver() {
        FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver("",".ftl");
        viewResolver.setContentType("text/html;charset=UTF-8");
        viewResolver.setCache(true);
        return viewResolver;
    }

這種方式與configViewResolver本質是等價的,但是其可以自己手動配置很多其他的視圖解析器屬性(其實我看中的是可以配置ContentType,可以解決FreeMarker中文亂碼的問題)。

無法正確解析FreeMarker視圖