package com.nfwork.dbfound.web.ui; import java.io.Writer; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import com.nfwork.dbfound.model.ModelEngine; import com.nfwork.dbfound.util.JsonUtil; import com.nfwork.dbfound.util.LogUtil; import com.nfwork.dbfound.core.Context; import com.nfwork.dbfound.core.Transaction; import com.nfwork.dbfound.dto.QueryResponseObject; import com.nfwork.dbfound.web.WebExceptionHandle; import freemarker.template.Configuration; import freemarker.template.Template; public class DataSet extends TagSupport { private static final long serialVersionUID = 7492822892288859474L; private String templateName = "dataSet.ftl"; private String id; private String queryName; private String modelName; private String sourcePath; private boolean loadData = true; private boolean autoCount = false; private String fields; public int doEndTag() throws JspException { JspWriter out = pageContext.getOut(); return executeFreemarker(out); } @SuppressWarnings("unchecked") public int executeFreemarker(Writer out) { HttpServletRequest request = (HttpServletRequest) pageContext .getRequest(); HttpServletResponse response = (HttpServletResponse) pageContext .getResponse(); Context context = Context.getCurrentContext(request, response); try { Configuration cfg = FreemarkFactory.getConfig(pageContext .getServletContext()); // 定义Template对象 Template template = cfg.getTemplate(templateName); // 定义数据 Map<String, Object> root = new HashMap<String, Object>(); root.put("id", id); root.put("loadData", loadData); String url = modelName + ".query"; if (queryName != null && queryName != "_default") { url = url + "!" + queryName; } root.put("url", url); if (loadData) { if (queryName == null || "".equals(queryName)) { queryName = "_default"; } QueryResponseObject ro = ModelEngine.query(context, modelName, queryName, sourcePath, autoCount); if (ro != null && ro.getDatas().size() > 0) { try { Map map0 = (Map) ro.getDatas().get(0); root.put("keySet", map0.keySet()); } catch (Exception e) { LogUtil.warn("数据返回格式不是list<map>,自动转化field失败"); } } root.put("qro", JsonUtil.beanToJson(ro)); } if (fields != null) { String fieldsString = "'" + fields.replaceAll(",", "','") + "'"; root.put("fields", fieldsString); } template.process(root, out); } catch (Exception e) { Transaction transaction = context.getTransaction(); if (transaction.isOpen()) { transaction.rollback(); transaction.end(); } WebExceptionHandle.handle(e, (HttpServletRequest) pageContext .getRequest(), (HttpServletResponse) pageContext .getResponse()); return SKIP_PAGE; } return EVAL_PAGE; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getSourcePath() { return sourcePath; } public void setSourcePath(String sourcePath) { this.sourcePath = sourcePath; } public String getQueryName() { return queryName; } public void setQueryName(String queryName) { this.queryName = queryName; } public String getModelName() { return modelName; } public void setModelName(String modelName) { this.modelName = modelName; } public boolean isLoadData() { return loadData; } public void setLoadData(boolean loadData) { this.loadData = loadData; } public String getFields() { return fields; } public void setFields(String fields) { this.fields = fields; } public boolean isAutoCount() { return autoCount; } public void setAutoCount(boolean autoCount) { this.autoCount = autoCount; } }