开发完M层,下面,我们开始将CM进行对接.
# C层
app/scripts/controllers/teacher/index.js
```
'use strict';
/**
* @ngdoc function
* @name webAppApp.controller:TeacherIndexCtrl
* @description
* # TeacherIndexCtrl
* Controller of the webAppApp
*/
angular.module('webAppApp')
.controller('TeacherIndexCtrl', function ($scope, teacher) {
// 使用回调函数来获取数据
teacher.all(function(teachers) {
$scope.teachers = teachers;
});
});
```
保存。
但是。。。。好像shell并没有监测到我们的文件发生了变化,也没有为我们自动查错。
这是,由于我们在`controllers`文件夹增加了子文件夹,而`yoman`的设计是:把所有的控制器全部写在`controllers`文件夹中。在小型的项目中,这样做是可以的。但考虑到以后我们可能会涉及一些与权限控制相关的中型项目,我们认为每一个`action`对应一个控制器更有利于分工。
如果还需要`grunt`为我们自动检测代码,并且自动测试的话,那么我们需要如下配置`gruntfile.js`.
<hr />
> 以下内容修改原文件较多,修改前需要做好备份
步骤如下:
1. 打开`gruntfile.js`
2. 查找`/scripts/{`关键字, 并选中
3. 按ctrl + d 选中所有的字段。
4. 将其更改为`/scripts/**/{`
用同样的方法,将`spec/{` 更改为: `spec/**/{`
保存后,执行ctrl+c,然后再执行`grunt serve`来重新启动服务。
去除示例代码及示例单元测试代码,以防报错。
> 在团队开发中,我们的核心成员将完成项目的初始化工作。所以如果前面你感觉学习有些吃力,那么大可以跳过。我们在github中,已经为大家准备好修改后可用的gruntfile.js文件。
## 单元测试
原则上,由于我们在C层中直接调用了M层的方法。而我们在开发C层时,又假设了两点:1.M层已经开发完毕,并按我们的需求进行了单元测试。2.M层是由其它团队人员开发的。所以,C层在进行单元测试时,是不需要对调用的M层的方法进行测试的。
所以在只有以上代码的前提下,是不需要进行单元测试的。事实上,我们在进行程序开发时,C层的作用仅是调用调用这个,调用调用那个。是个指挥官,而不进行逻辑运算。所以在这种假设的前提下,C层的重点在于不能出现语法错误。我们的grunt又十分人性化的在代码保存时,提示我们语法是否出错。所以,在M层开发比较给力的前提下,C层的代码量则会少很多。
在此,我们为了巩固上一小节中的模拟$http请求的内容,模拟进行M层的调用,给出以下测试代码,供选学。
<hr />
test/spec/controllers/teacher/index.js
完整代码:
```
'use strict';
describe('Controller: TeacherIndexCtrl', function() {
// load the controller's module
beforeEach(module('webAppApp'));
var TeacherIndexCtrl,
scope, $httpBackend;
// Initialize the controller and a mock scope
beforeEach(inject(function($controller, $rootScope, _$httpBackend_) {
scope = $rootScope.$new();
$httpBackend = _$httpBackend_;
// 定义请求 URL
var url = 'resource/teacher/index/all.json';
// 定义返回数据。注意此处的json数据的写法与xxx.json文件中的json数据的写的法的异同。
var data = {
teachers: [
{ username: 'zhangsan', name: '张三', sex: 0, email: 'zhangsan@yunzhiclub.com' },
{ username: 'lisi', name: '李四', sex: 1, email: 'lisi@yunzhiclub.com' },
{ username: 'wangwu', name: '王五', sex: 0, email: 'wangwu@yunzhiclub.com' }
]
};
// 进行模似数据请求配置.当请求方法为GET,资源名为resource/teacher/index/all.json, 返回data数据.
$httpBackend.when('GET', url).respond(data);
TeacherIndexCtrl = $controller('TeacherIndexCtrl', {
$scope: scope
// place here mocked dependencies
});
}));
it('测试M层的静态数据', function() {
// 模拟数据请求
$httpBackend.flush();
// 期望:返回的数组长度为3
expect(scope.teachers.length).toBe(3);
});
});
```
保存后,shell不报错,修改并测试成功.
- 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
- 第十四章:重构服务层