spring-boot-note4---freemarket

野生技術協會發表於2021-01-02

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>