無法正確解析FreeMarker視圖
在使用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中的配置就是:
<beanid="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視圖