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>

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值