2015-07-07 39 views
7

Tôi đang cố gắng làm việc thông qua một ví dụ đơn giản về Khởi động Spring và tích hợp FreeMarker (dựa trên các hướng dẫn tôi đã tìm thấy trên web). Đối với một số lý do quan điểm của tôi không được giải quyết cho mẫu FreeMarker (tôi nghĩ đó là vấn đề).Khởi động mùa xuân và FreeMarker

Kết quả khi được khởi chạy trong trình duyệt chỉ đơn giản là trả về tên của tệp xem TFL tức là "chỉ mục". Vì vậy, bộ điều khiển đang được gọi và trả về chuỗi "chỉ mục", nhưng dường như không có trình kích hoạt nào để kéo vào tệp FTL. Mọi trợ giúp sẽ được đánh giá cao ...

Tôi có lớp cấu hình sau đây, nơi tôi xác định trình phân giải chế độ xem và cấu hình Trình xây dựng miễn phí.

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

Sau đó, tôi đã điều khiển sau:

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

Sau đó, cuối cùng tôi đã tập tin FTL sau lưu trữ trong "src/main/tài nguyên/mẫu"

<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> 
+1

Bạn đang sử dụng phiên bản Spring Boot nào? Bạn đã thấy Spring Boot hỗ trợ tự động cấu hình cho các mẫu Freemarker chưa? Kiểm tra [this] (http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-template-engines) và [this] (https: //github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfiguration.java) – geoand

+0

Xin chào, tôi là sử dụng Spring Boot v1.2.5.RELEASE. Cảm ơn, tôi sẽ kiểm tra các liên kết ngay bây giờ. –

Trả lời

10

Vấn đề là bộ điều khiển của bạn có chú thích sai. Bạn nên sử dụng @Controller thay vì @RestController

@RestController được sử dụng để cho biết rằng phản hồi được gửi từ bộ điều khiển của bạn sẽ được gửi tới trình duyệt, thường là đối tượng được ánh xạ tới json. Nó cũng giống như thêm @ResponseBody.

+0

Cảm ơn! đó là ... thay đổi ngay bây giờ và làm việc tốt. Vâng phát hiện. –

1

Mặc dù bạn vừa nhận được câu trả lời. Tuy nhiên, bài đăng của bạn có hai điểm.

Thứ nhất, định cấu hình mẫu Freemarker trong Spring Boot khá dễ dàng. Không cần sử dụng WebMvcConfigurerAdapter. Bạn chỉ cần đặt các thuộc tính của mình trên đường dẫn lớp với nội dung bên dưới

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

Thứ hai, @Controller được sử dụng cho các lớp được chú thích là Bộ điều khiển MVC Spring. Các lớp được chú thích @RestController giống như @Controller nhưng hàm @ResponseBody trên các phương thức xử lý được ngụ ý. Vì vậy, bạn phải sử dụng @Controller trong trường hợp của bạn.

Tìm thấy điều này từ bài đăng Spring Boot FreeMarker Hello World Example

Các vấn đề liên quan