1.MVC架构 编程遵循的原则
1.M-Model:模型 负责业务逻辑,封装软件的核心功能如:登录功能,开始考试,交卷等
2.V-View:视图 负责显示界面和用户的交互,呈现用户的数据状态,接受用户请求,界面中只包含显示逻辑
3.C-Controller:控制器 是模型层M和视图层之间的桥梁,用于控制流程,耦合界面与业务模型,响应用户请求将请求转化给业务模型(处理)。根据处理结果更新数据发给视图界面。控制器中包含界面的控制逻辑(如:界面的显示和关闭)
2.MVC构架中的业务模型-M还可以细分:
1.业务层
2.数据管理层 提供对数据的CRUD操作,只关心数据操作不涉及业务功能
3.MVC请求流程:
用户访问View,发出请求,请求由控制器处理,控制器请求业务模型完成处理,然后根据处理结果跟新界面
4.任务:登录流程的实现
1).增加业务模型层:
com.tarena.elts.sever.ExamSever
里面包好登录的抽象功能(包括登录成功或失败)
2).增加业务和界面之间的控制器:
com.tarena.elts.ui.ClientContext
3).添加LoginFrame登录按钮的响应事件代码
4).在LoginFrame里面添加控制器属性和set方法
5).将loginFrame里面输入框和密码框设为全局属性,并添
加获得内容的方法
6).在ClientContext里面添加LoginFrame属性,MenuFrame属
性以及他们的set方法
7).回到ClientContext中完成Login()方法
1.获取界面中的ID和PWD,
2.调用ExamService中的login(得到结果)
if
成功:更新菜单界面,关闭登录界面,显示菜单界面。
else
失败:捕获失败异常,更新登录界面,显示失败信息
8).去LoginFrame添加noticeLabel的全局属性,增加显示noticeLabel错误
信息的方法
9).写测试类,
[1].创建了一些对象,
[2].注入对象
[3].测试
10).通过测试得知,判断登录的逻辑需在ExamService的实现类,
11).创建com.tarena.elts.service.ExamServiceImpl
[1].继承自ExamService接口(自动重写login方法).
[2].添加EntiyContext属性和set方法.
[3].完成login方法,
根据ID找用户:
if cant's find,throw Exception,
if find ID,match password,
if match password right ,create paper,return user
if match password wrong,throw Exception
12).修改测试类,创建ExamService对象,给ExamService这个接口增加一个set方法,然后注入对象,
封装页面显示逻辑
实现软件退出功能
[1].在ClientContext中添加界面退出方法
[2].位LoginFrame的cancelBtn添加事件监听,在事件中调用Exit方法
[3].屏蔽了LoginFrame的窗口关闭按钮
[4].为LoginFrame添加windowListener,重写windowClosing方法,
测试
2015/7/9
任务,实现开始考试功能
一.在MenuFrame里面,添加ClientContext属性,及set方法,给“开始考试”按钮添加事件(事件中调用控制器的start()方法)
二.重构ClientContext类,添加start方法
1.调用ExamService的start(),同时返回一个考试信息,
2.关闭菜单界面
3.更新考试界面
4.显示考试界面
三.重构ExamService类,添加start()
1.创建考卷试题,考卷信息
2.返回考卷信息(供考试界面调用),
四.重构ExamService类(供考试界面调用),
1.添加ExamInfo start()
2.添加getQuestionInfo(int index),获取一道考题
五.ExamServiceImpl
1.重写ExamInfo start()
2.重写getQuestionInfo(int index)
3.添加一个私有的创建考卷的方法createPaper(int numbers)
4.创建一个包含所有考题的集合,List<Question> paper
5.添加一个私有的设置每个考题的分数的方法 setScore()
六.ExamFrame中添加一个更新界面的方法;
updateView(ExamInfo e,QuestionInfo q)
重构:refactoring 通过调整代码改善软件的质量和性能,使其程序的设计模式和架构趋于合理,提高软件的扩展和维护
实体对象和值对象
实体对象:User Question
值对象:ExamInfo QusetionInfo实体对象有唯一标识,可以进行比较和区分,可以持久化
值对象,一个具体的值,不需要比较,不需要持久化
2015/7/10
过程中遇到的问题,
Q1:
List<Integer> getOptionStatus(){//to gain user's optionsList
ArrayList<Integer> answersList = new ArrayList<>();
//当answerList为全局的时候,每一次传值传的时候,虽然clear了,但是类似c的指针,清空当前指针的时候是把引用清空了,但是它本身并没有清空,所以每次传值的时候都传的一样的,集合中存的是元素的引用,而不是元素本身
if (a.isSelected()){
answersList.add(a.value);
}
if (b.isSelected()){
answersList.add(b.value);
}if (c.isSelected()){
answersList.add(c.value);
}if (d.isSelected()){
answersList.add(d.value);
}
//System.out.println(answersList);
return answersList;
}
q2: 下方的button会随左边label的长度大小变化而变化
解决方法:把左右两边的label都分别添加进Jpanel,然后设置Jpanel的默认大小就ok。
然后这差不多就是实训的笔记和问题,
代码在这:http://www.oschina.net/code/snippet_2376204_58018