pureMVC java版搭建流程
转自:http://blog.csdn.net/sutaizi/article/details/6588004
pureMVC 是一个轻量级的框架 它在 flex中非常流行(和cairngorm差不多火)
目前几乎已经移植到所有平台上。
下面实现java版得pureMVC搭建
先给大家看总体的层次:
众所周知 pureMVC是一个轻量级的MVC框架 分为 Model ,View ,Controller。这三个是pureMVC的核心。
除此之外pureMVC中含有一个单例模式Facade。facade负责与Model,View,Controller通信。这样就简化了开发的复杂度。
所以首先需要编写单一模式类facade 也就是上图的 ApplicationFacade.java
- public class ApplicationFacade extends Facade {
- //
- private static ApplicationFacade instance = null;
- //启动的主程序实例
- private PureMVC_Main main ;
- /**
- *
- * @return
- */
- public static ApplicationFacade getInstance(){
- if( instance == null) instance = new ApplicationFacade ();
- return instance ;
- }
- /**
- *
- */
- protected void initializeController() {
- trace.d("ApplicationFacade.initController()");
- super.initializeController();
- registerCommand(NotiName.NOTI_START, StartupCommand.class);
- }
- /**
- *
- * @param main
- */
- public void startup(PureMVC_Main _main) {
- trace.d("ApplicationFacade.startup");
- this.main = _main;
- //发送通知(notification)给控制器 ,通知名称为 NotiName.NOTI_START(这个String是自己定义的)
- //sendNotification是用来发送消息的函数 这是一个全局的函数 。
- //三个参数为 String 通知名称
- // Object 通知要传递的内容可以是任何对象
- // String 一般默认为null
- //这个通知会在 StartCommand.java中被处理。
- this.sendNotification(NotiName.NOTI_START, null, null);
- }
- }
这样保证了静态变量facade只有一个实例instance
而这个getInstance 择有具体的main程序来调用,当调用时 框架就启动了。
同时在main程序启动框架时,需要同时调用startup方法,
startup方法做了这么几件事情
1.将main程序的引用传给了facade
2.注册了控制器startupCommand。
- public class StartupCommand extends MacroCommand{
- protected void initializeMacroCommand() {
- trace.d("PrepStartUpCommand.initializeMacroCommand()");
- addSubCommand(PrepModelCommand.class);
- addSubCommand(PrepControllerCommand.class);
- addSubCommand(PrepViewCommand.class);
- }
- }
而startupCommand又注册了另外3个控制器,他们的作用分别是
注册代理:
- public class PrepModelCommand extends SimpleCommand implements ICommand{
- public void execute(INotification noti){
- trace.d("PrepModelCommand.execute()");
- this.facade.registerProxy(new LoginProxy());
- }
- }
让Mediator得到页面的引用
- public class PrepViewCommand extends SimpleCommand implements ICommand{
- public void execute(INotification noti){
- trace.d("PrepViewCommand.execute("+ noti.getName() + ")");
- this.facade.registerMediator(new LoginMediator(new LoginWindow()));
- }
- }
还有一个 是保存Controller与Command的映射,注册消息 与Command 当Command需要时 Command会被创建。
- public class PrepControllerCommand extends SimpleCommand implements ICommand{
- /**
- * 这个方法一定会被执行。用来分析传过来的消息(Notification:PureMVC中各个模块传递的信息)
- */
- @Override
- public void execute(INotification noti){
- trace.d("PrepComtrollerCommand.excute()");
- this.facade.registerCommand(NotiName.NOTI_LOGIN, LoginCommand.class);
- }
- }
这样框架就启动了。下面来说说登录的例子。
PureMVC 的View分为2个部分 一个是 纯的UI界面,另一个是Mediator模式
这种模式的好处在于他将UI界面(如loginWondow.java--登录界面)中所有的UI组件 比如 button textField ..封装在一起,通过保存UI界面的应用来调用他们。
打个比方就是:
一栋宿舍楼 ,每一间宿舍都是一个UI控件,真个宿舍楼就是一个Mediator,宿舍楼门口有看门的大爷,大爷知道所有宿舍的情况,。
当有人访问宿舍们需要知道具体某间宿舍的情况的时候 他只需要去问门卫大爷。不需要亲自走到那间宿舍。就能知道具体情况。
在Mediator中有2个重要方法:
- public String[] listNotificationInterests() {
- String[] list = {
- NotiName.LOGIN_SUCCESS, NotiName.LOGIN_FAILED
- };
- return list;
- }
- @Override
- public void handleNotification(INotification noti) {
- if (noti.getName().equals(NotiName.LOGIN_SUCCESS)){
- trace.d("login success");
- }
- if (noti.getName().equals(NotiName.LOGIN_FAILED)){
- trace.d("login failed " + noti.getBody().toString());
- }
- }
第一个方法罗列出 要接受的消息名字
第二个方法进行处理消息。
再看以下代码
- public LoginMediator(LoginWindow v) {
- super(NAME, null);
- // TODO Auto-generated constructor stub
- this.setViewComponent(v);
- view = v;
- v.setVisible(true);
- v.btnLogin.addActionListener(new ActionListener(){
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- login();
- }
- });
- }
- private void login(){
- //得到所有用户登录的信息 就是界面上输入的信息
- User user = new User(
- view.txtName.getText(),
- view.pwdPwd.getText()
- );
- //将这个信息发送给LoginCommand.java控制器。
- //注意这个消息要在 prepControllerCommand.java中注册 建立Mediator到Command的映射关系
- sendNotification(NotiName.NOTI_LOGIN,user,null);
- }
在Mediator中 处理了所有UI中的事件 比如说为Button添加监听
并且收集数据 (收集 用户名和密码)封装到User中(自动以Object),然后发送消息给Command,把这些数据也发送出去。
此时由于刚才在PrepControllerCommand.java中注册了这个消息 对应的LoginCommand会被激活,处理这个消息。
- public class LoginCommand extends SimpleCommand implements ICommand {
- public void execute(INotification noti) {
- //根据对应的消息名字处理相关逻辑 并且调用后台(比如数据库)
- if (noti.getName().equals(NotiName.NOTI_LOGIN) == true) {
- User user = (User)noti.getBody();
- LoginProxy lp = new LoginProxy();
- if(checkLogin(user))
- lp.login(user);
- else
- sendNotification((String) NotiName.LOGIN_FAILED,"User name should not be empty!",null);
- }
- }
- private boolean checkLogin(User u){
- //username should not be empty
- if(u.getUsername() == null )return false;
- return true;
- }
- }
这里处理这个消息买并且调用Model中的Proxy。Proxy负责进行数据操作,比如得到远程服务器的数据,或者与数据库进行交互。
处理完数据后 吧数据通过消息(Notification)发送给Mediator 整个流程就完成了。
- public class LoginProxy extends Proxy{
- public static final String NAME = "LoginProxy";
- public LoginProxy() {
- super(NAME, null);
- trace.d("LoginProxy.LoginProxy()");
- }
- public void login(User user) {
- // TODO Auto-generated method stub
- //这里用来进行数据库操作 将User信息给数据库 ,并且返回信息。,返回方式 也是使用Notification
- //这里发送的Notification在Mediator中(handleNotification方法)处理 。
- //方便起见。,我这里就不写数据库操作了。
- if(user.getUsername().equals("young") )
- sendNotification(NotiName.LOGIN_SUCCESS,"login success!",null);
- else
- sendNotification(NotiName.LOGIN_FAILED,"login error ,wrong username",null);
- }
- }
Mediator在HandleNotification中处理Proxy发来的消息
pureMVC java版搭建流程的更多相关文章
- 【转】搭建Java版WebService
原文地址:http://www.cnblogs.com/jasoncc/archive/2011/12/22/2296052.html Hi,大家好! 今天主要和大家分享,如何搭建一个Web服务,做A ...
- SpringMVC框架搭建流程(完整详细版)
SpringMVC框架搭建流程 开发过程 1)配置DispatcherServlet前端控制器 2)开发处理具体业务逻辑的Handler(@Controller. @RequestMapping) 3 ...
- 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
- FILEBEAT+ELK日志收集平台搭建流程
filebeat+elk日志收集平台搭建流程 1. 整体简介: 模式:单机 平台:Linux - centos - 7 ELK:elasticsearch.logstash.kiban ...
- SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>
此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...
- 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...
- 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单
我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...
- 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token
一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...
- 第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发
第一部分:微信公众号对接的基本介绍 一.填写服务器配置信息的介绍 登录微信公众平台官网后,进入到公众平台后台管理页面. 选择 公众号基本设置->基本配置 ,点击“修改配置”按钮,填写服务器地址( ...
随机推荐
- 语言总结—C/C++
参考<程序员面试宝典> 1. 基本概念 1.1 赋值语句 例1. 按位与操作,例如:a=3,b=3,a&b值等于 0011 & 0011 结果还是0011,那么值还是3: ...
- angularjs表单中enter键提交
html页面: <form class="smart-form" id="checkout-form" searchinput> <div c ...
- 纯 CSS 实现三角形尖角箭头的实例
上次无意中发现了个使用纯 CSS 实现三角形尖角箭头的方法 http://blog.csdn.net/zhouzme/article/details/18901943 ,但没有怎么用上,也没有详细完整 ...
- L2-007. 家庭房产
L2-007. 家庭房产 题目链接:https://www.patest.cn/contests/gplt/L2-007 并查集 初学,看这题的时候完全没有什么好的想法,参考了@yinzm的blog用 ...
- python网络编程之网络主机信息
功能: 获取设备名称 方法: gethostname() 参数: 返回值:hostname(string) 功能: 获取设备ipv4地址 方法: gethostbyname() 参数: hostnam ...
- 《Mastering Opencv ...读书笔记系列》车牌识别(II)
http://blog.csdn.net/jinshengtao/article/details/17954427 <Mastering Opencv ...读书笔记系列>车牌识别(I ...
- Effective JavaScript :第四章
1.理解:prototype.getPrototypeOf和_proto_之间的不同 ①C.prototype用于建立new C()创建的对象的原型. ②Object.getPrototypeOf(o ...
- Spring Security(04)——认证简介
目录 1.1 认证过程 1.2 Web应用的认证过程 1.2.1 ExceptionTranslationFilter 1.2.2 在request之间共享Security ...
- hdu_5894_hannnnah_j’s Biological Test(打表找规律)
题目链接:hdu_5894_hannnnah_j’s Biological Test 题意: 有n个不同的位置围成一个圈,现在要安排m个人坐,每个人至少的间隔为k,问有多少种安排 题解: 先打表找规律 ...
- Codeforces Round #367 (Div. 2) C. Hard problem
题目链接:Codeforces Round #367 (Div. 2) C. Hard problem 题意: 给你一些字符串,字符串可以倒置,如果要倒置,就会消耗vi的能量,问你花最少的能量将这些字 ...