BaseDirective自定义指令基类,编写自定义指令时需要集成此类

package com.sanluan.common.base;

 

import java.io.IOException;

import java.util.Map;

 

import com.sanluan.common.handler.DirectiveHandler;

 

import freemarker.core.Environment;

import freemarker.template.TemplateDirectiveBody;

import freemarker.template.TemplateDirectiveModel;

import freemarker.template.TemplateException;

import freemarker.template.TemplateModel;

 

public abstract class BaseDirective implements TemplateDirectiveModel {

 

    @SuppressWarnings("unchecked")

    @Override

    public void execute(Environment environment, @SuppressWarnings("rawtypes") Map parameters, TemplateModel[] loopVars,

            TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException {

        execute(new DirectiveHandler(environment, parameters,loopVars, templateDirectiveBody));

    }

 

    public abstract void execute(DirectiveHandler handler) throws TemplateException, IOException;

}

DirectiveHandler操作封装类,这个类主要封装了指令参数的获取,数据模型的填充与回收,简化指令逻辑操作

package com.sanluan.common.handler;

 

import java.io.IOException;

import java.text.DateFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.HashMap;

import java.util.Map;

 

import org.apache.commons.lang3.StringUtils;

 

import freemarker.core.Environment;

import freemarker.template.TemplateBooleanModel;

import freemarker.template.TemplateDateModel;

import freemarker.template.TemplateDirectiveBody;

import freemarker.template.TemplateException;

import freemarker.template.TemplateHashModel;

import freemarker.template.TemplateHashModelEx;

import freemarker.template.TemplateModel;

import freemarker.template.TemplateModelException;

import freemarker.template.TemplateNumberModel;

import freemarker.template.TemplateScalarModel;

 

public class DirectiveHandler {

    public static final DateFormat FULL_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static final int FULL_DATE_LENGTH = 19;

 

    public static final DateFormat SHORT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

    public static final int SHORT_DATE_LENGTH = 10;

    private Environment environment;

    private Map<String, TemplateModel> parameters;

    private TemplateModel[] loopVars;

    private TemplateDirectiveBody templateDirectiveBody;

    private Map<String, Object> map = new HashMap<String, Object>();

 

    /**

     * @param environment

     * @param parameters

     * @param templateDirectiveBody

     */

    public DirectiveHandler(Environment environment, Map<String, TemplateModel> parameters, TemplateModel[] loopVars,

            TemplateDirectiveBody templateDirectiveBody) {

        this.environment = environment;

        this.loopVars = loopVars;

        this.parameters = parameters;

        this.templateDirectiveBody = templateDirectiveBody;

    }

 

    /**

     * 渲染

     * 

     * @param templateDirectiveBody

     * @throws IOException

     * @throws TemplateException

     */

    public void render() throws IOException, TemplateException {

        Map<String, TemplateModel> reduceMap = reduce();

        if (null != templateDirectiveBody)

            templateDirectiveBody.render(environment.getOut());

        reduce(reduceMap);

    }

 

    /**

     * 控制变量不为空时,导出所有变量

     * 

     * @param map

     * @param notEmptyObject

     * @throws IOException

     * @throws TemplateException

     */

    public void renderIfNotNull(Object notEmptyObject) throws IOException, TemplateException {

        if (null != notEmptyObject) {

            render();

        }

    }

 

    /**

     * 打印变量

     * 

     * @param str

     * @throws IOException

     * @throws TemplateException

     */

    public void print(String str) throws IOException, TemplateException {

        environment.getOut().append(str);

    }

 

    /**

     * @param key

     * @param value

     * @return

     */

    public DirectiveHandler put(String key, Object value) {

        map.put(key, value);

        return this;

    }

 

    /**

     * @return

     * @throws TemplateModelException

     */

    private Map<String, TemplateModel> reduce() throws TemplateModelException {

        Map<String, TemplateModel> reduceMap = new HashMap<String, TemplateModel>();

        for (String key : map.keySet()) {

            TemplateModel value = environment.getVariable(key);

            if (null != value)

                reduceMap.put(key, environment.getVariable(key));

            environment.setVariable(key, environment.getObjectWrapper().wrap(map.get(key)));

        }

        return reduceMap;

    }

 

    /**

     * @param map

     * @throws TemplateModelException

     */

    private void reduce(Map<String, TemplateModel> map) throws TemplateModelException {

        for (String key : map.keySet()) {

            environment.setVariable(key, map.get(key));

        }

    }

 

    /**

     * @param name

     * @return

     * @throws TemplateModelException

     */

    public TemplateHashModel getMap(String name) throws TemplateModelException {

        TemplateModel model = parameters.get(name);

        if (null == model) {

            return null;

        }

        if (model instanceof TemplateHashModelEx) {

            return (TemplateHashModelEx) model;

        } else if (model instanceof TemplateHashModel) {

            return (TemplateHashModel) model;

        } else {

            return null;

        }

    }

 

    /**

     * @param name

     * @param defaultValue

     * @return

     * @throws TemplateException

     */

    public String getString(String name, String defaultValue) throws TemplateException {

        String result = getString(name);

        if (null == result)

            return defaultValue;

        else

            return result;

    }

 

    /**

     * @param name

     * 

     * @return

     * @throws TemplateException

     */

    public String getString(String name) throws TemplateException {

        TemplateModel model = parameters.get(name);

        if (null == model) {

            return null;

        }

        if (model instanceof TemplateScalarModel) {

            return ((TemplateScalarModel) model).getAsString();

        } else if ((model instanceof TemplateNumberModel)) {

            return ((TemplateNumberModel) model).getAsNumber().toString();

        } else {

            return null;

        }

    }

 

    /**

     * @param name

     * @param defaultValue

     * @return

     * @throws TemplateException

     */

    public Integer getInteger(String name, int defaultValue) throws TemplateException {

        Integer result = getInteger(name);

        if (null == result)

            return defaultValue;

        else

            return result;

    }

 

    /**

     * @param name

     * 

     * @return

     * @throws TemplateException

     */

    public Integer getInteger(String name) throws TemplateException {

        TemplateModel model = parameters.get(name);

        if (null == model) {

            return null;

        }

        if (model instanceof TemplateNumberModel) {

            return ((TemplateNumberModel) model).getAsNumber().intValue();

        } else if (model instanceof TemplateScalarModel) {

            String s = ((TemplateScalarModel) model).getAsString();

            if (StringUtils.isBlank(s)) {

                return null;

            }

            try {

                return Integer.parseInt(s);

            } catch (NumberFormatException e) {

                return null;

            }

        } else {

            return null;

        }

    }

 

    /**

     * @param name

     * 

     * @return

     * @throws TemplateException

     */

    public Short getShort(String name) throws TemplateException {

        TemplateModel model = parameters.get(name);

        if (null == model) {

            return null;

        }

        if (model instanceof TemplateNumberModel) {

            return ((TemplateNumberModel) model).getAsNumber().shortValue();

        } else if (model instanceof TemplateScalarModel) {

            String s = ((TemplateScalarModel) model).getAsString();

            if (StringUtils.isBlank(s)) {

                return null;

            }

            try {

                return Short.parseShort(s);

            } catch (NumberFormatException e) {

                return null;

            }

        } else {

            return null;

        }

    }

 

    /**

     * @param name

     * 

     * @return

     * @throws TemplateException

     */

    public Long getLong(String name) throws TemplateException {

        TemplateModel model = parameters.get(name);

        if (null == model) {

            return null;

        }

        if (model instanceof TemplateNumberModel) {

            return ((TemplateNumberModel) model).getAsNumber().longValue();

        } else if (model instanceof TemplateScalarModel) {

            String s = ((TemplateScalarModel) model).getAsString();

            if (StringUtils.isBlank(s)) {

                return null;

            }

            try {

                return Long.parseLong(s);

            } catch (NumberFormatException e) {

                return null;

            }

        } else {

            return null;

        }

    }

 

    /**

     * @param name

     * 

     * @return

     * @throws TemplateException

     */

    public Double getDouble(String name) throws TemplateException {

        TemplateModel model = parameters.get(name);

        if (null == model) {

            return null;

        }

        if (model instanceof TemplateNumberModel) {

            return ((TemplateNumberModel) model).getAsNumber().doubleValue();

        } else if (model instanceof TemplateScalarModel) {

            String s = ((TemplateScalarModel) model).getAsString();

            if (StringUtils.isBlank(s)) {

                return null;

            }

            try {

                return Double.parseDouble(s);

            } catch (NumberFormatException e) {

                return null;

            }

        } else {

            return null;

        }

    }

 

    /**

     * @param name

     * 

     * @return

     * @throws TemplateException

     */

    public Integer[] getIntegerArray(String name) throws TemplateException {

        String[] arr = getStringArray(name);

        if (null != arr) {

            Integer[] ids = new Integer[arr.length];

            int i = 0;

            try {

                for (String s : arr) {

                    ids[i++] = Integer.valueOf(s);

                }

                return ids;

            } catch (NumberFormatException e) {

                return null;

            }

        } else

            return null;

 

    }

 

    /**

     * @param name

     * 

     * @return

     * @throws TemplateException

     */

    public Long[] getLongArray(String name) throws TemplateException {

        String[] arr = getStringArray(name);

        if (null != arr) {

            Long[] ids = new Long[arr.length];

            int i = 0;

            try {

                for (String s : arr) {

                    ids[i++] = Long.valueOf(s);

                }

                return ids;

            } catch (NumberFormatException e) {

                return null;

            }

        } else

            return null;

 

    }

 

    /**

     * @param name

     * 

     * @return

     * @throws TemplateException

     */

    public String[] getStringArray(String name) throws TemplateException {

        String str = getString(name);

        if (StringUtils.isBlank(str)) {

            return null;

        }

        return StringUtils.split(str, ',');

    }

 

    /**

     * @param name

     * @param defaultValue

     * @return

     * @throws TemplateException

     */

    public Boolean getBoolean(String name, Boolean defaultValue) throws TemplateException {

        Boolean result = getBoolean(name);

        if (null == result)

            return defaultValue;

        else

            return result;

    }

 

    /**

     * @param name

     * 

     * @return

     * @throws TemplateException

     */

    public Boolean getBoolean(String name) throws TemplateException {

        TemplateModel model = parameters.get(name);

        if (null == model) {

            return null;

        }

        if (model instanceof TemplateBooleanModel) {

            return ((TemplateBooleanModel) model).getAsBoolean();

        } else if (model instanceof TemplateNumberModel) {

            return !(0 == ((TemplateNumberModel) model).getAsNumber().intValue());

        } else if (model instanceof TemplateScalarModel) {

            String s = ((TemplateScalarModel) model).getAsString();

            if (StringUtils.isNotBlank(s)) {

                return !("0".equals(s) || "false".equalsIgnoreCase(s));

            } else {

                return null;

            }

        } else {

            return null;

        }

    }

 

    /**

     * @param name

     * 

     * @return

     * @throws TemplateException

     */

    public Date getDate(String name) throws TemplateException {

        TemplateModel model = parameters.get(name);

        if (null == model) {

            return null;

        }

        if (model instanceof TemplateDateModel) {

            return ((TemplateDateModel) model).getAsDate();

        } else if (model instanceof TemplateScalarModel) {

            String temp = StringUtils.trimToEmpty(((TemplateScalarModel) model).getAsString());

            try {

                if (FULL_DATE_LENGTH == temp.length()) {

                    return FULL_DATE_FORMAT.parse(temp);

                } else if (SHORT_DATE_LENGTH == temp.length()) {

                    return SHORT_DATE_FORMAT.parse(temp);

                } else {

                    return null;

                }

            } catch (ParseException e) {

                return null;

            }

        } else {

            return null;

        }

    }

 

    /**

     * @return the parameters

     */

    public Map<String, TemplateModel> getParameters() {

        return parameters;

    }

 

    /**

     * @return the environment

     */

    public Environment getEnvironment() {

        return environment;

    }

 

    /**

     * @return the templateDirectiveBody

     */

    public TemplateDirectiveBody getTemplateDirectiveBody() {

        return templateDirectiveBody;

    }

 

    public TemplateModel[] getLoopVars() {

        return loopVars;

    }

 

    public void setLoopVars(TemplateModel[] loopVars) {

        this.loopVars = loopVars;

    }

}

CmsCategoryListDirective示例

package com.publiccms.views.directive.cms;

 

// Generated 2015-5-10 17:54:56 by SourceMaker

 

import java.io.IOException;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

 

import com.publiccms.logic.service.cms.CmsCategoryService;

import com.sanluan.common.base.BaseDirective;

import com.sanluan.common.handler.PageHandler;

import com.sanluan.common.handler.DirectiveHandler;

import freemarker.template.TemplateException;

 

@Component

public class CmsCategoryListDirective extends BaseDirective {

 

    @Override

    public void execute(DirectiveHandler handler) throws TemplateException, IOException {

        PageHandler page = service.getPage(handler.getInteger("parentId"), handler.getString("extend1"),

                handler.getString("name"), handler.getBoolean("disabled", false), handler.getInteger("pageIndex", 1),

                handler.getInteger("count", 30));

        handler.put("page", page).render();

    }

 

    @Autowired

    private CmsCategoryService service;

 

}


标签:PublicCMS

匠人匠心科技是专业从事天津网站建设、天津网站制作、软件开发、移动建站、商城、微信端、app开发项目
软件事业部:天津市大学软件学院D-510(天津工业大学院内)
网站事业部: 天津市河北区新大路通广科技园3-225
咨询热线:138-2142-0129 136-2215-0903
天津网站建设_天津建站

扫码添加微信