视图模型实现类(DefaultViewModel.java)的主要功能:

 1. Dataset的初始化以及数据导入

 2. 各种View组件的初始化工作

DefaultViewModel也是动态创建的,由他来管理dataset的数据分批请求操作以及dataset的数据提交操作

每一次DefaultViewModel.java被创建的时候都会触发该类中的init方法,不同的初始化方式,该方法的参数会有所不同:

init方法的申明如下:

public void init(int state) throws java.lang.Exception

其中state为一个整数值,取值不同代表客户端向服务器端发出的不同类型的请求

页面请求:state为ViewModel.STATE_VIEW

分批数据下载:state为ViewModel.STATE_SERVICE

数据提交:state为ViewModel.STATE_UPDATING

在state为ViewModel.STATE_VIEW期间:

DefaultViewModel.java在读取视图模型xml配置文件时会解析两大类的对象:

Dataset

View组件

DefaultViewModel会自动创建Dataset与Contro对象,并将xml配置中的信息读取到相关对象中,同时自动执行DefaultViewModel的方法:

initDatasets

initControls

开发人员可以通过继承实现这两个方法的实现对dataset以及control的初始化工作。

在state为ViewModel.STATE_SERVICE期间,我们可以继承DefaultViewModel的doLoadData方法自定义实现dataset的数据加载工作。

在state为ViewModel.STATE_UPDATING 期间,我们可以继承DefaultViewModel的doUpdateData方法自定义实现dataset的数据保存工作。

常用开发技巧

1. 根据权限定制菜单的内容

为了实现权限菜单功能,我们可以利用initControls方法定制menu中的内部菜单项

protected void initControls() throws Exception {
  Menu menu = (Menu)getControl("menu1");//获得视图模型已经定义的menu对象
  MenuItem item = menu.addItem("value1", "文件");//添加文件子菜单
  item.addItem("new", "新增");//在文件子菜单中添加下一级的新增子菜单项
  menu.addItem("value2", "编辑");
  menu.addItem("value3", "视图");
  menu.addItem("value4", "工具");
}

通过menu对象提供的api我们可以很容易的构造出一个多极菜单。结合权限,我们只要在该处菜单的初始化过程之前获取登录用户的信息,一般的web系统都是通过session对象获取用户的登录信息,这儿也不例外,只是调整为通过dorado的上下文对象获取:

DoradoContext context = DoradoContext();

Object user = context.getAttribute(DoradoContext.SESSION, “sessionKey”);

以上代码和

Object user = session.getAttribute(“sessionKey”);

的效果是一样的。

通过DoradoContext对象我们可以很容易的获取登录系统的用户信息,并据次初始化菜单对象中的菜单项,实现权限管理。

2.根据权限定制按钮的可见性

同开发技巧1一样

Button buttonSave = (Button)getControl(“buttonSave”);// 获得视图模型已经定义的保存数据的按钮对象

buttonSave.setIgnored(true);//设定按钮的逃逸功能为true,这样在JSP打开后,该按钮就不会在客户端显示。

同1那样,如果这儿再添加权限管理,我们可以通过DoradoContext这个上下文对象获取登录用户的信息,并根据这个信息决定是否要设定buttonSave.setIgnored(true)使它逃逸不在客户端输出。

3. 根据查询条件定制dataset的返回结果

监听器(Listener)是基于dataset提供的一个监听和管理dataset对象的创建和查询以及数据保存的动作。事件对应列表:

Dataset事件

Listener事件

init

onInit

createFields

beforeCreateFields

afterCreateFields

loadData

beforeLoadData

afterLoadData

updateData

beforeUpdateData

afterUpdateData

l   boolean beforeCreateFields(Dataset dataset)

当Dataset将要自动创建所有字段之前触发的事件.即当调用Dataset.createFields()之前触发的事件.

l   boolean beforeLoadData(Dataset dataset)

当Dataset将要装载数据之前触发的事件.即当调用Dataset.loadData()之前触发的事件.

l   boolean beforeUpdateData(Dataset dataset)

当Dataset将要装载数据之前触发的事件.即当调用Dataset.update()之前触发的事件.

以上listener的所有before方法都需要提供一个boolean的返回值,dorado根据这个返回值确定是否需要执行默认的initFields,loadData, updateData方法

Dataset与listener之间的关系,由dataset的管理者对象维护,在dorado中一般为视图模型或者数据坞对象,在视图模型或则数据坞中配置dataset对象时,通过listener属性管理监听器对象。

<Dataset
id="datasetSection"
type="Wrapper"
wrappedType="Sql"
dataSource="DIRWH"
originTable="DIR_Section"
keyFields="ID"
listener="sample.DatasetSectionListener" />

监听器是继承com.bstek.dorado.data.AbstractDatasetListener的实现类。

如果我们想自定义datasetSection的数据导入,对于DB类型的Dataset对象,我们可以通过监听器的beforeLoadData方法动态修改dataset的sql语句,让dataset的loadData方法执行使用beforeLoadData中定义的sql语句执行查询。

这样我们就应该创建一个新的监听器DatasetSectionListener.java继承与com.bstek.dorado.data.AbstractDatasetListener,并实现其中的beforeLoadData方法:

public boolean beforeLoadData(Dataset dataset) throws Exception {
  String city = DoradoContext.getContext().getAttribute(DoradoContext.VIEW, “city”);//从Dorado的上下文环境中获取城市信息
  String sql = “select * from section where city=’+city+”’”;//根据城市拼写地区的sql
  SqlDataset sqlDataset = (SqlDataset)dataset;//由于当前操作的对象转换为SqlDataset类型进行操作
  sqlDataset.setSql(sql);//对Sql类型Dataset对象设置sql语句
  return true;//返回true,通知dataset继续执行默认的标准查询动作,并使用当前设定好的sql语句进行查询
}

最后在视图模型的dataset的xml配置文件中设定dataset的listeners属性,设定的时候要注意要设置listener的全路径,包含java package的申明,如:

<Dataset
id="datasetSection"
type="Wrapper"
wrappedType="Sql"
dataSource="DIRWH"
originTable="DIR_Section"
keyFields="ID"
listener="sample.DatasetSectionListener" />

dorado中的视图实现类和监听器的更多相关文章

  1. DRF (Django REST framework) 中的视图扩展类

    2. 五个扩展类 1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法 ...

  2. Thinkphp源码分析系列(九)–视图view类

    视图类view主要用于页面内容的输出,模板调用等,用在控制器类中,可以使得控制器类把表现和数据结合起来.下面我们来看一下执行流程. 首先,在控制器类中保持着一个view类的对象实例,只要继承自控制器父 ...

  3. .NET中的视图和过滤器 (DefaultView和RowFilter)

    NET中的视图和过滤器 (DefaultView和RowFilter) ADO.NET中有一层对象,用来创建任意数据源的抽象模型.其中包括DataSet,DataTable,DataRow,DataV ...

  4. [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. ThinkPHP中的视图

    ThinkPHP中的视图View 1.什么是视图View 所谓的视图就是用户可视化操作界面. 2.视图View组成 view类(模板引擎类似Smarty) 模板文件(html模板) 3.视图的定义 默 ...

  6. 将Eclipse中现有的java类生成类图

    需求:将Eclipse中现有的java类生成类图 一:什么是ModelGoon? 它是一个Eclipse插件,用于基于UML图的模型设计,以及逆向工程(即从已有源代码生成类图). 二:安装 下载Mod ...

  7. 关于SWT中的表格(TableViewer类)

    JFace是SWT的扩展.它提供了一组功能强大的界面组件.其中包含表格,树,列表.对话框,向导对话框等. 表格是一种在软件系统中很常用的数据表现形式.特别是基于数据库的应用系统.表格更是不可缺少的界面 ...

  8. Django框架中的视图和模板

    视图views django中的视图就是用来定义函数来处理一些逻辑的核心地方. django中通过urls来建立路径跟views中的视图函数的映射关系. urls中的映射关系 ''' urlpatte ...

  9. 【ASP.NET Core】MVC中自定义视图的查找位置

    .NET Core 的内容处处可见,刷爆全球各大社区,所以,老周相信各位大伙伴已经看得不少了,故而,老周不考虑一个个知识点地去写,那样会成为年度最大的屁话,何况官方文档也很详尽.老周主要扯一下大伙伴们 ...

随机推荐

  1. [置顶] getenv、setenv函数(获取和设置系统环境变量) 与 环境变量

    1.getenv() 函数名: getenv 功 能: 从环境中取字符串,获取环境变量的值 头文件: stdlib.h 用 法:char *getenv(char *envvar); 函数说明:get ...

  2. IOCP编程原理(转)

    在我的博客之前写了很多关于IOCP的“行云流水”似的看了让人发狂的文章,尤其是几篇关于 IOCP加线程池文章,更是让一些功力不够深厚的初学IOCP者,有种吐血的感觉.为了让大家能够立刻提升内力修为,并 ...

  3. form(去掉关闭按钮,禁止调整大小)

    禁止Form窗口调整大小方法:FormBorderStyle 设为FixedSingle: 不能使用最大化窗口: MaximuzeBox 设为False: 不能使用最小化窗口:   MinimizeB ...

  4. IRedisClient

    事实上,IRedisClient里面的很多方法,其实就是Redis的命令名.只要对Redis的命令熟悉一点就能够非常快速地理解和掌握这些方法,趁着现在对Redis不是特别了解,我也对着命令来了解一下这 ...

  5. 没有dig命令的结觉方法

    -bash: dig: command not found rpm -qa bind-utils 查看没有没安装 bind-utils 包 yum install -y bind-utils 解决

  6. 【Android 多媒体应用】使用 TTS

    import java.util.Locale; import android.app.Activity; import android.os.Bundle; import android.speec ...

  7. openGL 预定义变量04

    OpenGL4.0 GLSL预定义变量 GLSL为不同的渲染阶段定义了一些特定的变量.这些预定义(也叫做内置变量)有特定的属性. 所有的预定义变量都以gl_开头.用户定义的变量不能以此开头. 下面分类 ...

  8. hadoop再次集群搭建(4)-Cloudera Manager Installation

       决定选择 Cloudera Manager 进行安装,阅读官方文档,掌握大概脉络.         Cloudera Manager在集群已经实现ssh免秘钥登录,能够访问网络资源和本地资源的情 ...

  9. ElasticSearch入门一

    ElasticSearch入门一 1 安装ElasticSearch,配置环境变量,并且存在Java环境,而且是Java环境: 下图是安装的目录: 进入bin目录之后,请看bin目录: 启动elast ...

  10. 第4章 springboot热部署 4-1 SpringBoot 使用devtools进行热部署

    /imooc-springboot-starter/src/main/resources/application.properties #关闭缓存, 即时刷新 #spring.freemarker.c ...