freemarker 用法总结

深藏阁楼爱情的钟 2022-04-02 03:21 445阅读 0赞

freemarker 模板引擎解析对象

  1. ${user.userName!"默认值"}

freemarker 模板引擎取 Session 中取值

  1. ${Session.user.userName!"default value"}

freemarker 模板引擎遍历 list

  1. <#if userLists?exists>
  2. <#list userLists as leaveobj>
  3. <tr>
  4. <td class="text-center">${leaveobj_index+1}</td>
  5. <td class="text-center">${leaveobj.userName!"设置默认值"}</td>
  6. <td class="text-center">${leaveobj.userAge!"设置默认值"}</td>
  7. </tr>
  8. </#list>
  9. </#if>

注意:无论是解析对象,还是遍历 list,都要设置默认值(即该值为空时的值),否则 freemarker 会报 The following has evaluated to null or missing 的错

以下以一个小 demo 为例,测试以上代码

项目框架使用 springboot

实体类

  1. package com.freemark.bean;
  2. public class User {
  3. private String userName;
  4. private Integer userAge;
  5. public String getUserName() {
  6. return userName;
  7. }
  8. public void setUserName(String userName) {
  9. this.userName = userName;
  10. }
  11. public Integer getUserAge() {
  12. return userAge;
  13. }
  14. public void setUserAge(Integer userAge) {
  15. this.userAge = userAge;
  16. }
  17. }

controller 层

  1. package com.freemark.controller;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import javax.servlet.http.HttpSession;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.servlet.ModelAndView;
  8. import com.freemark.bean.User;
  9. @Controller
  10. @RequestMapping("/freem")
  11. public class DemoController {
  12. /**
  13. * 返回对象
  14. * @return
  15. */
  16. @RequestMapping("/user")
  17. public ModelAndView getUser(HttpSession session) {
  18. ModelAndView mav = new ModelAndView();
  19. User user = new User();
  20. user.setUserName("楚庄王");
  21. //user.setUserAge(25);
  22. session.setAttribute("user", user); // session中存值
  23. mav.addObject("user", user);
  24. mav.setViewName("user");
  25. return mav;
  26. }
  27. /**
  28. * 返回 list
  29. * @return
  30. */
  31. @RequestMapping("/user/list")
  32. public ModelAndView getUserList() {
  33. ModelAndView mav = new ModelAndView();
  34. List<User> list = new ArrayList<User>();
  35. User user1 = new User();
  36. user1.setUserName("楚庄王");
  37. user1.setUserAge(25);
  38. list.add(user1);
  39. User user2 = new User();
  40. user2.setUserName("齐桓公");
  41. user2.setUserAge(18);
  42. list.add(user2);
  43. User user3 = new User();
  44. user3.setUserName("晋文公");
  45. user3.setUserAge(60);
  46. list.add(user3);
  47. User user4 = new User();
  48. user4.setUserName("秦穆公");
  49. user4.setUserAge(55);
  50. list.add(user4);
  51. User user5 = new User();
  52. user5.setUserName("吴王阖闾");
  53. user5.setUserAge(27);
  54. list.add(user5);
  55. mav.addObject("userLists", list);
  56. mav.setViewName("userList");
  57. return mav;
  58. }
  59. }

user.ftl 页面

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>freemarker解析对象</title>
  6. </head>
  7. <body>
  8. session中取值 ${Session.user.userName!"default value"}
  9. <br>
  10. ${user.userName!"默认值"}
  11. ${user.userAge!"30"}
  12. </body>
  13. </html>

userList.ftl 页面

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>freemarker遍历list</title>
  6. </head>
  7. <body>
  8. <table border="1">
  9. <tr>
  10. <td class="text-center"><strong>序号</strong></td>
  11. <td class="text-center"><strong>用户名</strong></td>
  12. <td class="text-center"><strong>年龄</strong></td>
  13. </tr>
  14. <#if userLists?exists>
  15. <#list userLists as leaveobj>
  16. <tr>
  17. <td class="text-center">${leaveobj_index+1}</td>
  18. <td class="text-center">${leaveobj.userName!"设置默认值"}</td>
  19. <td class="text-center">${leaveobj.userAge!"设置默认值"}</td>
  20. </tr>
  21. </#list>
  22. </#if>
  23. </table>
  24. </body>
  25. </html>

注意: ${leaveobj_index+1} 为 freemarker 模板自带的序号自增, +1 为从 1 开始;${leaveobj_index} 为从 0 开始

测试

访问 http://localhost:8080/freem/user

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dzanp6Y2Jx_size_16_color_FFFFFF_t_70

访问 http://localhost:8080/freem/user/list

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dzanp6Y2Jx_size_16_color_FFFFFF_t_70 1

发表评论

表情:
评论列表 (有 0 条评论,445人围观)

还没有评论,来说两句吧...

相关阅读

    相关 typedef 用法总结

     不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中。typedef与\define有些相似,但更多的是不同,特别是在一些复杂的用法上,