模板技术
模板技术就是:数据+模板=输出文本
自己过代码来实现模板
- 首先创建一个hello.vm的文件
<html>
<head></head>
<body>
${name},你好啊!
</body>
</html>
- 然后通过代码实现
package com.xpc.velocity;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.junit.Test;
import java.io.FileWriter;
public class VelocityTest {
@Test
public void test() throws Exception{
//创建一个Velocity引擎
VelocityEngine ve = new VelocityEngine();
//获到到相应的模板
Template template = ve.getTemplate("velocity/hello.vm","utf-8");
//创建模板上下文(装数据的东西)
VelocityContext velocityContext = new VelocityContext();
velocityContext.put("name", "pc");
//准备输出的位置
FileWriter fileWriter = new FileWriter("velocity/hello.txt");
//数据 + 模板 = 输入文本
template.merge(velocityContext, fileWriter);
fileWriter.close();
//System.out.println(fileWriter.toString());
}
}
最后就会生成以后如下图所示类容的hello.txt文件
在Idea中装一个EasyCode插件,就可以用模板技术做代码生成了
- domain
##引入宏定义
$!define
##使用宏定义设置回调(保存位置与文件后缀)
#save("/main/java/com/xpc/domain", ".java")
##使用宏定义设置包后缀
#setPackageSuffix("domain")
##使用全局变量实现默认包导入
$!autoImport
import javax.persistence.*;
#*##使用宏定义实现类注释信息
#tableComment("实体类")*#
@Entity
@Table(name = "$!{tableInfo.obj.name}")
public class $!{tableInfo.name} extends BaseDomain {
#*private static final long serialVersionUID = $!tool.serial();*#
#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
}
- query
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Query"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/xpc/query"))
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}query;
##使用全局变量实现默认包导入
$!autoImport
import com.github.wenhao.jpa.Specifications;
import com.xpc.domain.${tableInfo.name};
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.jpa.domain.Specification;
public class ${tableInfo.name}Query extends BaseQuery{
private String name;
@Override
public Specification createSpec() {
Specification<${tableInfo.name}> specification = Specifications.<${tableInfo.name}>and()
.like(StringUtils.isNotBlank(name),"name", "%"+name+"%")
.build();
return specification;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- repository
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Repository"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/xpc/repository"))
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}repository;
##使用全局变量实现默认包导入
$!autoImport
import com.xpc.domain.${tableInfo.name};
public interface ${tableInfo.name}Repository extends BaseRepository<${tableInfo.name},Long>{
}
- service
##定义初始变量
#set($tableName = $tool.append("I",$tableInfo.name, "Service"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/xpc/service"))
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;
##使用全局变量实现默认包导入
$!autoImport
import com.xpc.domain.${tableInfo.name};
public interface ${tableName} extends IBaseService<${tableInfo.name},Long> {
}
- serviceimpl
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "ServiceImpl"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/xpc/service/impl"))
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;
##使用全局变量实现默认包导入
$!autoImport
import com.xpc.domain.${tableInfo.name};
import com.xpc.repository.${tableInfo.name}Repository;
import com.xpc.service.I${tableInfo.name}Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ${tableName} extends BaseServiceImpl<${tableInfo.name},Long> implements I${tableInfo.name}Service {
@Autowired
private ${tableInfo.name}Repository ${tableInfo.obj.name}Repository;
}
- controller
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Controller"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/xpc/web/controller"))
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}web.controller;
##使用全局变量实现默认包导入
$!autoImport
import com.xpc.common.JsonResult;
import com.xpc.common.UiPage;
import com.xpc.domain.${tableInfo.name};
import com.xpc.query.${tableInfo.name}Query;
import com.xpc.service.I${tableInfo.name}Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
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;
@Controller
@RequestMapping("/${tableInfo.obj.name}")
public class ${tableInfo.name}Controller extends BaseController {
@Autowired
private I${tableInfo.name}Service ${tableInfo.obj.name}Service;
@RequestMapping("/index")
public String index() {
//根据配置,这里会跳到/WEB-INF/views/${tableInfo.obj.name}/${tableInfo.obj.name}.jsp页面
return "${tableInfo.obj.name}/${tableInfo.obj.name}";
}
@RequestMapping("/page")
@ResponseBody
public UiPage page(${tableInfo.name}Query query){
Page page = ${tableInfo.obj.name}Service.findPageByQuery(query);
UiPage uiPage = new UiPage(page);
return uiPage;
}
/**
*ModelAttribute:路径访问Controller的每个方法,都会先执行它里面的代码
*/
@ModelAttribute("edit${tableInfo.name}")
public ${tableInfo.name} beforeEdit(Long id,String cmd){
if(id!=null && "_update".equals(cmd)){
//修改才执行这个代码
${tableInfo.name} db${tableInfo.name} = ${tableInfo.obj.name}Service.findOne(id);
//解决n-to-n的问题,把关联对象设置为null
//db${tableInfo.name}.setDepartment(null);
return db${tableInfo.name};
}
return null;
}
//添加
@RequestMapping("/save")
@ResponseBody
public JsonResult save(${tableInfo.name} ${tableInfo.obj.name}){
try {
${tableInfo.obj.name}Service.save(${tableInfo.obj.name});
return new JsonResult();
} catch (Exception e) {
e.printStackTrace();
return new JsonResult(false,e.getMessage());
}
}
//修改
@RequestMapping("/update")
@ResponseBody
public JsonResult update(@ModelAttribute("edit${tableInfo.name}")${tableInfo.name} ${tableInfo.obj.name}){
try {
${tableInfo.obj.name}Service.save(${tableInfo.obj.name});
return new JsonResult();
} catch (Exception e) {
e.printStackTrace();
return new JsonResult(false,e.getMessage());
}
}
/**
* 删除功能,前台要求返回{success:true/false,msg:xxx}
* @return
*/
@RequestMapping("/delete")
@ResponseBody
public JsonResult delete(Long id){
try {
${tableInfo.obj.name}Service.delete(id);
return new JsonResult();
} catch (Exception e) {
e.printStackTrace();
return new JsonResult(false,e.getMessage());
}
}
}
- test
##定义初始变量
#set($tableName = $tool.append($tableInfo.name,"Test"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/test/java/com/xpc/service"))
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;
##使用全局变量实现默认包导入
$!autoImport
import com.xpc.BaseTest;
import com.xpc.domain.${tableInfo.name};
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
public class ${tableName} extends BaseTest {
@Autowired
private I${tableInfo.name}Service i${tableInfo.name}Service;
@Test
public void testFindAll(){
List<${tableInfo.name}> list = i${tableInfo.name}Service.findAll();
list.forEach(e-> System.out.println(e));
}
}
-jsp
$!callback.setFileName($tool.append($tableInfo.obj.name, ".jsp"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/webapp/WEB-INF/views/${tableInfo.obj.name}"))
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>${tableInfo.obj.name}</title>
<%--引入相应的css与js--%>
<%@include file="/WEB-INF/views/head.jsp" %>
<script src="/js/model/${tableInfo.obj.name}.js"></script>
</head>
<body>
<%--pagination:分页条支持--%>
<table id="$!{tableInfo.obj.name}Grid" class="easyui-datagrid"
data-options="url:'/$!{tableInfo.obj.name}/page',
fitColumns:true,
singleSelect:true,
fit:true,
pagination:true,
toolbar:'#gridTools'"
enableHeaderClickMenu="true">
<%-- enableHeaderClickMenu="true" 隐藏字段--%>
<thead>
<tr>
<%-- sortable="true" 排序支持--%>
#foreach($column in $tableInfo.otherColumn)
<th data-options="field:'$!{column.name}',width:100" sortable="true">$!{column.name}</th>
#end
</tr>
</thead>
</table>
<%--grid顶部工具栏--%>
<div id="gridTools" style="padding:5px;height:auto">
<%--功能条--%>
<div style="margin-bottom:5px">
<a href="#" data-method="add" class="easyui-linkbutton" iconCls="icon-add" plain="true">添加</a>
<a href="#" data-method="update" class="easyui-linkbutton" iconCls="icon-edit" plain="true">修改</a>
<a href="#" data-method="del" class="easyui-linkbutton" iconCls="icon-remove" plain="true">删除</a>
</div>
<%--查询条--%>
<form id="searchForm">
名称: <input name="name" class="easyui-textbox" style="width:80px">
<a href="#" data-method="search" class="easyui-linkbutton" iconCls="icon-search">查询</a>
</form>
</div>
<%--添加与修改的表单对话框--%>
<div id="editDialog" class="easyui-dialog" title="功能编辑" style="width:400px;"
data-options="iconCls:'icon-save',resizable:true,modal:true,closed:true">
<form id="editForm" method="post">
<input id="$!{tableInfo.obj.name}Id" type="hidden" name="id" />
<table cellpadding="5">
#foreach($column in $tableInfo.otherColumn)
<tr>
<td>$!{column.name}:</td>
<td><input class="easyui-validatebox" type="text" name="$!{column.name}"
data-options="required:true"></input></td>
</tr>
#end
</table>
</form>
<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" data-method="closeDialog">关闭</a>
</div>
</div>
</body>
</html>
- js
$!callback.setFileName($tool.append($tableInfo.obj.name, ".js"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/webapp/js/model"))
$(function () {
//1.获取常用的一些组件
var ${tableInfo.obj.name}Grid = $("#${tableInfo.obj.name}Grid");
var searchForm = $("#searchForm");
var editDialog = $("#editDialog");
var editForm = $("#editForm");
//2.绑定相应的事件
$("*[data-method]").on("click",function(){
var methodName = $(this).data("method");
window.itsource[methodName]();
})
itsource={
//添加
add(){
//让密码框失效且隐藏起来
$("*[data-edit]").show();
$("*[data-edit] input").validatebox("enable");
//1.清空form中的数据
editForm.form("clear");
//2.打开弹出框(居中)
editDialog.dialog("center").dialog("open");
},
//修改
update(){
//1.获取到选中的那一行数据
let row = ${tableInfo.obj.name}Grid.datagrid("getSelected");
//2.如果没有选中,给出提示,后面的代码就不再执行了
if(!row){
$.messager.alert('警告','没选中,无法修改',"warning");
return ;
}
//清空form中的数据
editForm.form("clear");
//让密码框失效且隐藏起来
$("*[data-edit]").hide();
$("*[data-edit] input").validatebox("disable");
//把结果进行回显
/**
* 部门:<input name="department.id"
* row: department.id = 4 -> "department.id"= 4
*/
/* if(row.department){
row["department.id"] = row.department.id;
}*/
editForm.form("load",row);
//打开弹出框(居中)
editDialog.dialog("center").dialog("open");
},
//保存功能
save(){
var url = "/${tableInfo.obj.name}/save";
//获到id的值
var ${tableInfo.obj.name}Id = $("#${tableInfo.obj.name}Id").val();
if(${tableInfo.obj.name}Id){
url = "/${tableInfo.obj.name}/update?cmd=_update";
}
//easyui的form提交
editForm.form('submit', {
//提交的路径
url:url,
//提交之前的操作
onSubmit: function(){
// 做一些检查
// 返回false可以阻止提交;
return $(this).form('validate');
},
//data : {success:true/false,msg:xxx} -> 字符串
success:function(data){
var result = JSON.parse(data);
if(result.success){
${tableInfo.obj.name}Grid.datagrid("reload");
}else{
$.messager.alert('错误',`失败了, 原因是:${result.msg}`,"error");
}
//关闭弹出框
itsource.closeDialog();
}
});
},
//删除
del(){
//1.获取到选中的那一行数据
let row = ${tableInfo.obj.name}Grid.datagrid("getSelected");
//2.如果没有选中,给出提示,后面的代码就不再执行了
if(!row){
$.messager.alert('警告','没选中!',"warning");
return ;
}
//3.如果选中,确定是否要执行删除
$.messager.confirm('确认','您确认想要删除记录吗?',function(r){
if (r){
//4.如果确定删除,把id传到后台,后台删除数据
$.get("/${tableInfo.obj.name}/delete",{id:row.id},function (result) {
//5.后台会返回 {success:true/false,msg:xxx}
//6.后台返回true:刷新数据 / 后台返回false:提示错误信息
if(result.success){
${tableInfo.obj.name}Grid.datagrid("reload");
}else{
$.messager.alert('错误',`失败了 原因是:${result.msg}`,"error");
}
})
}
});
},
//查询
search(){
//serializeObject:拿到一个form中的所有数据,封装成json对象
var params = searchForm.serializeObject();
${tableInfo.obj.name}Grid.datagrid("load",params);
},
//关闭窗口
closeDialog(){
editDialog.dialog("close");
}
}
})