模板和代码生成器
模板
1.模板技術
動態(tài)頁面靜態(tài)化
模板 + 數(shù)據(jù) = 文本
freemarker(.ftl)
velocity(.vm)
velocity模板技術
1.Maven導包
<!-- 代碼生成器模版技術 --> <dependency><groupId>org.apache.velocity</groupId><artifactId>velocity</artifactId><version>1.6</version> </dependency>2.代碼
//使用Velocity需要先創(chuàng)建引擎VelocityEngine ve = new VelocityEngine(); //拿到相應的模板Template template = ve.getTemplate("template/hello.vm”,"UTF-8");//創(chuàng)建Velocity上下文(存放數(shù)據(jù)的容器)VelocityContext velocityContext = new VelocityContext(); velocityContext.put("name","zhangsan");StringWriter writer = new StringWriter();//模板和市局結(jié)合,輸入到一個字符流中template.merge(velocityContext, writer);System.out.println(writer);3.語法
單行注釋:##
多行注釋:#* *#
支持el語法:${name} ======> $name //可以是對象
判斷語句
#if($a>80)xxxxxxxx #elseif($a>20 &&$a<=80)xxxxxxxx #elsexxxxxxxx #end循環(huán)
<ul>#foreach($m in $map.keySet()))<li>$m:$map.get($m)</li>#end </ul>4.輸出文件流
//使用Velocity需要先創(chuàng)建引擎VelocityEngine ve = new VelocityEngine(); //拿到相應的模板Template template = ve.getTemplate("template/hello.vm","UTF-8");VelocityContext context = new VelocityContext();context.put("msg", "小張是個好同志");//準備輸出流File file = new File("template/helloNew.html");FileWriter writer = new FileWriter(file);template.merge(context, writer);writer.close();代碼生成器
1.EasyCode(idea插件)
EasyCode是基于IntelliJ IDEA Ultimate版開發(fā)的一個代碼生成插件,主要通過自定義模板(基于velocity)來生成各種你想要的代碼。通常用于生成Entity(domain)、Dao、Service、Controller。如果你動手能力強還可以用于生成HTML、JS、PHP等代碼。理論上來說只要是與數(shù)據(jù)有關的代碼都是可以生成的。
EasyCode幫助文檔地址(https://gitee.com/makejava/EasyCode/wikis/pages)
2.支持的數(shù)據(jù)庫
1.MySQL
2.SQL Server
3.Oracle
4.PostgreSQL
5.Sqlite
6.Sybase
7.Derby
8.DB2
9.HSQLDB
10.H2
3.安裝
安裝完成重新啟動,File—>setting---->Easy Code ,安裝成功
4.添加數(shù)據(jù)源
5.創(chuàng)建模板
1)Domain模板
2)Query查詢對象
##定義初始變量 #set($tableName = $tool.append($tableInfo.name, "Query")) ##設置文件名 $!callback.setFileName($tool.append($tableName, ".java")) ##設置文件保存的位置(依然是從src開始) $!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/cn/itsource/zx/query"))##拿到首字母小寫的表單 #set($lowerTableInfo = $tool.firstLowerCase($!{tableInfo.name}))##引入相應的包 #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}query; ##使用全局變量實現(xiàn)默認包導入 $!autoImport import cn.itsource.zx.domain.$!{tableInfo.name}; import com.github.wenhao.jpa.Specifications; import org.apache.commons.lang3.StringUtils; import org.springframework.data.jpa.domain.Specification;public class $!{tableInfo.name}Query extends BaseQuery {##注:如果生成的表沒有name,這里會報錯,遇到這種情況請把它刪除private String name;@Overridepublic Specification createSpecification() {//根據(jù)條件把數(shù)據(jù)返回即可return Specifications.<$!{tableInfo.name}>and().like(StringUtils.isNotBlank(name),"name", "%"+name+"%").build();}public String getName() {return name;}public void setName(String name) {this.name = name;}}3) Repoeitory層
##定義初始變量 #set($tableName = $tool.append($tableInfo.name, "Repository")) ##設置回調(diào) $!callback.setFileName($tool.append($tableName, ".java")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/cn/itsource/zx/repository"))##拿到首字母小寫的表單 #set($lowerTableInfo = $tool.firstLowerCase($!{tableInfo.name}))##引入相應的包 #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}repository; import cn.itsource.zx.domain.$!{tableInfo.name};public interface $!{tableInfo.name}Repository extends BaseRepository<$!{tableInfo.name},Long>{}4)IXxxService業(yè)務層接口
##定義初始變量 #set($tableName = $tool.append("I",$tableInfo.name, "Service")) ##設置回調(diào) $!callback.setFileName($tool.append($tableName, ".java")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/cn/itsource/zx/service"))##拿到首字母小寫的表單 #set($lowerTableInfo = $tool.firstLowerCase($!{tableInfo.name}))##引入相應的包 #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;import cn.itsource.zx.domain.$!{tableInfo.name};public interface I$!{tableInfo.name}Service extends IBaseService<$!{tableInfo.name},Long> {}5)XxxService
##定義初始變量 #set($tableName = $tool.append($tableInfo.name, "ServiceImpl")) ##設置回調(diào) $!callback.setFileName($tool.append($tableName, ".java")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/cn/itsource/zx/service/impl"))##拿到首字母小寫的表單 #set($lowerTableInfo = $tool.firstLowerCase($!{tableInfo.name}))##引入相應的包 #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;import cn.itsource.zx.domain.$!{tableInfo.name}; import cn.itsource.zx.repository.$!{tableInfo.name}Repository; import cn.itsource.zx.service.I$!{tableInfo.name}Service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;@Service public class $!{tableInfo.name}ServiceImpl extends BaseServiceImpl<$!{tableInfo.name},Long> implements I$!{tableInfo.name}Service {@Autowiredprivate $!{tableInfo.name}Repository $!{lowerTableInfo}Repository};}6)Test基本測試生成
##定義初始變量 #set($tableName = $tool.append($tableInfo.name, "ServiceTest")) ##設置回調(diào) $!callback.setFileName($tool.append($tableName, ".java")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/test/java/cn/itsource/zx/service"))##拿到首字母小寫的表單 #set($lowerTableInfo = $tool.firstLowerCase($!{tableInfo.name}))##引入相應的包 #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;import cn.itsource.zx.domain.$!{tableInfo.name}; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired;import java.util.List;public class $!{tableInfo.name}ServiceTest extends BaseServiceTest {@Autowiredprivate I$!{tableInfo.name}Service $!{lowerTableInfo}Service;@Testpublic void findAll(){System.out.println($!{lowerTableInfo}Service);System.out.println($!{lowerTableInfo}Service.getClass());List<$!{tableInfo.name}> $!{lowerTableInfo}s = $!{lowerTableInfo}Service.findAll();for ($!{tableInfo.name} $!{lowerTableInfo} : $!{lowerTableInfo}s) {System.out.println($!{lowerTableInfo});}} }7).XxxController:控制層
##定義初始變量 #set($tableName = $tool.append($tableInfo.name, "Controller")) ##設置回調(diào) $!callback.setFileName($tool.append($tableName, ".java")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/cn/itsource/zx/web/controller"))##拿到首字母小寫的表單 #set($lowerTableInfo = $tool.firstLowerCase($!{tableInfo.name}))##引入相應的包 #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}web.controller;import cn.itsource.zx.common.UiPage; import cn.itsource.zx.domain. $!{tableInfo.name}; import cn.itsource.zx.query. $!{tableInfo.name}Query; import cn.itsource.zx.service.I $!{tableInfo.name}Service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap; import java.util.Map;@Controller @RequestMapping("/$!{lowerTableInfo}") public class $!{tableInfo.name}Controller extends BaseController {@Autowiredprivate I$!{tableInfo.name}Service $!{lowerTableInfo}Service;@RequestMapping("/index")public String index() {//根據(jù)配置,這里會跳到/WEB-INF/views/$!{lowerTableInfo}/$!{lowerTableInfo}.jsp頁面return "$!{lowerTableInfo}/$!{lowerTableInfo}";}//查詢分頁數(shù)據(jù)@RequestMapping("/page")@ResponseBodypublic UiPage page($!{tableInfo.name}Query query){return new UiPage($!{lowerTableInfo}Service.findPageByQuery(query));}//這里準備一個方法,所有方法執(zhí)行前都會執(zhí)行它@ModelAttribute("edit $!{tableInfo.name}")public $!{tableInfo.name} beforeEdit(Long id, String cmd){//有id的時候-> 修改功能if(id!=null && "update".equals(cmd)) {$!{tableInfo.name} $!{lowerTableInfo} = $!{lowerTableInfo}Service.findOne(id);//把這個要修改的關聯(lián)對象設置為null,可以解決n-to-n的問題return $!{lowerTableInfo};}return null;}//添加@RequestMapping("/save")@ResponseBodypublic Map<String,Object> save($!{tableInfo.name} $!{lowerTableInfo}){return saveOrUpdate($!{lowerTableInfo});}//修改@RequestMapping("/update")@ResponseBodypublic Map<String,Object> update(@ModelAttribute("edit $!{tableInfo.name}") $!{tableInfo.name} $!{lowerTableInfo}){return saveOrUpdate($!{lowerTableInfo});}//添加或者修改private Map<String,Object> saveOrUpdate( $!{tableInfo.name} $!{lowerTableInfo}){Map<String,Object> map = new HashMap<>();try {$!{lowerTableInfo}Service.save($!{lowerTableInfo});map.put(SUCCESS, true);} catch (Exception e) {e.printStackTrace();map.put(SUCCESS, false);map.put("msg", e.getMessage());}return map;}/*** 返回的結(jié)果:{SUCCESS:true,msg:"原因..."}* @param id* @return*/@RequestMapping("/delete")@ResponseBodypublic Map delete(Long id){Map<String,Object> map = new HashMap<>();try {$!{lowerTableInfo}Service.delete(id);map.put(SUCCESS, true);} catch (Exception e) {e.printStackTrace();map.put(SUCCESS, false);map.put("msg", e.getMessage());}return map;} }8)xxx.jsp 頁面展示
##定義初始變量 #set($tableName = $tool.append($tableInfo.name)) ##拿到首字母小寫的表單 #set($lowerTableInfo = $tool.firstLowerCase($!{tableInfo.name}))##設置回調(diào) $!callback.setFileName($tool.append($lowerTableInfo, ".jsp")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/main/webapp/WEB-INF/views/${lowerTableInfo}"))##實現(xiàn)列進行排除 #set($temp = $tool.newHashSet("id")) #foreach($item in $temp)#set($newList = $tool.newArrayList())#foreach($column in $tableInfo.fullColumn)#if($column.name!=$item)##帶有反回值的方法調(diào)用時使用$tool.call來消除返回值$tool.call($newList.add($column))#end#end ##重新保存$tableInfo.setFullColumn($newList) #end<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>$!{lowerTableInfo}管理</title><%@include file="/WEB-INF/views/head.jsp" %><script type="text/javascript" src="/js/model/$!{lowerTableInfo}.js"></script> </head> <body> <table id="$!{lowerTableInfo}Grid" class="easyui-datagrid" data-options="fit:true,fixed:true,fitColumns:true,toolbar:'#tb',singleSelect:true,onRowContextMenu:showMenu"url="/$!{lowerTableInfo}/page"iconCls="icon-save"enableHeaderClickMenu="true"rownumbers="true" pagination="true"><thead>##這里是遍歷所有相應的字段<tr>#foreach($column in $tableInfo.fullColumn)<th width="20" field="$column.name" sortable="true">$column.name</th>#end</tr></thead> </table> <div id="tb" style="padding:5px;height:auto"><!-- 這部分是加上增刪改的按鍵:現(xiàn)在沒有功能,我們先不管它 --><div style="margin-bottom:5px"><a href="#" data-method="add" class="easyui-linkbutton" iconCls="icon-add" plain="true">添加</a><a href="#" data-method="edit" class="easyui-linkbutton" iconCls="icon-edit" plain="true">修改</a><a href="#" data-method="del" class="easyui-linkbutton" iconCls="icon-remove" plain="true">刪除</a></div><!-- 這部門是查詢的功能 --><div><form id="searchForm" action="/$!{lowerTableInfo}/download" method="post">名稱: <input name="name" class="easyui-textbox" style="width:80px;height:32px"></form></div> </div><!-- 彈出相應的功能框 --> <div id="$!{lowerTableInfo}Dialog" class="easyui-dialog" title="數(shù)據(jù)操作" data-options="closed:true,modal:true" style="width:400px;padding:10px"><form id="$!{lowerTableInfo}Form" method="post"><input id="$!{lowerTableInfo}Id" type="hidden" name="id"><table cellpadding="5">#foreach($column in $tableInfo.fullColumn)<tr><td>$column.name:</td><td><input class="easyui-validatebox" type="text" name="$column.name"></input></td></tr>#end</table><div style="text-align:center;padding:5px"><a href="javascript:void(0)" class="easyui-linkbutton" data-method="save">提交</a><a href="javascript:void(0)" class="easyui-linkbutton" "$('#$!{lowerTableInfo}Dialog').dialog('close')">取消</a></div></form> </div><div id="gridMenu" class="easyui-menu" style="width:120px;"><div data-options="iconCls:'icon-add'" data-method="add" >添加</div><div data-options="iconCls:'icon-edit'" data-method="edit">修改</div><div data-options="iconCls:'icon-remove'" data-method="del">刪除</div> </div></body> </html>9)js
##定義初始變量 #set($tableName = $tool.append($tableInfo.name)) ##拿到首字母小寫的表單 #set($lowerTableInfo = $tool.firstLowerCase($!{tableInfo.name}))##設置回調(diào) $!callback.setFileName($tool.append($lowerTableInfo, ".js")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/main/webapp/js/model"))$(function () {//這里我們把很多會常用到的元素進行一個抽取var searchForm = $("#searchForm");var $!{lowerTableInfo}Grid = $("#$!{lowerTableInfo}Grid");var $!{lowerTableInfo}Dialog = $("#$!{lowerTableInfo}Dialog");var $!{lowerTableInfo}Form = $("#$!{lowerTableInfo}Form");//只要a標簽中有data-method屬性,咱們就給它添加事件// 執(zhí)行對應的itsource中的事件$("*[data-method]").on("click",function () {itsource[$(this).data("method")]();})window.itsource={search:function () {//需要先引入 jquery.jdirk.js 才可以使用這個方法var params = searchForm.serializeObject();$!{lowerTableInfo}Grid.datagrid('load',params);},add:function () {//隱藏有data-save屬性的元素$("*[data-save]").show();//禁用有data-save屬性的input元素的驗證功能$("*[data-save] input").validatebox("enableValidation");//彈出表單窗口$!{lowerTableInfo}Form.form("clear");//清除數(shù)據(jù)$!{lowerTableInfo}Dialog.dialog("center").dialog("open");},edit:function () {//彈出表單窗口//選中了某一條數(shù)據(jù)才刪除var row = $!{lowerTableInfo}Grid.datagrid("getSelected");if(row) {//隱藏有data-save屬性的元素$("*[data-save]").hide();//禁用有data-save屬性的input元素的驗證功能$("*[data-save] input").validatebox("disableValidation");$!{lowerTableInfo}Form.form("clear");//清除數(shù)據(jù)$!{lowerTableInfo}Dialog.dialog("center").dialog("open");//為form加載數(shù)據(jù)$("#$!{lowerTableInfo}Form").form("load",row);}else{$.messager.alert('提示信息','請選擇一行再進行修改!','info');}},del:function () {//拿到選中的這條數(shù)據(jù)var row = $!{lowerTableInfo}Grid.datagrid("getSelected");if(row){$.messager.confirm('確認框', '確定要狠心刪除我么?', function(r){if (r){//進行刪除$.get("/$!{lowerTableInfo}/delete",{id:row.id},function (result) {if(result.success){$('#$!{lowerTableInfo}Grid').datagrid('reload');}else{//alert("刪除失敗");$.messager.alert('提示信息','刪除失敗!,原因:'+result.msg,"error");}})}});}else{$.messager.alert('提示信息','請選擇一行再進行刪除!','info');}},save:function () {var url = "/$!{lowerTableInfo}/save";var id = $("#$!{lowerTableInfo}Id").val();if(id){url = "/$!{lowerTableInfo}/update?cmd=update";}$!{lowerTableInfo}Form.form('submit', {url:url,onSubmit: function(){//做驗證return $("#$!{lowerTableInfo}Form").form("validate");},success:function(data){var result = JSON.parse(data);//轉(zhuǎn)成相應的json數(shù)據(jù)if(result.success) {$('#$!{lowerTableInfo}Grid').datagrid('reload');}else{$.messager.alert('提示信息','操作失敗!,原因:'+result.msg,"error");}$!{lowerTableInfo}Dialog.dialog('close');}})}} })總結(jié)
- 上一篇: FastTack
- 下一篇: 计算机行业高级职称考试大纲,【2017年