我们观察这两个M层文件,不难发现在调用$http时,有大量重复的代码.
![https://box.kancloud.cn/67cdfad478e8659c85955c7038160cea_1918x1386.png](https://box.kancloud.cn/67cdfad478e8659c85955c7038160cea_1918x1386.png)
考虑到在进行数据请求时,可能发生比如:用户未登陆或是用户没有操作权限等,的错误。我们需要同一对发生的错误进行处理。鉴于此,我们对$http请求进行重构。
重构以前,我们进行数据请求时,时序图是这样。
![https://box.kancloud.cn/23eea2091da55dc987bea0eb517d7da6_1252x446.png](https://box.kancloud.cn/23eea2091da55dc987bea0eb517d7da6_1252x446.png)
重构后,时序图变成了这样:
![https://box.kancloud.cn/fcb15f3d482f12e0f294562f7c9c30c0_1220x678.png](https://box.kancloud.cn/fcb15f3d482f12e0f294562f7c9c30c0_1220x678.png)
这使得,可以大量的减少我们书写的重复的代码;可以统一对资源请求的错误进行错误;可以结合后台返回的数据,来更友好控制用户的访问权限。
> 新建service: yo angular:service server
```
'use strict';
/**
* @ngdoc service
* @name webAppApp.server
* @description
* # server
* Service in the webAppApp.
*/
angular.module('webAppApp')
.service('server', function($http) {
var http = function(param, callback) {
var data = {};
// 设置请求的header
param.header = {
contentType: 'application/json',
};
// 统一处理URL
param.url = 'http://127.0.0.1:8080/javaee' + param.url;
$http(param).then(function successCallback(response) {
console.log(response);
data = response.data;
// 网络发生错误
}, function errorCallback(response) {
console.log('网络请求发生错误:');
console.log(response);
}).
// 发生异常
catch(function(e) {
console.log('$http发生异常: ', e);
throw e;
}).finally(function() {
// todo:进行错误码的判断,如果提示用户未登陆,则跳转至登陆页面
if (typeof(data.code) === 'undefined') {
console.log('未获取到code值');
} else if (data.code !== 200) {
// 返回的状态码不是200,则说明发生了错误
console.log('返回的状态码为' + data.code);
checkCode(data.code);
} else {
// 调用回调函数, 返回数据
callback(data);
}
});
};
// 核验错误码
var checkCode = function(code) {
if (code === 401) {
console.log('用户尚未登陆,或停留的时间过长');
// 跳转至用户登陆界面
} else if (code === 403) {
console.log('用户无此操作权限');
// 提示用户无此权限
} else {
console.log('接收到了未定义的错误码');
}
};
// Public API here
return {
http: http
};
});
```
## 重构user.js
```
'use strict';
/**
* @ngdoc service
* @name webAppApp.user
* @description
* # user
* Service in the webAppApp.
*/
angular.module('webAppApp')
.service('user', function(server) {
/**
* 用户登陆
* @param {string} username 用户名
* @param {string} password 密码
* @param {Function} callback 回调函数
* @return {}
* @author 梦云智 http://www.mengyunzhi.com
* @DateTime 2017-02-07T18:34:55+0800
*/
var login = function(username, password, callback) {
server.http({
method: 'POST',
url: '/User_login',
data: {
username: username,
password: password
}
}, function(response) {
// 将是否通过验证传给V层
callback(response.isPassed);
});
};
return {
login: login
};
});
```
## 重构teacher.js
```
'use strict';
/**
* @ngdoc service
* @name webAppApp.teacher
* @description
* # teacher
* Service in the webAppApp.
*/
angular.module('webAppApp')
.service('teacher', function(server) {
/**
* 获取当前页的教师
* @param {string} name 查询教师的名字
* @param {int} page 第几页
* @param {int} pageSize 每页多少条
* @param {Function} callback 回调函数
* @return {[type]}
* @author 梦云智 http://www.mengyunzhi.com
* @DateTime 2017-01-21T19:05:55+0800
*/
var paginate = function(name, page, pageSize, callback) {
var teachers = [];
// 进行http POST请求.
// 由于是post请求方式,所以即便是我们在项目中存在paginate.json文件
// 但如果我们查看控制台,仍然会发现有错误产生,同时,没有正确的接收到数据
server.http({
method: 'POST',
url: '/teacher/indexJson',
data: {
name: name,
page: page,
pageSize: pageSize
}
}, function(response) {
teachers = response.teachers;
callback(teachers);
});
};
// Public API here
return {
// 获取全部教师信息
paginate: function(name, page, pageSize, callback) {
return paginate(name, page, pageSize, callback);
},
};
});
```
没错,如果你现在仅仅是在进行前台的学习,那么,此时,你只需要将`server`中的`param.url = 'http://127.0.0.1:8080/javaee' + param.url;`修改为:`param.url = 'http://www.mengyunzhi.com:8080/javaee' + param.url;`
> git checkout -f step11.6
- README
- 第一章:准备
- 第二章:Hello World!
- 第一节:查看工程文件
- 第二节:JDK、JRE与环境变量
- 第三节:index.jsp
- 第三章:Hello Struts
- 第一节:Web.xml
- 第二节:单入口
- 第三节:Hello Struts
- 第四节:触发C层
- 第四章:建立数据表
- 第一节:建立实体类
- 第二节:测试一
- 第三节:测试二
- 第四节:引入Hibernate
- 第五节:配置Hibernate
- 第六节:建立连接
- 第七节:实体类映射数据表
- 第八节:完善数据表
- 第五章:教师管理
- 第一节:增加数据--add
- 第二节:增加数据--save
- 1 获取传入数据数据
- 2 数据写入测试
- 3 对接C层
- 第三节:数据列表
- 1 获取数据
- 2 重构代码
- 3 C层对接--初始化
- 4 C层添加数据
- 5 V层显示数据
- 6 获取数据库中数据
- 7 显示性别
- 8 分页
- 9 条件查询
- 第四节:修改数据
- 1 edit
- 2 update
- 第五节:删除数据
- 第六节:总结
- 第六章:重构C层
- 第一节:继承ActionSupport类
- 第二节:数据验证
- 第七章:前台分离(前台)
- 第一节:环境搭建
- 第二节:运行环境
- 第三节:共享开发环境
- 第四节:生产环境
- 第八章:前台开发(前台)
- 第一节:本地化
- 第二节:教师列表
- 1 引入M层
- 2 模拟后台返回数据
- 3 C与M对接
- 4 C与V对接
- 第九章:前后台对接(前后台)
- 第一节:后台输出json(后台)
- 第二节:对接前台(全栈)
- 第二节:对接API(前台)
- 第二节:跨域请求(后台)
- 第三节:重构代码(前台)
- 第十章:重构后台M层
- 第一节:数据访问DAO层
- 第二节:项目整体重构
- 第十一章:用户登陆(前后台)
- 第一节:制定规范
- 第二节:定制测试用例
- 第三节:后台输入测试代码(后台)
- 第四节:postman(后台)
- 第五节:新建用户登陆模块(前台)
- 第六节:代码重构(前台)
- 第十二章:班级管理(前后台)
- 第一节:班级列表
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第二节:Add
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第三节:Save
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第四节:Edit
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第五节:Update
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第六节:Delete
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第七节:小结
- 第十三章:班级管理(API)
- 第一节:ER图
- 第二节:create
- 1 实体层
- 2 dao层
- 3 service(server)层
- 4 action层
- 第三节:ManyToOne
- 第四节:Read
- 1 service(server)层
- 2 action层
- 第五节:update
- 1 service(server)层
- 2 action层
- 第六节:update
- 第十四章:重构服务层