一、原理講解
jeesite代碼生成用的是FreeMarker模板引擎結合xml技術來實現的,定義的模板都放在resources/templates/modules/gen下
一看就知道crud就是基本的增刪改查,dao是數據庫操作,treetable是有關樹方面的模板,其中主要的配置文件就是config.xml,該文件中定義了生成的模板,以及java類型,查詢類型,字段顯示類型等一些數據。
[html] view plain copy
- <?xml version="1.0" encoding="utf-8"?>
- <config>
- <!-- 生成分類 -->
- <category>
- <category value="curd" label="增刪改查(單表)">
- <template>curd/controller.xml</template>
- <template>curd/service.xml</template>
- <template>category-ref:dao</template>
- <template>curd/viewForm.xml</template>
- <template>curd/viewList.xml</template>
- </category>
- <category value="curd_many" label="增刪改查(一對多)">
- <template>curd/controller.xml</template>
- <template>curd/serviceMany.xml</template>
- <template>category-ref:dao</template>
- <template>curd/viewFormMany.xml</template>
- <template>curd/viewList.xml</template>
- <childTable>
- <template>category-ref:dao</template>
- </childTable>
- </category>
- <category value="dao" label="僅持久層(dao/entity/mapper)">
- <template>dao/dao.xml</template>
- <template>dao/entity.xml</template>
- <template>dao/mapper.xml</template>
- </category>
- <category value="treeTable" label="樹結構表(一體)">
- <template>treetable/controller.xml</template>
- <template>treetable/service.xml</template>
- <template>treetable/dao.xml</template>
- <template>treetable/entity.xml</template>
- <template>treetable/mapper.xml</template>
- <template>treetable/viewForm.xml</template>
- <template>treetable/viewList.xml</template>
- </category>
- <category value="treeTableAndList" label="樹結構表(左樹右表)">
- <template>category-ref:dao</template>
- </category>
- </category>
- <!-- java類型 -->
- <javaType>
- <dict value="String" label="String"/>
- <dict value="Long" label="Long"/>
- <dict value="Integer" label="Integer"/>
- <dict value="Double" label="Double"/>
- <dict value="java.util.Date" label="Date"/>
- <dict value="com.thinkgem.jeesite.modules.sys.entity.User" label="User"/>
- <dict value="com.thinkgem.jeesite.modules.sys.entity.Office" label="Office"/>
- <dict value="com.thinkgem.jeesite.modules.sys.entity.Area" label="Area"/>
- <dict value="This" label="ThisObj" description="生成當前對象"/>
- <dict value="Custom" label="Custom" description="自定義對象,生成後手動設置"/>
- </javaType>
- <!-- 查詢類型 -->
- <queryType>
- <dict value="=" label="="/>
- <dict value="!=" label="!="/>
- <dict value=">" label=">"/>
- <dict value=">=" label=">="/>
- <dict value="<" label="<"/>
- <dict value="<=" label="<="/>
- <dict value="between" label="Between"/>
- <dict value="like" label="Like"/>
- <dict value="left_like" label="Left Like"/>
- <dict value="right_like" label="Right Like"/>
- </queryType>
- <!-- 字段顯示類型 -->
- <showType>
- <dict value="input" label="單行文本"/>
- <dict value="textarea" label="多行文本"/>
- <dict value="select" label="下拉選項"/>
- <dict value="radiobox" label="單選按鈕"/>
- <dict value="checkbox" label="複選框"/>
- <dict value="dateselect" label="日期選擇"/>
- <dict value="userselect" label="人員選擇"/>
- <dict value="officeselect" label="部門選擇"/>
- <dict value="areaselect" label="區域選擇"/>
- <dict value="treeselect" label="樹選擇控件"/>
- <dict value="fileselect" label="文件上傳選擇"/>
- </showType>
- </config>
其中
[html] view plain copy
- <childTable>
- <template>category-ref:dao</template>
- </childTable>
定義了子表,初看jeesite的代碼生成,有個困惑的地方就是,一般通過FreeMarker進行代碼生成定義的模板都是ftl格式的,而這裏卻是xml,什麼鬼,難道這裏不是用FreeMarker進行生成的??我們先來看下xml文件中的內容就清楚了:
[html] view plain copy
- <?xml version="1.0" encoding="utf-8"?>
- <template>
- <name>controller</name>
- <filePath>src/main/java/${packageName}/${moduleName}/web/${subModuleName}</filePath>
- <fileName>${ClassName}Controller.java</fileName>
- <content><![CDATA[
- /**
- * Copyright © 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
- */
- package ${packageName}.${moduleName}.web<#if subModuleName != "">.${subModuleName}</#if>;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.shiro.authz.annotation.RequiresPermissions;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.ModelAttribute;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.servlet.mvc.support.RedirectAttributes;
- import com.thinkgem.jeesite.common.config.Global;
- import com.thinkgem.jeesite.common.persistence.Page;
- import com.thinkgem.jeesite.common.web.BaseController;
- import com.thinkgem.jeesite.common.utils.StringUtils;
- import ${packageName}.${moduleName}.entity<#if subModuleName != "">.${subModuleName}</#if>.${ClassName};
- import ${packageName}.${moduleName}.service<#if subModuleName != "">.${subModuleName}</#if>.${ClassName}Service;
- /**
- * ${functionName}Controller
- * @author ${functionAuthor}
- * @version ${functionVersion}
- */
- @Controller
- @RequestMapping(value = "${r"${adminPath}"}/${urlPrefix}")
- public class ${ClassName}Controller extends BaseController {
- @Autowired
- private ${ClassName}Service ${className}Service;
- @ModelAttribute
- public ${ClassName} get(@RequestParam(required=false) String id) {
- ${ClassName} entity = null;
- if (StringUtils.isNotBlank(id)){
- entity = ${className}Service.get(id);
- }
- if (entity == null){
- entity = new ${ClassName}();
- }
- return entity;
- }
- @RequiresPermissions("${permissionPrefix}:view")
- @RequestMapping(value = {"list", ""})
- public String list(${ClassName} ${className}, HttpServletRequest request, HttpServletResponse response, Model model) {
- Page<${ClassName}> page = ${className}Service.findPage(new Page<${ClassName}>(request, response), ${className});
- model.addAttribute("page", page);
- return "${lastPackageName}/${viewPrefix}List";
- }
- @RequiresPermissions("${permissionPrefix}:view")
- @RequestMapping(value = "form")
- public String form(${ClassName} ${className}, Model model) {
- model.addAttribute("${className}", ${className});
- return "${lastPackageName}/${viewPrefix}Form";
- }
- @RequiresPermissions("${permissionPrefix}:edit")
- @RequestMapping(value = "save")
- public String save(${ClassName} ${className}, Model model, RedirectAttributes redirectAttributes) {
- if (!beanValidator(model, ${className})){
- return form(${className}, model);
- }
- ${className}Service.save(${className});
- addMessage(redirectAttributes, "保存${functionNameSimple}成功");
- return "redirect:"+Global.getAdminPath()+"/${viewPrefix}/?repage";
- }
- @RequiresPermissions("${permissionPrefix}:edit")
- @RequestMapping(value = "delete")
- public String delete(${ClassName} ${className}, RedirectAttributes redirectAttributes) {
- ${className}Service.delete(${className});
- addMessage(redirectAttributes, "刪除${functionNameSimple}成功");
- return "redirect:"+Global.getAdminPath()+"/${viewPrefix}/?repage";
- }
- }]]>
- </content>
- </template>
其中的xml格式爲:
[html] view plain copy
- <?xml version="1.0" encoding="utf-8"?>
- <template>
- <name>controller</name>
- <filePath>src/main/java/${packageName}/${moduleName}/web/${subModuleName}</filePath>
- <fileName>${ClassName}Controller.java</fileName>
- <content><![CDATA[]]>
- </content>
- </template>
發現其中的奧祕沒,他把模板內容都放在了content標籤的CDATA[]區。而且config.xml有相對應的bean,用來實現xml轉對象:
[html] view plain copy
- /**
- * 生成方案Entity
- * @author ThinkGem
- * @version 2013-10-15
- */
- @XmlRootElement(name="config")
- public class GenConfig implements Serializable {
- private static final long serialVersionUID = 1L;
- private List<GenCategory> categoryList; // 代碼模板分類
- private List<Dict> javaTypeList; // Java類型
- private List<Dict> queryTypeList; // 查詢類型
- private List<Dict> showTypeList; // 顯示類型
- public GenConfig() {
- super();
- }
- @XmlElementWrapper(name = "category")
- @XmlElement(name = "category")
- public List<GenCategory> getCategoryList() {
- return categoryList;
- }
- public void setCategoryList(List<GenCategory> categoryList) {
- this.categoryList = categoryList;
- }
- @XmlElementWrapper(name = "javaType")
- @XmlElement(name = "dict")
- public List<Dict> getJavaTypeList() {
- return javaTypeList;
- }
- public void setJavaTypeList(List<Dict> javaTypeList) {
- this.javaTypeList = javaTypeList;
- }
- @XmlElementWrapper(name = "queryType")
- @XmlElement(name = "dict")
- public List<Dict> getQueryTypeList() {
- return queryTypeList;
- }
- public void setQueryTypeList(List<Dict> queryTypeList) {
- this.queryTypeList = queryTypeList;
- }
- @XmlElementWrapper(name = "showType")
- @XmlElement(name = "dict")
- public List<Dict> getShowTypeList() {
- return showTypeList;
- }
- public void setShowTypeList(List<Dict> showTypeList) {
- this.showTypeList = showTypeList;
- }
- }
其中的
[html] view plain copy
- private List<GenCategory> categoryList; // 代碼模板分類
- private List<Dict> javaTypeList; // Java類型
- private List<Dict> queryTypeList; // 查詢類型
- private List<Dict> showTypeList; // 顯示類型
對應的就是xml中預先定義好的
[html] view plain copy
- <?xml version="1.0" encoding="utf-8"?>
- <config>
- <!-- 生成分類 -->
- <category>
- <category value="curd" label="增刪改查(單表)">
- <template>curd/controller.xml</template>
- ....
- </category>
- <category value="curd_many" label="增刪改查(一對多)">
- <template>curd/controller.xml</template>
- ....
- <childTable>
- <template>category-ref:dao</template>
- </childTable>
- </category>
- <category value="dao" label="僅持久層(dao/entity/mapper)">
- <template>dao/dao.xml</template>
- ....
- </category>
- <category value="treeTable" label="樹結構表(一體)">
- <template>treetable/controller.xml</template>
- ....
- </category>
- <category value="treeTableAndList" label="樹結構表(左樹右表)">
- <template>category-ref:dao</template>
- </category>
- </category>
- <!-- java類型 -->
- <javaType>
- <dict value="String" label="String"/>
- ....
- </javaType>
- <!-- 查詢類型 -->
- <queryType>
- <dict value="=" label="="/>
- ....
- </queryType>
- <!-- 字段顯示類型 -->
- <showType>
- <dict value="input" label="單行文本"/>
- <dict value="textarea" label="多行文本"/>
- ....
- </showType>
- </config>
其中的代碼模板分類
通過@XmlElement(name = "category")引用了GenCategory類,其中定義了主子模板
[html] view plain copy
- /**
- * 生成方案Entity
- * @author ThinkGem
- * @version 2013-10-15
- */
- @XmlRootElement(name="category")
- public class GenCategory extends Dict {
- private static final long serialVersionUID = 1L;
- private List<String> template; // 主表模板
- private List<String> childTableTemplate;// 子表模板
- public static String CATEGORY_REF = "category-ref:";
- public GenCategory() {
- super();
- }
- @XmlElement(name = "template")
- public List<String> getTemplate() {
- return template;
- }
- public void setTemplate(List<String> template) {
- this.template = template;
- }
- @XmlElementWrapper(name = "childTable")
- @XmlElement(name = "template")
- public List<String> getChildTableTemplate() {
- return childTableTemplate;
- }
- public void setChildTableTemplate(List<String> childTableTemplate) {
- this.childTableTemplate = childTableTemplate;
- }
- }
這兩個主子其實對應的就是
在GenUtils中通過getConfig()方法可獲取轉換成bean的對象
而其中的數據就是在配置業務表是初始化的一些數據,比如當我們選擇某一張表時,然後點擊下一步
就會調用GenTableController中的form方法,把一些配置參數設置進去
然後在genTableForm.jsp頁面進行渲染
[html] view plain copy
- <%@ page contentType="text/html;charset=UTF-8" %>
- <%@ include file="/WEB-INF/views/include/taglib.jsp"%>
- <html>
- <head>
- <title>業務表管理</title>
- <meta name="decorator" content="default"/>
- <script type="text/javascript">
- $(document).ready(function() {
- $("#comments").focus();
- $("#inputForm").validate({
- submitHandler: function(form){
- loading('正在提交,請稍等...');
- $("input[type=checkbox]").each(function(){
- $(this).after("<input type=\"hidden\" name=\""+$(this).attr("name")+"\" value=\""
- +($(this).attr("checked")?"1":"0")+"\"/>");
- $(this).attr("name", "_"+$(this).attr("name"));
- });
- form.submit();
- },
- errorContainer: "#messageBox",
- errorPlacement: function(error, element) {
- $("#messageBox").text("輸入有誤,請先更正。");
- if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
- error.appendTo(element.parent().parent());
- } else {
- error.insertAfter(element);
- }
- }
- });
- });
- </script>
- </head>
- <body>
- <ul class="nav nav-tabs">
- <li><a href="${ctx}/gen/genTable/">業務表列表</a></li>
- <li class="active"><a href="${ctx}/gen/genTable/form?id=${genTable.id}&name=${genTable.name}">業務表<shiro:hasPermission name="gen:genTable:edit">${not empty genTable.id?'修改':'添加'}</shiro:hasPermission><shiro:lacksPermission name="gen:genTable:edit">查看</shiro:lacksPermission></a></li>
- </ul>
- <c:choose>
- <c:when test="${empty genTable.name}">
- <form:form id="inputForm" modelAttribute="genTable" action="${ctx}/gen/genTable/form" method="post" class="form-horizontal">
- <form:hidden path="id"/>
- <sys:message content="${message}"/>
- <br/>
- <div class="control-group">
- <label class="control-label">表名:</label>
- <div class="controls">
- <form:select path="name" class="input-xxlarge">
- <form:options items="${tableList}" itemLabel="nameAndComments" itemValue="name" htmlEscape="false"/>
- </form:select>
- </div>
- <div class="form-actions">
- <input id="btnSubmit" class="btn btn-primary" type="submit" value="下一步"/>
- <input id="btnCancel" class="btn" type="button" value="返 回" οnclick="history.go(-1)"/>
- </div>
- </div>
- </form:form>
- </c:when>
- <c:otherwise>
- <form:form id="inputForm" modelAttribute="genTable" action="${ctx}/gen/genTable/save" method="post" class="form-horizontal">
- <form:hidden path="id"/>
- <sys:message content="${message}"/>
- <fieldset>
- <legend>基本信息</legend>
- <div class="control-group">
- <label class="control-label">表名:</label>
- <div class="controls">
- <form:input path="name" htmlEscape="false" maxlength="200" class="required" readonly="true"/>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">說明:</label>
- <div class="controls">
- <form:input path="comments" htmlEscape="false" maxlength="200" class="required"/>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">類名:</label>
- <div class="controls">
- <form:input path="className" htmlEscape="false" maxlength="200" class="required"/>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">父表表名:</label>
- <div class="controls">
- <form:select path="parentTable" cssClass="input-xlarge">
- <form:option value="">無</form:option>
- <form:options items="${tableList}" itemLabel="nameAndComments" itemValue="name" htmlEscape="false"/>
- </form:select>
- 當前表外鍵:
- <form:select path="parentTableFk" cssClass="input-xlarge">
- <form:option value="">無</form:option>
- <form:options items="${genTable.columnList}" itemLabel="nameAndComments" itemValue="name" htmlEscape="false"/>
- </form:select>
- <span class="help-inline">如果有父表,請指定父表表名和外鍵</span>
- </div>
- </div>
- <div class="control-group hide">
- <label class="control-label">備註:</label>
- <div class="controls">
- <form:textarea path="remarks" htmlEscape="false" rows="4" maxlength="200" class="input-xxlarge"/>
- </div>
- </div>
- <legend>字段列表</legend>
- <div class="control-group">
- <table id="contentTable" class="table table-striped table-bordered table-condensed">
- <thead><tr>
- <th title="數據庫字段名">列名</th>
- <th title="默認讀取數據庫字段備註">說明</th>
- <th title="數據庫中設置的字段類型及長度">物理類型</th>
- <th title="實體對象的屬性字段類型">Java類型</th>
- <th title="實體對象的屬性字段(對象名.屬性名|屬性名2|屬性名3,例如:用戶user.id|name|loginName,屬性名2和屬性名3爲Join時關聯查詢的字段)">Java屬性名稱 <i class="icon-question-sign"></i></th>
- <th title="是否是數據庫主鍵">主鍵</th><th title="字段是否可爲空值,不可爲空字段自動進行空值驗證">可空</th><th title="選中後該字段被加入到insert語句裏">插入</th>
- <th title="選中後該字段被加入到update語句裏">編輯</th><th title="選中後該字段被加入到查詢列表裏">列表</th>
- <th title="選中後該字段被加入到查詢條件裏">查詢</th><th title="該字段爲查詢字段時的查詢匹配放鬆">查詢匹配方式</th>
- <th title="字段在表單中顯示的類型">顯示錶單類型</th><th title="顯示錶單類型設置爲“下拉框、複選框、點選框”時,需設置字典的類型">字典類型</th><th>排序</th></tr></thead>
- <tbody>
- <c:forEach items="${genTable.columnList}" var="column" varStatus="vs">
- <tr${column.delFlag eq '1'?' class="error" title="已刪除的列,保存之後消失!"':''}>
- <td nowrap>
- <input type="hidden" name="columnList[${vs.index}].id" value="${column.id}"/>
- <input type="hidden" name="columnList[${vs.index}].delFlag" value="${column.delFlag}"/>
- <input type="hidden" name="columnList[${vs.index}].genTable.id" value="${column.genTable.id}"/>
- <input type="hidden" name="columnList[${vs.index}].name" value="${column.name}"/>${column.name}
- </td>
- <td>
- <input type="text" name="columnList[${vs.index}].comments" value="${column.comments}" maxlength="200" class="required" style="width:100px;"/>
- </td>
- <td nowrap>
- <input type="hidden" name="columnList[${vs.index}].jdbcType" value="${column.jdbcType}"/>${column.jdbcType}
- </td>
- <td>
- <select name="columnList[${vs.index}].javaType" class="required input-mini" style="width:85px;*width:75px">
- <c:forEach items="${config.javaTypeList}" var="dict">
- <option value="${dict.value}" ${dict.value==column.javaType?'selected':''} title="${dict.description}">${dict.label}</option>
- </c:forEach>
- </select>
- </td>
- <td>
- <input type="text" name="columnList[${vs.index}].javaField" value="${column.javaField}" maxlength="200" class="required input-small"/>
- </td>
- <td>
- <input type="checkbox" name="columnList[${vs.index}].isPk" value="1" ${column.isPk eq '1' ? 'checked' : ''}/>
- </td>
- <td>
- <input type="checkbox" name="columnList[${vs.index}].isNull" value="1" ${column.isNull eq '1' ? 'checked' : ''}/>
- </td>
- <td>
- <input type="checkbox" name="columnList[${vs.index}].isInsert" value="1" ${column.isInsert eq '1' ? 'checked' : ''}/>
- </td>
- <td>
- <input type="checkbox" name="columnList[${vs.index}].isEdit" value="1" ${column.isEdit eq '1' ? 'checked' : ''}/>
- </td>
- <td>
- <input type="checkbox" name="columnList[${vs.index}].isList" value="1" ${column.isList eq '1' ? 'checked' : ''}/>
- </td>
- <td>
- <input type="checkbox" name="columnList[${vs.index}].isQuery" value="1" ${column.isQuery eq '1' ? 'checked' : ''}/>
- </td>
- <td>
- <select name="columnList[${vs.index}].queryType" class="required input-mini">
- <c:forEach items="${config.queryTypeList}" var="dict">
- <option value="${fns:escapeHtml(dict.value)}" ${fns:escapeHtml(dict.value)==column.queryType?'selected':''} title="${dict.description}">${fns:escapeHtml(dict.label)}</option>
- </c:forEach>
- </select>
- </td>
- <td>
- <select name="columnList[${vs.index}].showType" class="required" style="width:100px;">
- <c:forEach items="${config.showTypeList}" var="dict">
- <option value="${dict.value}" ${dict.value==column.showType?'selected':''} title="${dict.description}">${dict.label}</option>
- </c:forEach>
- </select>
- </td>
- <td>
- <input type="text" name="columnList[${vs.index}].dictType" value="${column.dictType}" maxlength="200" class="input-mini"/>
- </td>
- <td>
- <input type="text" name="columnList[${vs.index}].sort" value="${column.sort}" maxlength="200" class="required input-min digits"/>
- </td>
- </tr>
- </c:forEach>
- </tbody>
- </table>
- </div>
- </fieldset>
- <div class="form-actions">
- <shiro:hasPermission name="gen:genTable:edit"><input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/> </shiro:hasPermission>
- <input id="btnCancel" class="btn" type="button" value="返 回" οnclick="history.go(-1)"/>
- </div>
- </form:form>
- </c:otherwise>
- </c:choose>
- </body>
- </html>
注意其中的name屬性
[html] view plain copy
- name="columnList[${vs.index}].xxx"
在GenTable中是用list來裝的
所以在spring mvc數據綁定的時候可以通過下標的形式來傳值
業務表配置好之後,就是生成代碼,新建生成方案配置,然後輸入一些必須的信息
點擊保存並生成代碼,會調用GenSchemeController中的save()方法,傳入一些參數
然後調用genSchemeService.save()方法進行生成
如果是1的話就生成代碼
generateCode方法如下:
[html] view plain copy
- private String generateCode(GenScheme genScheme){
- StringBuilder result = new StringBuilder();
- // 查詢主表及字段列
- GenTable genTable = genTableDao.get(genScheme.getGenTable().getId());
- genTable.setColumnList(genTableColumnDao.findList(new GenTableColumn(new GenTable(genTable.getId()))));
- // 獲取所有代碼模板
- GenConfig config = GenUtils.getConfig();
- // 獲取模板列表
- List<GenTemplate> templateList = GenUtils.getTemplateList(config, genScheme.getCategory(), false); //獲取所有不包含childTableTemplateList的數據
- List<GenTemplate> childTableTemplateList = GenUtils.getTemplateList(config, genScheme.getCategory(), true);
- // 如果有子表模板,則需要獲取子表列表
- if (childTableTemplateList.size() > 0){
- GenTable parentTable = new GenTable();
- parentTable.setParentTable(genTable.getName());
- genTable.setChildList(genTableDao.findList(parentTable));
- }
- // 生成子表模板代碼
- for (GenTable childTable : genTable.getChildList()){
- childTable.setParent(genTable);
- childTable.setColumnList(genTableColumnDao.findList(new GenTableColumn(new GenTable(childTable.getId()))));
- genScheme.setGenTable(childTable);
- Map<String, Object> childTableModel = GenUtils.getDataModel(genScheme);
- for (GenTemplate tpl : childTableTemplateList){
- result.append(GenUtils.generateToFile(tpl, childTableModel, genScheme.getReplaceFile()));
- }
- }
- // 生成主表模板代碼
- genScheme.setGenTable(genTable);
- Map<String, Object> model = GenUtils.getDataModel(genScheme);
- for (GenTemplate tpl : templateList){
- result.append(GenUtils.generateToFile(tpl, model, genScheme.getReplaceFile()));
- }
- return result.toString();
- }
該方法主要是做一些,獲取模板,然後進行數據綁定等一些工作。其中的
[html] view plain copy
- // 獲取模板列表
- List<GenTemplate> templateList = GenUtils.getTemplateList(config, genScheme.getCategory(), false); //獲取所有不包含childTableTemplateList的數據
- List<GenTemplate> childTableTemplateList = GenUtils.getTemplateList(config, genScheme.getCategory(), true);
getTemplateList方法爲
[html] view plain copy
- /**
- * 根據分類獲取模板列表
- * @param config
- * @param category
- * @param isChildTable 是否是子表
- * @return
- */
- public static List<GenTemplate> getTemplateList(GenConfig config, String category, boolean isChildTable){
- List<GenTemplate> templateList = Lists.newArrayList();
- if (config !=null && config.getCategoryList() != null && category != null){
- for (GenCategory e : config.getCategoryList()){
- if (category.equals(e.getValue())){
- List<String> list = null;
- if (!isChildTable){
- list = e.getTemplate();
- }else{
- list = e.getChildTableTemplate();
- }
- if (list != null){
- for (String s : list){
- if (StringUtils.startsWith(s, GenCategory.CATEGORY_REF)){
- templateList.addAll(getTemplateList(config, StringUtils.replace(s, GenCategory.CATEGORY_REF, ""), false));
- }else{
- GenTemplate template = fileToObject(s, GenTemplate.class);
- if (template != null){
- templateList.add(template);
- }
- }
- }
- }
- break;
- }
- }
- }
- return templateList;
- }
通過標誌位來獲取
[html] view plain copy
- if (!isChildTable){
- list = e.getTemplate();
- }else{
- list = e.getChildTableTemplate();
- }
主表,子表模板,生成文件的方法是GenUtils.generateToFile(tpl, model, genScheme.getReplaceFile())
[html] view plain copy
- /**
- * 生成到文件
- * @param tpl
- * @param model
- * @param isReplaceFile
- * @return
- */
- public static String generateToFile(GenTemplate tpl, Map<String, Object> model, boolean isReplaceFile){
- // 獲取生成文件
- String fileName = Global.getProjectPath() + File.separator
- + StringUtils.replaceEach(FreeMarkers.renderString(tpl.getFilePath() + "/", model),
- new String[]{"//", "/", "."}, new String[]{File.separator, File.separator, File.separator})
- + FreeMarkers.renderString(tpl.getFileName(), model);
- logger.debug(" fileName === " + fileName);
- // 獲取生成文件內容
- String content = FreeMarkers.renderString(StringUtils.trimToEmpty(tpl.getContent()), model);
- logger.debug(" content === \r\n" + content);
- // 如果選擇替換文件,則刪除原文件
- if (isReplaceFile){
- FileUtils.deleteFile(fileName);
- }
- // 創建並寫入文件
- if (FileUtils.createFile(fileName)){
- FileUtils.writeToFile(fileName, content, true);
- logger.debug(" file create === " + fileName);
- return "生成成功:"+fileName+"<br/>";
- }else{
- logger.debug(" file extents === " + fileName);
- return "文件已存在:"+fileName+"<br/>";
- }
- }
生成成功之後,會有如下提示: