package com.nfwork.dbfound.web.jstl; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; import org.apache.commons.beanutils.MethodUtils; import com.nfwork.dbfound.core.Context; import com.nfwork.dbfound.core.Transaction; import com.nfwork.dbfound.dto.QueryResponseObject; import com.nfwork.dbfound.exception.DBFoundRuntimeException; import com.nfwork.dbfound.model.ModelEngine; import com.nfwork.dbfound.web.WebExceptionHandle; import com.nfwork.dbfound.web.base.QueryDataProvide; public class Query extends TagSupport implements Cloneable { private static final long serialVersionUID = -5941376965347019531L; private String queryName; private String modelName; private String sourcePath; private String rootPath; private String dataProvideClass; private String dataProvideMethod = "execute"; public int doEndTag() throws JspException { HttpServletRequest request = (HttpServletRequest) pageContext .getRequest(); HttpServletResponse response = (HttpServletResponse) pageContext .getResponse(); Context context = Context.getCurrentContext(request, response); try { if (dataProvideClass != null) { context.setData(rootPath, getData(context)); } else { if (queryName == null || "".equals(queryName)) queryName = "_default"; QueryResponseObject ro = ModelEngine.query(context, modelName, queryName, sourcePath, false); context.setData(rootPath, ro.getDatas()); } } catch (Exception e) { Transaction transaction = context.getTransaction(); if (transaction.isOpen()) { transaction.rollback(); transaction.end(); } WebExceptionHandle.handle(e, request, (HttpServletResponse) pageContext.getResponse()); return SKIP_PAGE; } return EVAL_PAGE; } private Object getData(Context context) throws Exception { Object object = Class.forName(dataProvideClass).newInstance(); if (object instanceof QueryDataProvide) { Object ro = MethodUtils.invokeMethod(object, dataProvideMethod, new Object[] { context }); return ro; } else { throw new DBFoundRuntimeException("Provide必须实现QueryDataProvide接口"); } } 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 String getSourcePath() { return sourcePath; } public void setSourcePath(String sourcePath) { this.sourcePath = sourcePath; } public String getRootPath() { return rootPath; } public void setRootPath(String rootPath) { this.rootPath = rootPath; } public String getDataProvideClass() { return dataProvideClass; } public void setDataProvideClass(String dataProvideClass) { this.dataProvideClass = dataProvideClass; } public String getDataProvideMethod() { return dataProvideMethod; } public void setDataProvideMethod(String dataProvideMethod) { this.dataProvideMethod = dataProvideMethod; } }