Spring Boot 和 FreeMarker
Posted
技术标签:
【中文标题】Spring Boot 和 FreeMarker【英文标题】:Spring Boot and FreeMarker 【发布时间】:2015-09-24 16:26:00 【问题描述】:我正在尝试通过一个简单的 集成示例(基于我在网上找到的教程)。出于某种原因,我的观点没有被解析为 FreeMarker 模板(我认为这是问题所在)。
在浏览器中启动时的结果只是返回 TFL 视图文件的名称,即“索引”。所以控制器被调用并返回字符串“index”,但似乎没有触发器来拉入 FTL 文件本身。任何帮助将不胜感激...
我有以下配置类,我在其中定义了视图解析器和 Free Maker 配置。
@Configuration
public class MvcConfigurer extends WebMvcConfigurerAdapter
@Bean
public ViewResolver viewResolver()
FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
resolver.setCache(true);
resolver.setPrefix("");
resolver.setSuffix(".ftl");
resolver.setContentType("text/html; charset=UTF-8");
return resolver;
@Bean
public FreeMarkerConfigurer freemarkerConfig() throws IOException, TemplateException
FreeMarkerConfigurationFactory factory = new FreeMarkerConfigurationFactory();
factory.setTemplateLoaderPaths("classpath:templates", "src/main/resource/templates");
factory.setDefaultEncoding("UTF-8");
FreeMarkerConfigurer result = new FreeMarkerConfigurer();
result.setConfiguration(factory.createConfiguration());
return result;
然后我有以下控制器:
@RestController
public class HelloController
/**
* Static list of users to simulate Database
*/
private static List<User> userList = new ArrayList<User>();
//Initialize the list with some data for index screen
static
userList.add(new User("Bill", "Gates"));
userList.add(new User("Steve", "Jobs"));
userList.add(new User("Larry", "Page"));
userList.add(new User("Sergey", "Brin"));
userList.add(new User("Larry", "Ellison"));
/**
* Saves the static list of users in model and renders it
* via freemarker template.
*
* @param model
* @return The index view (FTL)
*/
@RequestMapping(value = "/index", method = RequestMethod.GET)
public String index(@ModelAttribute("model") ModelMap model)
model.addAttribute("userList", userList);
return "index";
/**
* Add a new user into static user lists and display the
* same into FTL via redirect
*
* @param user
* @return Redirect to /index page to display user list
*/
@RequestMapping(value = "/add", method = RequestMethod.POST)
public String add(@ModelAttribute("user") User user)
if (null != user && null != user.getFirstname()
&& null != user.getLastname() && !user.getFirstname().isEmpty()
&& !user.getLastname().isEmpty())
synchronized (userList)
userList.add(user);
return "redirect:index.html";
最后我将以下 FTL 文件存储在“src/main/resource/templates”中
<html>
<head><title>ViralPatel.net - FreeMarker Spring MVC Hello World</title>
<body>
<div id="header">
<H2>
<a href="http://viralpatel.net"><img border="0px" src="http://viralpatel.net/blogs/wp-content/themes/vp/images/logo.png" align="left"/></a>
FreeMarker Spring MVC Hello World
</H2>
</div>
<div id="content">
<fieldset>
<legend>Add User</legend>
<form name="user" action="add.html" method="post">
Firstname: <input type="text" name="firstname" /> <br/>
Lastname: <input type="text" name="lastname" /> <br/>
<input type="submit" value=" Save " />
</form>
</fieldset>
<br/>
<table class="datatable">
<tr>
<th>Firstname</th> <th>Lastname</th>
</tr>
<#list model["userList"] as user>
<tr>
<td>$user.firstname</td> <td>$user.lastname</td>
</tr>
</#list>
</table>
</div>
</body>
</html>
【问题讨论】:
你使用的是什么版本的 Spring Boot?你见过 Spring Boot 支持 Freemarker 模板的自动配置吗?查看this 和this 嗨,我使用的是 Spring Boot v1.2.5.RELEASE。谢谢,我现在去看看链接。 【参考方案1】:问题是你的控制器有错误的注释。 你应该使用@Controller 而不是@RestController
@RestController 用于告诉从控制器发送的响应应该发送到浏览器,通常是映射到 json 的对象。 与添加@ResponseBody 相同。
【讨论】:
谢谢!就是这样......现在改变并且工作正常。很好发现。【参考方案2】:虽然你刚刚得到了答案。但是,您的帖子有两点。
首先,在 Spring Boot 中配置 Freemarker 模板非常容易。无需使用 WebMvcConfigurerAdapter。您只需要将您的属性放在您的类路径中,内容如下
spring.freemarker.template-loader-path: /templates
spring.freemarker.suffix: .ftl
其次,@Controller 用于将类注释为 Spring MVC 控制器。 @RestController 注释类与 @Controller 相同,但处理程序方法上的 @ResponseBody 是隐含的。所以你必须在你的情况下使用@Controller。
从帖子Spring Boot FreeMarker Hello World Example找到这个
【讨论】:
以上是关于Spring Boot 和 FreeMarker的主要内容,如果未能解决你的问题,请参考以下文章
spring-boot-starter-web 和 spring-boot-starter-webflux 不能一起工作吗?
Spring Boot系列 Spring Boot介绍和基础POM文件
Spring Boot:Spring Boot整合Logback和PageHelper
spring-boot-starter-jta-atomikos 和 spring-boot-starter-batch