1 删除功能实现
思路:
-
先确认是否选中一行(row)提示 $.messager.alert()
-
再次确认是否删除,true,执行操作 $.messager.confirm
del:function () {
//第一步,提示选中【如果没有选中】
var row = employeeGrid.datagrid("getSelected");
if(!row){
$.messager.alert('温馨提示:','亲,你要选择一行数据进行删除','info');
return;
}
$.messager.confirm("提示","你确定要删除吗",function (r) {
if(r){
//这里如果确定要删除,就发送ajax请求到后台【id传到后台】执行删除操作
$.get("/employee/delete",{id:row.id},function (result) {
console.log(result.success);
console.log(result);
if(result.success){
$.messager.alert('提示信息','删除成功',"info");
$('#employeeGrid').datagrid('reload');
}else{
$.messager.alert('提示信息','删除失败!,原因:'+result.msg,"error");
}
})
}
}
-
添加功能与修改功能
添加功能思路: -
清空上次对话框的信息
-
开启对话框验证
-
开启密码输入框【开启密码验证】
-
弹出对话框
add:function () {
//第一步,清空上次的数据
$('#employeeForm').form('clear');
//添加第二步,弹出添加的信息框
$("#employeeDialog").window("open");
//启动信息框验证
$("tr[data-save=true] input").validatebox('enableValidation');
//开启密码数据 display:none
$("tr[data-save]").show();
//开启密码验证
$("*[data-save] input").validatebox("enableValidation");
},
保存数据操作
save:function () {
//保存默认请求路径【添加的路径】
var url = "/employee/save";
//获取隐藏域里面id值【修改的路径】
var id = $("#employeeId").val();
if(id){
url = "/employee/update?cmd=update";
}
$('#employeeForm').form({
url:url,
onSubmit: function(){
//做验证【每个输入框必须符合条件】返回true
return $("#employeeForm").form("validate");
},
success:function(data){
var result = JSON.parse(data);//将返回的信息转成相应的json数据
if(result.success) {
//保存成功,重新加载表单
$('#employeeGrid').datagrid('reload');
$.messager.alert('提示信息','操作成功!',"info`");
}else{
//保存失败,弹出提示信息
$.messager.alert('提示信息','操作失败!,原因:'+result.msg,"error");
}
//操作完成,关闭对话框
$("#employeeDialog").window('close');
}
})
$('#employeeForm').submit();
}
}
- 重复输入密码验证
//自定义验证密码
$.extend($.fn.validatebox.defaults.rules, {
equals: {
validator: function(value,param){
return value == $(param[0]).val();
},
message: '密码不一致'
}
});
4 用户名验证
思路分析:添加操作 给用户名输入框绑定事件,输入完成触发事件,将value发送到后台与数据
库中的用户名作比较【按username】查询是否有数据 返回Boolean值
修改操作 通过被修改的id查询,可以允许用户名等于此id的旧用户名,但是不能与数据库中其他的用户名重复
//定义验证用户名的方法
$.extend($.fn.validatebox.defaults.rules, {
checkUsername: {
validator: function(value,param){
//当然输入框value 和数据库的username进行比较
//发送ajax请求 --异步(ajax同步)
var id = $("#employeeId").val();
var result = $.ajax({
type: "POST",
url: "/employee/checkname",
data: "username="+value+"&id="+id,
async: false //同步
}).responseText;
//返回true 验证通过 不显示信息
return result == 'true';
},
message: '用户名不能重复.'
}});
5 数据丢失的三种解决方案
方案一:隐藏要传递的值(只隐藏,但是数据还是需要传递,这和第一个项目是同相同的方案)
这个方案的优点是简单易理解,缺点是如果字段过多,代码量会比较大,另外这种方案的安全性确实是有一些低!
方案二:在JPA的相应字段上加标签:
@Column(updatable = false)
private String password;
这个方案也比较简单,但是如果你需要修改这个字段的时候就比较麻烦!
方案三:先查询数据库,获取持久状态的对象,然后把页面的数据set到对象里面
(这种方案也是用得比较多的一种方案)
Employee tempEmployee = employeeService.get(employee.getId());
//需要修改的值就从页面里面的employee放入tempEmployee
tempEmployee.setUsername(employee.getUsername());
employeeService.save(tempEmployee);
ModelAttribute的作用
运用在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中;
具体解决方法
//删除方法作下面的查询处理,前台设置 cmd
@ModelAttribute("editEmployee")
public Employee beforeEdit(Long id,String cmd){
Employee employee = null;
if("update".equals(cmd) && id != null && !"".equals(id) ){
employee = employeeService.findOne(id);
//在修改的时候的时候,关联对象设置null,保永生
//将持久化状态的设置为临时状态 就不会报 n to n问题
employee.setDepartment(null);
}
return employee;
}
@RequestMapping("/update")
@ResponseBody
public Map update(@ModelAttribute("editEmployee") Employee employee){
Map mp = new HashMap();
try {
employeeService.save(employee);
mp.put("success", true);
} catch (Exception e) {
e.printStackTrace();
mp.put("success", false);
mp.put("msg", e.getMessage());
}
return mp;
6.n-to-n问题的解决
持久化状态下
如果修改非主键值,就会报n-to-n
解决 在修改的时候的时候,关联对象设置null
//删除方法作下面的查询处理,前台设置 cmd
@ModelAttribute("editEmployee")
public Employee beforeEdit(Long id,String cmd){
Employee employee = null;
if("update".equals(cmd) && id != null && !"".equals(id) ){
employee = employeeService.findOne(id);
//在修改的时候的时候,关联对象设置null,保永生
//将持久化状态的设置为临时状态 就不会报 n to n问题
employee.setDepartment(null);
}
return employee;
}
7 veloclty 模板技术
velocity-1.6.3.jar 默认模板的后缀vm
freemarker-2.2.19.jar 默认模板的后缀ftl
7.1 模板技术输出数据
数据+模板(html文件,vm文件,ftl文件)=输出文本
7.2Hello Velocity
VelocityTest
package cn.itsource.pss;
import java.io.StringWriter;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.junit.Test;
/**
* 测试Velocity功能
*/
public class VelocityTest {
@Test
public void testVelocity01() throws Exception {
//创建模板应用上下文
VelocityContext context = new VelocityContext();
context.put("msg", "小张是个好同志");
//拿到相应的模板(需要设置好编码)
Template template = Velocity.getTemplate("temptest/hello.html","UTF-8");
//准备输出流
StringWriter writer = new StringWriter();
template.merge(context, writer);
System.out.println(writer);
}
@Test
public void testVelocity02() throws Exception {
//创建模板应用上下文
VelocityContext context = new VelocityContext();
context.put("msg", "小张是个好同志");
//拿到相应的模板(需要设置好编码)
Template template = Velocity.getTemplate("temptest/hello.html","UTF-8");
//准备输出流
File file = new File("temptest/helloNew.html");
FileWriter writer = new FileWriter(file);
template.merge(context, writer);
writer.close();
}
}
temptest /hello.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
大伙都说:${msg}
</body>
</html>
8 代码生成器
- 准备模板(把每个模块需要改的地方确定好)
- 确定所有模板的生成顺序
- 确定所有模板的生成位置
- 确定要生成的基本功能的domain(Dept)
- 根据Domain名称与模板结合,在相应位置生成文件
- 解决如果父文件夹不存在的问题
- 解决如果文件已经存在的问题
- 排错(有错先改模板)
9 EasyCode
EasyCode是基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml)。只要是与数据库相关的代码都可以通过自定义模板来生成。支持数据库类型与java类型映射关系配置。支持同时生成生成多张表的代码。每张表有独立的配置信息。完全的个性化定义,规则由你设置。
前提:你要会Velocity!!
9.1功能说明:
• 支持多表同时操作
• 支持同时生成多个模板
• 支持自定义模板
• 支持自定义类型映射(支持正则)
• 支持自定义附加列
• 支持列附加属性
• 所有配置项目支持分组模式,在不同项目(或选择不同数据库时),只需要切换对应的分组,所有配置统一变化。
安装
在线安装,直接打开
离线安装(先下载相应的zip包)
添加数据源(已经学过,不做详细讲解)
最主要的就是控制它的位置与内容
生成一个基本代码
使用dept为例:这个是最简单的测试!!
我们这里只是生成一个最简单的实体类(当然,这个是使用它的自己原来的一个代码生成器模板,和我们最后想要的效果还有很大的差别!)