在前台模板使用FreeMarker标签获取数据。
package com.jspxcms.plug.web.directive;
/**
* FreeMarker标签类需实现TemplateDirectiveModel接口
*/
public class ResumeListDirective implements TemplateDirectiveModel {
public static final String SITE_ID = "siteId";
public void execute(Environment env, Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body) throws TemplateException, IOException {
// 使用标签时,返回变量必须存在,如[@ResumeList; result]...[/@ResumeList]中分号后的result。
if (loopVars.length < 1) {
throw new TemplateModelException("Loop variable is required.");
}
// 标签体必须存在,即[@ResumeList; list]...[/@ResumeList]中间的部分。
if (body == null) {
throw new RuntimeException("missing body");
}
// 获取标签参数,如[@ResumeList siteId='123'; list]...[/@ResumeList]中的123。
Integer[] siteId = Freemarkers.getIntegers(params, SITE_ID);
if (siteId == null && params.get(SITE_ID) == null) {
// 如果没有传入siteId这个参数,则获取当前站点的ID。
siteId = new Integer[]{ForeContext.getSiteId(env)};
}
Sort defSort = new Sort(Direction.DESC, "creationDate", "id");
Limitable limitable = Freemarkers.getLimitable(params, defSort);
List<Resume> list = service.findList(siteId, limitable);
// 将获取的数据放到返回变量里。
loopVars[0] = env.getObjectWrapper().wrap(list);
// 执行标签体。
body.render(env.getOut());
}
@Autowired
private ResumeService service;
}
FreeMarker标签类需要在/src/main/resources/conf/plugin/plug/context.xml
文件中声明<bean id="PlugResumeList" class="com.jspxcms.plug.web.directive.ResumeListDirective" />
然后在/src/main/resources/conf/plugin/plug/conf.properties
文件中加入freemarkerVariables.ResumeList=PlugResumeList
。在模板中调用标签的名称是ResumeList
,而非PlugResumeList
。
定义了标签后,在任意的前台模板中都可以使用这个标签,如:
[@ResumeList; result]
[#list result as bean]
${bean.name}, ${bean.mobile}
[/#list]
[/@ResumeList]