复制工程
复制ssm02_crud 成ssm03_crud_ajax2
修改 id name,(和上一篇修改类似)
增加 模块标签
项目目录
pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.3</version>
</dependency>
Result
public class Result {
private int code;//编码 404 200
private String msg;//提示信息
private Object data; //数据
public static Result init(int code, String msg, Object data){
Result result =new Result(code,msg,data);
return result;
}
private Result() {
}
private Result(int code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
Controller方法返回Result
@Controller
@RequestMapping("/deptv2") //写在类上面指定当前模块路径
public class DepartmentV2Controller {
@Autowired
private IDepartmentService departmentService;//controller调用 service层
/*@RequestMapping(path="/xx")
public 返回值类型 方法名(参数){ //页面提交过来的请求参数
//..
返回值类型决定返回给浏览器的内容
}
*/
@RequestMapping(path="/listUI",method = RequestMethod.GET)
public String listUI(){
return "list_depts";
}
//地址上带UI表示打开页面,不带的表示返回数据
@RequestMapping(path="/list",method = RequestMethod.GET)
public @ResponseBody //将list调jackson转成json字符串
Object list(){
//业务逻辑 调用查找所有的部门的方法
List<Department> list = departmentService.findAllDepartments();
return Result.init(200,"",list);//返回对象需要被转成json字符串
}
}
Ajax
AJAX 是一种用于创建快速动态网页的技术,Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML)。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。
有很多使用 AJAX 的应用程序案例:新浪微博、Google 地图、开心网等等。
Jquery实现Ajax
(1)导入jquery库
将库文件复到项目中
在页面中引入库
<%
pageContext.setAttribute("path",request.getContextPath());
%>
<head>
<title>Title</title>
<!-- 引入-->
<script type="text/javascript" src="${path}/js/jquery-1.11.0.min.js"></script>
</head>
(2)代码编写
js 发送请求 $.get $.post serialize()
js 接收结果 function(data){…}
js 更新页面 $(id值) html()
Jquery实现部门列表页面
<!-- 开始ajax编程 -->
<script type="text/javascript">
$(function () {
//页面加载成功
//1:js发送请求
$.get('${path}/deptv2/list', function (result) {
//2:js接收结果
console.info("result=" + result)
//{"code":200,"msg":"","data":[{"did":1,"dname":"JAVA"},{"did":2,"dname":"测试"},{"did":3,"dname":"最牛部门33"}]}
//定义表格的内容
var trs = ''
//拼接表头
trs += ' <tr>\n' +
' <td>编号</td>\n' +
' <td>部门名称</td>\n' +
' <td>管理</td>\n' +
'\n' +
' </tr>'
if (200 == result.code) {
var items = result.data;
//3:js更新页面
for (var i = 0; i < items.length; i++) {
var dept = items[i]
console.info(dept)
trs += ' <tr>\n' +
' <td>' + dept.did + '</td>\n' +
' <td>' + dept.dname + '</td>\n' +
' <td><a>删除</a><a>修改</a></td>\n' +
'\n' +
' </tr>'
}//end for
$('#table').html(trs)
}
}, 'json') //参1 地址 参2 处理函数 参3 数据类型
})
</script>
删除指定id的部门
@RequestMapping(path="/delete",method = RequestMethod.GET)
public @ResponseBody Object delete(Integer did){
//获取did,执行对该条记录的删除
l.info("delete did="+did);
try {
departmentService.deleteDepartmentById(did);
return Result.init(200,"删除成功",null);
} catch (Exception e) {
e.printStackTrace();
}
return Result.init(-200,"删除失败",null);
}
list_depts.jsp
function deleteById(did) {
$.get('${path}/deptv2/delete?did='+did,function (result) {
console.info(result)
if(200==result.code){
alert(result.msg)
refreshTable()//调用列表更新
}else{
alert(result.msg)
}
},'json')
}
<a href="javascript:deleteById('+dept.did+')">删除</a>
默认情况下点击超链接 是跳转页面-整体刷新
Ajax是局部刷新,点击链接调用函数,函数内部发起请求,处理返回结果,更新页面
Ajax不切换页面,所有内容在一个页面,只需要通过style的属性display,将值设置为none不可见,不占高度。
如果需要显示出来,设置display的值为block
list_depts.jsp
function switchDiv(part) {
//隐藏内容
$('#addDiv').css("display","none")
$('#listDiv').css("display","none")
$('#editDiv').css("display","none")
if(1 == part){//添加页面
$('#addDiv').css("display","block")
$('#add_dname').val('')
}else if(2 == part){//列表页面
$('#listDiv').css("display","block")
}else if(3 == part){//编辑页面
$('#editDiv').css("display","block")
}
}
DepartmentV2Controller
添加功能
//保存一般是使用post提交
@RequestMapping(path="/add",method = RequestMethod.POST)
public @ResponseBody Object add(Department dept){
l.info("add department="+dept);
try {
departmentService.saveDepartment(dept);
return Result.init(200,"添加成功",null);
} catch (Exception e) {
e.printStackTrace();
}
return Result.init(-200,"添加失败",null);
}
list_depts.jsp
添加的表单
<div id="addDiv">
<h1>添加页面</h1>
<form id="add_form" >
<input type="hidden" name="did"/><br/>
<input type="text" name="dname" id="add_dname"/><br/>
<input id="btn_add" type="button" value="保存"/><br/>
</form>
</div>
添加的ajax请求
$('#btn_add').click(function () {
//alert('btn_add') 普通的表单提交 did=1&dname=测试组
var data = $('#add_form').serialize() //方法会将表单数据拼接成k1=v1&k2=v2
$.post('${path}/deptv2/add',data,function (result) {
console.info(result)
//页面切换
switchDiv(2)
//重新加载列表
refreshTable()
alert(result.msg)
},'json')
})
修改回显代码
$('#btn_add').click(function () {
//alert('btn_add') 普通的表单提交 did=1&dname=测试组
var data = $('#add_form').serialize() //方法会将表单数据拼接成k1=v1&k2=v2
$.post('${path}/deptv2/add',data,function (result) {
console.info(result)
//页面切换
switchDiv(2)
//重新加载列表
refreshTable()
alert(result.msg)
},'json')
})
DepartmentV2Controller
$('#btn_add').click(function () {
//alert('btn_add') 普通的表单提交 did=1&dname=测试组
var data = $('#add_form').serialize() //方法会将表单数据拼接成k1=v1&k2=v2
$.post('${path}/deptv2/add',data,function (result) {
console.info(result)
//页面切换
switchDiv(2)
//重新加载列表
refreshTable()
alert(result.msg)
},'json')
})
$('#btn_add').click(function () {
//alert('btn_add') 普通的表单提交 did=1&dname=测试组
var data = $('#add_form').serialize() //方法会将表单数据拼接成k1=v1&k2=v2
$.post('${path}/deptv2/add',data,function (result) {
console.info(result)
//页面切换
switchDiv(2)
//重新加载列表
refreshTable()
alert(result.msg)
},'json')
})
list_depts.jsp
$('#btn_add').click(function () {
//alert('btn_add') 普通的表单提交 did=1&dname=测试组
var data = $('#add_form').serialize() //方法会将表单数据拼接成k1=v1&k2=v2
$.post('${path}/deptv2/add',data,function (result) {
console.info(result)
//页面切换
switchDiv(2)
//重新加载列表
refreshTable()
alert(result.msg)
},'json')
})
Ajax提交json给控制器方法
k1=v1&k2=v2 是由$(’#update_form’).serialize() 不是json
{k1:v1,k2:v2}
(1)控制器方法
@RequestMapping(path = “/update2”, method = RequestMethod.POST,consumes = “application/json”)
public String update2(@RequestBody Department department)
(2)postman提交
(3)前台页面提交
$.ajax()
contentType:“application/json;charset=UTF-8”,
DepartmentV3Controller
@Controller
@RequestMapping("/deptv3")
public class DepartmentV3Controller {
private static final Logger l = LoggerFactory.getLogger(DepartmentV3Controller.class);
@Autowired
IDepartmentService iDepartmentService;
@RequestMapping(path="/addUI",method = RequestMethod.GET)
public String addUI(){
return "add_dept";
}
@RequestMapping(path="/add",method = RequestMethod.POST,consumes = "application/json")
public @ResponseBody Object add(@RequestBody Department dept){//{did:0,dname:IOS}
l.info("add dept="+dept);
try {
iDepartmentService.saveDepartment(dept);
return Result.init(200,"添加成功",null);
} catch (Exception e) {
e.printStackTrace();
}
return Result.init(-200,"添加失败",null);
}
}
add_dept.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<%
pageContext.setAttribute("path", request.getContextPath());
%>
<head>
<title>Title</title>
<!-- 引入-->
<script type="text/javascript" src="${path}/js/jquery-1.11.0.min.js"></script>
<script type="text/javascript">
$(function () {
$('#btn_add').click(function () {
//js发送请求
var dname= $('#add_dname').val()
console.info(dname)
$.ajax({
url:'${path}/deptv3/add',
async:true,
data:'{"did":"","dname":"'+dname+'"}',
type:"post",
contentType:"application/json;charset=UTF-8",
success:function (result) { //js接收结果
if(200==result.code){
alert(result.msg) //js更新页面
//刷新列表
}
},
error:function () {
alert('服务问题,请求失败')
}
});
})
})
</script>
</head>
<body>
<div id="addDiv">
<h1>添加页面</h1>
<form id="add_form" >
<input type="hidden" name="did" id="add_did"/><br/>
<input type="text" name="dname" id="add_dname"/><br/>
<input id="btn_add" type="button" value="保存"/><br/>
</form>
</div>
</body>
</html>