Spring Download and FreeMarker

I am trying to work with a simple example of integrating Spring Boot and FreeMarker (based on the tutorials I found on the Internet). For some reason, my opinion is not resolved by the FreeMarker pattern (I think the problem is).

The result when launched in the browser is simply to return a file name of the form TFL, i.e. "index". Thus, the controller is called and returns the string "index", but there seems to be no trigger for the FTL file itself. Any help would be appreciated ...

I have the following configuration class, where I define the resolution of the view and the configuration of 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; } } 

Then I have the following controller:

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

Then finally, I have the following FTL file stored in "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 height="37" width="236" 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> 
+7
spring freemarker
source share
2 answers

The problem is that your controller has the wrong annotation. You should use @Controller instead of @RestController

@RestController is used to indicate that a response sent from your controller should be sent to the browser, usually an object mapped to json. This is the same as adding @ResponseBody.

+10
source share

Although you just got an answer. However, your post has two points.

First, setting up a Freemarker template in Spring Boot is pretty easy. No need to use WebMvcConfigurerAdapter. You just need to put your properties in your class path with the content below

 spring.freemarker.template-loader-path: /templates spring.freemarker.suffix: .ftl 

Secondly, @Controller is used for annotated classes like Spring MVC Controller. @RestController annotated classes are the same as @Controller, but @ResponseBody is implied in handler methods. Therefore, you should use @Controller in your case.

This is found from a Spring post. FreeMarker Hello World Download Example

+1
source share

All Articles