spring-boot-note4---freemarket
spring-boot整合freemarket
freemarker是一個模板引擎,我們在使用SpringMVC等框架的時候,使用的都是jsp,jsp的本質其實就是一個Servlet,其中的資料需要在後端進行渲染,並且每次都要渲染,而後端使用模板引擎的好處就是,渲染效率高,並且模板有些內容不需要重複渲染。本文主要介紹spring-boot整合freemarket的使用。
工程一覽
一、在application.properties中配置#freemarket
#freemarket的配置
spring.freemarker.allow-request-override=false
spring.freemarker.allow-session-override=false
spring.freemarker.cache=true
spring.freemarker.check-template-location=true
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=true
spring.freemarker.suffix=.html
spring.freemarker.template-loader-path=classpath:/templates
spring.freemarker.request-context-attribute=req
spring.freemarker.enabled=true
spring.freemarker.settings.template_update_delay=0
spring.freemarker.settings.default_encoding=UTF-8
spring.freemarker.settings.number_format=#.##
spring.freemarker.settings.classic_compatible=true
二、使用方式
1、在controller中返回檢視路徑/base ,這裡實際上就是 /template/base.html的模板路徑
@Controller
public class IndexAction {
@RequestMapping("/base")
private String base(Model model){
List<String> res = new ArrayList<>();
for (int i = 0; i < 3; i++) {
res.add(i + "");
}
model.addAttribute("res", res);
return "/base";
}
}
2、我們沒有設定model的值,但是採用初始化注入一些屬性和模板指令到freemarket中測試用途。
@Configuration
public class FreemarketConfig {
private static List<String> strs = new ArrayList<>();
static {
strs.add("字串1");
strs.add("字串2");
strs.add("字串3");
strs.add("字串4");
}
@Value("${project.name}")
private String project_name;
@Value("${project.title}")
private String project_title;
@Autowired
protected freemarker.template.Configuration configuration;
@Autowired
protected StudentTag studentTag;
/**
* 新增自定義標籤,自定義屬性等等!
*/
@PostConstruct
public void setSharedVariable() throws TemplateModelException {
configuration.setSharedVariable("project_name", project_name);
configuration.setSharedVariable("project_title", project_title);
configuration.setSharedVariable("strs", strs);
configuration.setSharedVariable("studentTag", studentTag);
}
}
@Component
public class StudentTag implements TemplateDirectiveModel {
private static final String PAGE_KEY = "page";
@Autowired
private StudentService studentService;
@Override
public void execute(Environment environment, @SuppressWarnings("rawtypes") Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException {
if (map.containsKey(PAGE_KEY)) {
DefaultObjectWrapperBuilder builder = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25);
String page = map.get(PAGE_KEY).toString();
//將資料物件轉換成對應的TemplateModel
TemplateModel model = builder.build().wrap(studentService.selectAll());
environment.setVariable("arrs", model);
}
templateDirectiveBody.render(environment.getOut());
}
}
3、base.html模板
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>freemarket基本</title>
</head>
<body>
<!-- 當前contentPath 是空的。 -->
<div style="background: #ccc;height:20px;">${req.contextPath}/base.html</div>
<!-- 遍歷自定義變數的一個List。 -->
<ul>
<#list strs as str>
<li>${str}</li>
</#list>
</ul>
<!-- 取自定義變數的二個屬性。 -->
<p>${project_name}</p>
<p>${project_title}</p>
<!-- 這裡是controller中model中的res屬性 -->
<ul>
<#list res as re>
<li>${re_index+1}:${re}</li>
</#list>
</ul>
<!-- 自定義標籤student -->
<@studentTag page="10">
<ul>
<#list arrs as obj> <!-- 遍歷備註: item_index 序號,list?size尺寸,! item_has_next是最後一個 -->
<li>${obj_index+1}:${obj.name}</li>
<#if !obj_has_next>
共有${arrs?size}最後一個使用者是:${obj.name}
</#if>
</#list>
</ul>
</@studentTag>
</body>
</html>