Velocity及基于Velocity的代码生成器

Velocity

简介:

Velocity是基于Java的模板引擎,它允许页面设计者引用Java中定义的方法。页面设计者和Java开发者能够同时使用MVC的模式开发网站,这样网页设计者能够把精力放在页面的设计上,程序员也可以把精力放在代码开发上。


Demo:

//        创建模板上下文对象
        VelocityContext context=new VelocityContext();
//        根据模板路径获得一个模板
//        默认路径是当前项目根目录
        Template template=Velocity.getTemplate("hello.vm","utf-8");
//        给上下文添加数据,
        context.put("name", "渣渣辉");
//        获取输出流
        StringWriter writer = new StringWriter();
//        将输出流和模板上下文合并
        template.merge(context, writer);
//        输出
        System.out.println(writer);

语法:

注释:

##单行注释

#*

​ 多行注释

*#

声明变量:

##声明变量
#set($username="账号")
#set($age=18)
#set($sex=true)


##输出变量
${username}
${age}
${sex}

空值处理:

如果一个变量 x x x 有 值 的 时 候 , 就 会 取 出 这 个 值 , 如 果 没 有 值 , 他 会 将 {xxx}有值的时候,就会取出这个值,如果没有值,他会将 xxx{xxx}当做文本来处理,直接输出。

解决:加上!

例:$!{name}

调用方法:

		//传入一个时间对象
        context.put("date", new Date());
		//传入一个时间格式化对象
        context.put("simpleDate", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

velocity:

##调用刚刚传入的时间对象
$!{date}
## 调用方法
$!{simpleDate.format($date)}

输出结果:
在这里插入图片描述

获取对象的属性:

//        传入一个Employee对象
        Employee e=new Employee("用户名","密码","邮箱","头像",22,new Department(11L,"部门名称"));
        context.put("employee", e);

velocity:

##获取对象属性
$!{employee.username}
$!{employee.password}
$!{employee.email}
$!{employee.headImage}
$!{employee.department}

输出结果:

在这里插入图片描述

遍历:

数组
//        传入一个字符串数组
        String[] strs={"张三","刘六","赵五","麻子","王二","李四"};
        context.put("strs", strs);

velocity:

##遍历数组
#foreach($str in $strs)
    我是:$!{str}
#end

输出结果:

在这里插入图片描述

List:
//        传入一个List
        List<String> citys = new ArrayList<>();
        citys.add("北京");
        citys.add("上海");
        citys.add("广州");
        citys.add("深圳");
        context.put("citys", citys);

velocity:

##遍历集合
#foreach($city in $citys)
    $!{city}
#end

结果:

在这里插入图片描述

Set:
//        传入一个Map
        Map<String, String> map = new HashMap<String, String>();
        map.put("姓名", "张三丰");
        map.put("性别", "男");
        map.put("年龄", "108");
        map.put("门派", "武当");
        context.put("map", map);

velocity:

##遍历Map
#foreach($key in $map.keySet())
    $!{key}:$!{map.get($key)}
#end

结果:

在这里插入图片描述

条件分支:

##条件分支
#set($age=40)
#if($age<18)
    你还是未成年
    #elseif($age<30)
    青年
    #elseif($age<50)
    中年
    #else
    老年
#end

EasyCode:

简介:

EasyCode是IDEA的一个插件,它是完全基于Java代码开发出来的插件,基于IDEA工具中的另一个插件(Database)开发出来的插件,也就是说Database插件中支持的那些数据库产品,EasyCode都支持也就是说你必须先配置了Database插件中的DataSource之后才能使用EasyCode插件。EasyCode是基于Apache的Velocity模板语法来制作模板,用来生成代码文件(HTML、JS、CSS、Java、XML)。

设置EasyCode:

使用EasyCode之前需要配置Idea-DataSource的database;

点开EasyCode的设置,TypeMapper,修改对应的数据映射规则。左边是数据库的数据类型,右边是映射到Java的类型。

在这里插入图片描述

添加模板分组

在这里插入图片描述

基于EasyCode实现代码生成器。

  • Spring
  • SpringMVC
  • SpringDataJpa
  • JSP
  • EasyUI

EasyCode API介绍:

 属性
    $author 设置中的作者 java.lang.String
    $encode 设置的编码 java.lang.String
    $modulePath 选中的module路径 java.lang.String
    $projectPath 项目绝对路径 java.lang.String
对象
$tableInfo 表对象
    obj 表原始对象 com.intellij.database.model.DasTable
    name 表名(转换后的首字母大写)java.lang.String
    comment 表注释 java.lang.String
    fullColumn 所有列 java.util.List<ColumnInfo>
    pkColumn 主键列 java.util.List<ColumnInfo>
    otherColumn 其他列 java.util.List<ColumnInfo>,除主键以外的列
    savePackageName 保存的包名 java.lang.String
    savePath 保存路径 java.lang.String
    saveModelName 保存的model名称 java.lang.String
columnInfo 列对象
    obj 列原始对象 com.intellij.database.model.DasColumn
    name 列名(首字母小写) java.lang.String
    comment 列注释 java.lang.String
    type 列类型(类型全名) java.lang.String
    shortType 列类型(短类型) java.lang.String
    custom 是否附加列 java.lang.Boolean
    ext 附加字段(Map类型) java.lang.Map<java.lang.String, java.lang.Object>
$tableInfoList java.util.List<TableInfo>所有选中的表
$importList 所有需要导入的包集合 java.util.Set<java.lang.String>

回调
&callback        setFileName(String) 设置文件储存名字
    setSavePath(String) 设置文件储存路径,默认使用选中路径

工具
$tool
    firstUpperCase(String name) 首字母大写方法
    firstLowerCase(String name) 首字母小写方法
    getClsNameByFullName(String fullName) 通过包全名获取类名
    getJavaName(String name) 将下划线分割字符串转驼峰命名(属性名)
    getClassName(String name) 将下划线分割字符串转驼峰命名(类名)
    append(Object... objs) 多个数据进行拼接
    newHashSet(Object... objs) 创建一个HashSet对象
    newArrayList(Object... objs) 创建一个ArrayList对象
    newLinkedHashMap() 创建一个LinkedHashMap()对象
    newHashMap() 创建一个HashMap()对象
    getField(Object obj, String fieldName) 获取对象的属性值,可以访问任意修饰符修饰的属性.配合debug方法使用.
    call(Object... objs) 空白执行方法,用于调用某些方法时消除返回值
    debug(Object obj) 调式方法,用于查询对象结构.可查看对象所有属性与public方法
    serial() 随机获取序列化的UID
    service(String serviceName, Object... param)远程服务调用
$time
    currTime(String format) 获取当前时间,指定时间格式(默认:yyyy-MM-dd HH:mm:ss)

01-domain:

##引入宏定义
$!define

##使用宏定义设置回调(保存位置与文件后缀)
#save("/main/java/top/young/domain", ".java")

##使用宏定义设置包后缀
#setPackageSuffix("domain")

##使用全局变量实现默认包导入
$!autoImport
import javax.persistence.*;

##使用宏定义实现类注释信息
#tableComment("domain实体类")
@Entity
public class $!{tableInfo.name} extends BaseDomain {
    
#foreach($column in $tableInfo.otherColumn)
    #if(${column.comment})//${column.comment}#end

    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end

#foreach($column in $tableInfo.otherColumn)
##使用宏定义实现get,set方法
    #getSetMethod($column)
#end

}

02-Query

##引入宏定义
$!define

##使用宏定义设置回调(保存位置与文件后缀)
#save("/main/java/top/young/query", "Query.java")

##使用宏定义设置包后缀
#setPackageSuffix("query")

##使用全局变量实现默认包导入
$!autoImport
import com.github.wenhao.jpa.Specifications;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import top.young.domain.$!{tableInfo.name};
##使用宏定义实现类注释信息
#tableComment("$!{tableInfo.name}表的Query类}")

public class $!{tableInfo.name}Query extends BaseQuery<$!{tableInfo.name}> {
    private String name;
    @Override
    public Specification<$!{tableInfo.name}> getSpecification() {
        return Specifications.<$!{tableInfo.name}>and()
                .like(StringUtils.isNoneBlank(this.name),"name", "%" + this.name + "%")
                .build();
    }

    @Override
    public Sort getSort() {
        return this.getDefaultSort();
    }

    @Override
    public Pageable getPageable() {
        return new PageRequest(this.getJpaPageNumber(), this.getPageSize(), this.getSort());
    }
    
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
}

03-repository

##定义初始变量
#set($className = $tool.append("I",$tableInfo.name, "Repository"))
##文件名
$!callback.setFileName($tool.append($className, ".java"))
##设置保存路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/top/young/repository"))



#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}repository;


import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
import java.util.List;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层
 *
 * @author $!author
 * @since $!time.currTime()
 */
public interface $!{className}  extends IBaseRepository<$!{tableInfo.name},Long>{

}

04-service:

##定义初始变量
#set($className = $tool.append("I",$tableInfo.name, "Service"))
##文件名
$!callback.setFileName($tool.append($className, ".java"))
##设置保存路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/top/young/service"))



#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;


import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
import java.util.List;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表service层
 *
 * @author $!author
 * @since $!time.currTime()
 */
public interface $!{className}   extends IBaseService<$!{tableInfo.name}> {

}

05-serviceImpl

##定义初始变量
#set($className = $tool.append($tableInfo.name, "ServiceImpl"))
##文件名
$!callback.setFileName($tool.append($className, ".java"))
##设置保存路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/top/young/service/impl"))



#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;


import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import $!{tableInfo.savePackageName}.repository.I$!{tableInfo.name}Repository;
import $!{tableInfo.savePackageName}.service.I$!{tableInfo.name}Service;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表,service实现类
 *
 * @author $!author
 * @since $!time.currTime()
 */
 @Service
 @Transactional(readOnly = true)
public class $!{className} extends BaseServiceImpl<$!{tableInfo.name}> implements I$!{tableInfo.name}Service  {
    @Autowired
    private I$!{tableInfo.name}Repository  $tool.firstLowerCase($tableInfo.name)Repository;
}

06-controller

##定义初始变量
#set($className = $tool.append($tableInfo.name, "Controller"))
#set($small=$tool.firstLowerCase($tableInfo.name))
##文件名
$!callback.setFileName($tool.append($className, ".java"))
##设置保存路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/top/young/controller"))



#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller;


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 top.young.domain.$!{tableInfo.name};
import top.young.query.$!{tableInfo.name}Query;
import top.young.service.I$!{tableInfo.name}Service;
import top.young.utils.PageInfo;
import top.young.utils.Result;


/**
 * $!{tableInfo.comment}($!{tableInfo.name})表,controller类。
 *
 * @author $!author
 * @since $!time.currTime()
 */

@Controller
@RequestMapping("/$!{small}")
public class $!{tableInfo.name}Controller {
    @Autowired
    private I$!{tableInfo.name}Service service;

    /**
     * 跳转到主页
     * @return
     */
    @RequestMapping("/index")
    public String index(){
        return "$!{small}/$!{small}";
    }

    /**
     * 获得分页列表
     * @param query
     * @return
     */
    @RequestMapping("/getPage")
    @ResponseBody
    public PageInfo getPage($!{tableInfo.name}Query query){
        return service.FindByPage(query);
    }


    /**
     * 批量删除
     * @param ids
     * @return
     */
    @RequestMapping("/delete")
    @ResponseBody
    public Result delete$!{tableInfo.name}(String ids){
        Result result = new Result(200, "删除成功");
        try {
            service.delete(ids);
        }catch (Exception e){
            result.setStatusCode(500);
            e.printStackTrace();
            result.setMsg("删除失败,错误代码:"+e.getMessage());
        }
        return result;
    }

    /**
     * 查询单个
     * @param id
     * @return
     */
    @RequestMapping("/find")
    @ResponseBody
    public $!{tableInfo.name} FindOne(Long id){
        return service.findOne(id);
    }

    /**
     * 新增
     * @param $!{small}
     * @return
     */
    @RequestMapping("/add")
    @ResponseBody
    public Result add$!{tableInfo.name}($!{tableInfo.name} $!{small}){
        Result result = new Result(200, "新增成功");
        try {
            service.save($!{small});
        }catch (Exception e){
            result.setStatusCode(500);
            e.printStackTrace();
            result.setMsg("新增失败,错误代码:"+e.getMessage());
        }
        return result;
    }

    /**
     * 更新
     * @param $!{small}
     * @return
     */
    @RequestMapping("/update")
    @ResponseBody
    public Result Update$!{tableInfo.name}(@ModelAttribute("update") $!{tableInfo.name} $!{small}){
        Result result = new Result(200, "修改成功");
        try {
            service.update($!{small});
        }catch (Exception e){
            result.setStatusCode(500);
            e.printStackTrace();
            result.setMsg("修改失败,错误代码:"+e.getMessage());
        }
        return result;
    }

    /**
     * 高级查询
     * @param query
     * @return
     */
    @RequestMapping("/search")
    @ResponseBody
    public PageInfo<$!{tableInfo.name}> doSearch($!{tableInfo.name}Query query){
        return service.FindByPage(query);
    }

    /**
     * 更新前的查询
     * @param action
     * @param id
     * @return
     */
    /*@ModelAttribute("update")
    public $!{tableInfo.name} beforeUpdate(String action,Long id){
        $!{tableInfo.name} $!{small}=null;
        if("update".equals(action)&&id!=null){
            $!{small} = service.findOne(id);
            $!{small}.setDepartment(null);
        }
        return employee;
    }*/
}

07-JS

##定义初始变量
#set($className = $tool.append($tableInfo.name, "ServiceImpl"))
##文件名
$!callback.setFileName($tool.append($className, ".java"))
##设置保存路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/top/young/service/impl"))
#set($small=$tool.firstLowerCase($tableInfo.name))
#set($big=$tableInfo.name)

$(function () {

    $(".easyui-linkbutton[data-method]").on("click", function () {
        var method = $(this).data("method");
        operation[method]();
    })

    $("#diaTool>#save").on("click");
});

var operation = {
    add: function () {
        $("#ff").form("clear");
        $("#dialog").dialog("center").dialog("setTitle", "保存").dialog("open");
        var d = $("#department").combobox("getData");
        $("#department").combobox("select", d[0].id);
    },
    edit: function () {
        $("#ff").form("clear");
        var edit = $("#tool #edit");
        if (edit.hasClass("l-btn-disabled")) {
            return false;
        }
        var checked = $("#grid").datagrid("getChecked");
        $.getJSON('/$!{small}/find', {id: checked[0].id}, function (data) {
            $("#ff").form("reset").form("load", data);
            if (data.department) {
                $("#department").combobox("setValue", data.department.id);
            }

        });

        $("#dialog").dialog("center").dialog("setTitle", "保存").dialog("open");
    },
    remove: function () {
        var remove = $("#tool #remove");
        if (remove.hasClass("l-btn-disabled")) {
            return false;
        }
        $.messager.confirm('确认删除?', '你确定要删除吗?', function (r) {
            if (r) {
                var checked = $("#grid").datagrid("getChecked");
                var ids = new Array();
                $.each(checked, function (i, o) {
                    ids.push(o.id);
                });
                $.post('/$!{small}/delete', {ids: ids.toString()}, function (result) {
                    if (result.statusCode == 200) {
                        //刷新表单
                        $("#grid").datagrid("reload");
                        // datagrid.datagrid("reload");
                        $("#tool>#remove").linkbutton({disabled: true});
                        $("#tool>#edit").linkbutton({disabled: true});

                    } else {
                        $.messager.alert('删除失败' + result.statusCode, result.msg);
                    }
                });
            }
        });

    },
    search: function () {
        var para = $("#searchFrom").serializeObject();
        console.log(para)
        $("#grid").datagrid("load", para);
    },
    close:function () {
        $('#dialog').dialog('close');
    },
    save: function () {
        var para = $("#ff").serializeObject();
        console.log(para)
        var url = "/$!{small}/add";
        if (para.id) {
            url = "/$!{small}/update";
            para.action = 'update';
        }
        console.log(url);
        $.post(url, para, function (result) {
            if (result.statusCode == 200) {
                //刷新表单
                $("#grid").datagrid("reload");
                $("#dialog").dialog("close");
            } else {
                $.messager.alert('操作失败' + result.statusCode, result.msg);
            }
        });
    },

}

function formatterDept(r, v, i) {
    return r ? r.name : "";
}

function formatterSex(r, v, i) {
    return r ? "男" : "女";
}

function checkMethod(index, row) {
    var checked = $("#grid").datagrid("getChecked");
    if (checked.length >= 1) {
        $("#tool #remove").linkbutton({disabled: false});
    } else {
        $("#tool #remove").linkbutton({disabled: true});
    }
    if (checked.length == 1) {
        $("#tool #edit").linkbutton({disabled: false});
    } else {
        $("#tool #edit").linkbutton({disabled: true});
    }
}



08-JSP

##定义初始变量
#set($small=$tool.firstLowerCase($tableInfo.name))
#set($className = $tool.append($tableInfo.name))
##文件名
$!callback.setFileName($tool.append($small, ".jsp"))
##设置保存路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/webapp/WEB-INF/views/",$small))
#set($big=$tableInfo.name)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$!{big}</title>
    <%@include file="../common.jsp" %>

    <script src="/static/JS/$!{small}/$!{small}.js"></script>
</head>
<body>


<table id="grid" class="easyui-datagrid" data-options="
    url:'/$!{small}/getPage',
    fitColumns:true,
    striped:true,
    pagination:true,
    toolbar:'#tool',
    onCheck:checkMethod,
	onUncheck:checkMethod,
	onCheckAll:checkMethod,
	onUncheckAll:checkMethod,
    fit:true
">
    <thead>
    <tr>
        <th style="width: 5%" data-options="field:'$!{tableInfo.pkColumn}',checkbox:true">编号</th>
#foreach($column in $tableInfo.otherColumn)
      <th style="width: 20%" data-options="field:'$!{column.name}'">$!{big}</th>
#end

    </tr>
    </thead>
</table>

<div id="tool">
    <form id="searchFrom">
        <a id="add" href="#" class="easyui-linkbutton" data-method="add" data-options="iconCls:'icon-save'">添加</a>
        <a id="edit" href="#" class="easyui-linkbutton" data-method="edit"
           data-options="iconCls:'icon-edit',disabled:true">编辑</a>
        <a id="remove" href="#" class="easyui-linkbutton" data-method="remove"
           data-options="iconCls:'icon-remove',disabled:true">删除</a>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <input class="easyui-textbox" data-options="iconCls:'icon-search',width:200,prompt:'请输入需要搜索的用户名'" type="text"
               name="username" id="search-username"></input>
        <input class="easyui-textbox" data-options="width:130,prompt:'请输入年龄'" type="number" name="age1"
               id="age1"></input>至
        <input class="easyui-textbox" data-options="width:130,prompt:'请输入年龄'" type="number" name="age2"
               id="age2"></input>
        <a id="search" href="#" class="easyui-linkbutton" data-method="search"
           data-options="iconCls:'icon-search'">搜索</a>
    </form>
</div>
<div id="diaTool">
    <a id="save"  data-method="save" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-save'">保存</a>
    <a id="cancel" οnclick="" href="#" class="easyui-linkbutton"
       data-method="close" data-options="iconCls:'icon-cancel'">关闭</a>
</div>
<div id="dialog" style="width:350px;height:350px" class="easyui-dialog"
     data-options="
            iconCls:'icon-save',
            resizable:true,
            modal:true,
            closed:true,
            buttons:'#diaTool',
">
    <form id="ff" method="post">
        <table id="formTable" cellpadding="5">
        <input type="hidden" name="$!{tableInfo.pkColumn}"/>
#foreach($column in $tableInfo.otherColumn)
    <tr>
        <td>$tool.firstUpperCase($column.name):</td>
        <td><input style="width: 250px" class="easyui-textbox" type="text" name="$!{column.name}" id="$!{column.name}"
              ></input></td>
    </tr>  
#end   

           


        </table>
    </form>
</div>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值