1、原理講解javascript
jeesite代碼生成用的是FreeMarker模板引擎結合xml技術來實現的,定義的模板都放在resources/templates/modules/gen下php
一看就知道crud就是基本的增刪改查,dao是數據庫操做,treetable是有關樹方面的模板,其中主要的配置文件就是config.xml,該文件中定義了生成的模板,以及java類型,查詢類型,字段顯示類型等一些數據。css
-
<?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>
-
<childTable>
-
<template>category-ref:dao
</template>
-
</childTable>
定義了子表,初看jeesite的代碼生成,有個困惑的地方就是,通常經過FreeMarker進行代碼生成定義的模板都是ftl格式的,而這裏倒是xml,什麼鬼,難道這裏不是用FreeMarker進行生成的??咱們先來看下xml文件中的內容就清楚了:html
-
<?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 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轉對象:java
-
/**
-
* 生成方案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;
-
}
-
-
}
-
private List
<GenCategory> categoryList; // 代碼模板分類
-
private List
<Dict> javaTypeList; // Java類型
-
private List
<Dict> queryTypeList; // 查詢類型
-
private List
<Dict> showTypeList; // 顯示類型
-
<?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>
其中的代碼模板分類git
經過@XmlElement(name = "category")引用了GenCategory類,其中定義了主子模板
github
-
/**
-
* 生成方案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;
-
}
-
-
}
而其中的數據就是在配置業務表是初始化的一些數據,好比當咱們選擇某一張表時,而後點擊下一步web
就會調用GenTableController中的form方法,把一些配置參數設置進去spring
而後在genTableForm.jsp頁面進行渲染數據庫
-
<%@ 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="返 回" onclick="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="返 回" onclick="history.go(-1)"/>
-
</div>
-
</form:form>
-
</c:otherwise>
-
</c:choose>
-
</body>
-
</html>
name="columnList[${vs.index}].xxx"
因此在spring mvc數據綁定的時候能夠經過下標的形式來傳值
業務表配置好以後,就是生成代碼,新建生成方案配置,而後輸入一些必須的信息
點擊保存並生成代碼,會調用GenSchemeController中的save()方法,傳入一些參數
而後調用genSchemeService.save()方法進行生成
若是是1的話就生成代碼
generateCode方法以下:
-
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();
-
}
該方法主要是作一些,獲取模板,而後進行數據綁定等一些工做。其中的
-
// 獲取模板列表
-
List
<GenTemplate> templateList = GenUtils.getTemplateList(config, genScheme.getCategory(), false); //獲取全部不包含childTableTemplateList的數據
-
List
<GenTemplate> childTableTemplateList = GenUtils.getTemplateList(config, genScheme.getCategory(), true);
getTemplateList方法爲
-
/**
-
* 根據分類獲取模板列表
-
* @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;
-
}
主表,子表模板, 生成文件的方法是GenUtils.generateToFile(tpl, model, genScheme.getReplaceFile())
if (!isChildTable){ list = e.getTemplate(); }else{ list = e.getChildTableTemplate(); }
-
/**
-
* 生成到文件
-
* @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/>";
-
}
-
}