删除功能制作
步骤:
1、查看是否选中了这一行
2、如果没有选中,给出提示
3、如果选中,让用户确认是否删除
4、如果确认删除,直接访问后台进行
删除
必须使用delete,因为在数据库的权限里已经设定好了。
后台
@RequestMapping("/delete")
@ResponseBody
public JsonResult delete(Long id){
// 使用try/catch抛出异常
try {
employeeService.delete(id);
} catch (Exception e) {
e.printStackTrace();
// 如果发生异常,调用JsonResult方法,来显示异常信息
return new JsonResult(false,e.getMessage());
}
return new JsonResult();
}
前台:
//删除
delete(){
//查看是否选中了这一行
var row = employeeDataGrid.datagrid("getSelected");
//如果没有选中,给出提示
if(!row){
$.messager.alert("提示","亲亲,选中在来和我对话","info");
return;
}
//如果选中,让用户确认是否删除
$.messager.confirm('确认','皇上,您真的要把臣妾打入冷宫吗',function(r){
if (r){
//如果确认删除,直接访问后台进行删除
$.get("/employee/delete",{id:row.id},function(result){
if(result.success){
//成功后刷新
employeeDataGrid.datagrid("reload");
}else{
//把失败信息做一个提示
$.messager.alert("提示",`你犯事了,老大的事:${result.msg}`,"error");
}
})
}
});
},
禁用功能实现
当弹出对话框的时候,后面的都会禁用。
加入模态框来实该功能。
固定对话框的位置,使用center,每次打开,位置都在中间。
自带验证
<input class="easyui-validatebox" type="text" name="email"
data-options="required:true,validType:'email'"></input>
引入验证的代码
<%--验证扩展的样式与js引入--%>
<link rel="stylesheet" type="text/css" href="/easyui/plugin/validatebox/jeasyui.extensions.validatebox.css">
<script src="/easyui/plugin/validatebox/jeasyui.extensions.validatebox.rules.js"></script>
完成验证的代码
<input class="easyui-validatebox" type="text" name="age"
data-options="validType:'integerRange[18,80]'"></input>
<tr data-save="true">
<td>密码:</td>
<td><input id="password" class="easyui-validatebox" type="password" name="password" data-options="required:true"></input></td>
</tr>
<tr data-save="true">
<td>确认密码:</td>
<td>
<input class="easyui-validatebox" type="password" name="confirmPassword"
validType="equals['password','id']"
data-options="required:true"></input></td>
</tr>
验证用户名是否已存在
$.extend($.fn.validatebox.defaults.rules, {
//验证的名称
checkName: {
/**
* @param value 输入框中的值
* @param param 调用验证输入的参数(数组)
* @returns {boolean}
*/
validator: function(value, param){
//拿到相应的id
var empId = $("#employeeId").val();
//这里获取的是字符串
var result = $.ajax({
url: "/employee/checkName",
data:{username:value,id:empId},
async: false //同步请求
}).responseText;
//返回false代码验证失败,返回true代码通过验证
return result==="true";
},
//出错后的信息
message: '此名已被用'
}
后台代码
//查询用户名是否存在
@RequestMapping("/checkName")
@ResponseBody
public boolean checkName(Long id,String username){
// 判断id是否为空
if(id!=null){
//如果不为空,根据id到数据库中获到数据
Employee employee = employeeService.findOne(id);
//判断数据库的用户名称和传过来的是否相等
if(employee.getUsername().equals(username)){
//如果相等,代表这个用户名是可以使用的
return true;
}
}
return employeeService.checkName(username);
}
Ajax是异步执行的
然后在进行重复名判断的时候,会出问题
使用下面的方法来解决问题
async:true/false :是否异步
添加
/*
* 点击添加按钮,弹出对话框,在前面我们将密码框和确认密码框利用data-show="false"
* 给隐藏起来了,在添加新的数据的时候,需要将他们显示出来,
* 然后打开对话框,在为了是每次点击新增的时候弹出的表单里面的数据都是空的,
* 我们还需要添加一个将表单里面数据清空的代码
*/
add(){
//将被隐藏的密码框和确认密码框显示出来
$("*[data-show]").show();
$("*[data-show] input").validatebox("enable");
//打开对话框
employeeDialog.dialog("center").dialog("open");
// 清空上次添加的数据
employeeForm.form("clear");
},
修改操作
先判断有没有选中
选中以后回显数据
修改功能要求:
要求数据回显,并且用户名可以重复
修改步骤:
1、接受两个参数
2、判断id是否存在
3、如果id存在
1、根据id从数据库里面获取
引入验证插件,如果想要验证什么,就直接在哪个内容后面接着写就可以了。
.怎样将字符串转为Json
方式一:使用eval的方式
方式二
// 在操作成功以后的回调操作
var result=JSON.parse(data);
修改的时候,先清空,再回显。
密码和确认密码框不回显。
edit(){
//获取选中的行
var row = employeeDataGrid.datagrid("getSelected");
//判断是否选中
if(!row){
$.messager.alert("提示","亲,您还没有选中哦","info");
return;
}
//将被显示的密码框和确认密码框隐藏起来出来
$("*[data-show]").hide();
$("*[data-show] input").validatebox("disable");
//打开对话框
employeeDialog.dialog("center").dialog("open");
//回显部门
if(row.department){
row["department.id"]=row.department.id;
}
//回显数据
employeeForm.form("load",row);
},
部门没有回显
//回显部门
if(row.department){
row["department.id"]=row.department.id;
}
数据丢失问题
解决方法一:隐藏域
隐藏域,但是安全性太低。
,每次发送请求,不法分子会来抓取你的包,获取你的数据。而且,每次都要写,太麻烦了。
方法二
不修改你想隐藏的字段,可以添加下面的注解,意思是,修改的时候不要去操作使用注解的字段。
// 解决修改数据后密码消失的问题
/*标有@ModelAttribute,会在每一个@RequestMapping 标注的方法
* 前面先执行,如果有返回值,会自动将该返回值加入到ModelMap里面
*
* */
@ModelAttribute("editEmployee")
public Employee beforeEdit(Long id,String cmd){
方法三:
1、通过id拿到这个员工在数据库中的值
2、把传过来的值进行设置
没有传过来的就不设置它
通过路径,调用Controller里面的方法的时候,都会先执行一次下面的方法。
解决性能问题:每次点击操作都会执行一次上面的方法,会导致性能不好
利用锚点来定位需要执行的地方
后台
@ModelAttribute("editEmployee")
public Employee beforeEdit(Long id,String cmd){
if(id!=null && "update".equals(cmd)){
Employee employee = employeeService.findOne(id);
return employee;
}
return null;
}
前台
save(){
// 首先,我们先根据ID来判断是修改操作还是添加操作
var url="/employee/save";
var id=$("#employeeId").val();
//如果有id,那么就是修改数据
if(id){
url="/employee/update?cmd=update";
}
解决n to n问题
操作修改数据以后,部门没办法修改
会报错,n to n 错误
出现原因:有一个持久化对象,我们去修改了它的id。
Spring只要发现我们传的字符串中有点,它就会把这个字符串分开。被分开的字符串,前面的都是调用get,只有最后一个使用set。
持久化对象,去拿另一个对象,被拿的对象也会变成持久化对象。
因为我们不小心将其改为了持久化对象,又脏数据更新,让Spring以为我们要去改id,所以才会 n to n。
@ModelAttribute("editEmployee")
public Employee beforeEdit(Long id,String cmd){
if(id!=null && "update".equals(cmd)){
Employee employee = employeeService.findOne(id);
/* 解决了n to n 的问题(所有要穿过来的关联对象都要想将它清空,
因为在持久化对象去拿另一个对象的时候,被拿的对象也会变成持久化对象,然后又会脏数据更新,
让Spring以为我们要去修改主键id,所以就会出现n to n 问题
)*/
employee.setDepartment(null);
return employee;
}
return null;
}
为什么像上面那样操作就可以解决错误呢?
因为将dbEmp设置为空,SpringMVC会帮我们创建一个新的对象,让后将id放进去。
凡是要传过来关联对象,都要先将那个数据清空