JSP 和 Freemarker 都用于显示层,但是都有自己的优缺点。
严格的 MVC 分离,可维护性好<!-- For Freemarker -->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.20</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
</dependency>
spring-mvc.xml 里添加 Freemarker 的配置Order 值越小,查找 View 的优先级越高,如果找不到对应的 View,接着尝试下一个 order 值更高的视图解析器查找 View。
<!-- Freemarker 视图解析器 -->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
   <property name="prefix" value=""/>
   <property name="order" value="0"/>
   <property name="cache" value="true"/>
   <property name="contentType" value="text/html; charset=UTF-8"/>
</bean>
<!-- Freemarker configuration -->
<!-- Freemarker 文件放在目录 WEB-INF/view/ftl 下 -->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
   <property name="templateLoaderPath" value="/WEB-INF/view/ftl/"/>
   <property name="freemarkerSettings">
       <props>
           <prop key="defaultEncoding">UTF-8</prop>
       </props>
   </property>
</bean>
Username: ${username}<br>
Password: ${password}
项目目录结构如图

HelloWorldController 里添加一个方法使用 Freemarker 解析器    @RequestMapping("/helloworld-freemarker")
    public String helloFreemarker(ModelMap model) {
        // 放到 model 里的数据会在 Freemarker 模版文件里使用
        model.put("username", "Josh");
        model.put("password", "Passw0rd");
        // 当浏览器里访问 http://localhost:8080/helloworld-freemarker 时,
        // 访问的是 /WEB-INF/view/ftl/helloworld-freemarker.htm
        return "helloworld-freemarker.htm";
    }

放到 model 里的数据显示出来了。