dorado中的视图实现类和监听器

视图模型实现类(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" />
时间: 2024-10-10 18:23:15

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

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

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

ThinkPHP中的视图

ThinkPHP中的视图View 1.什么是视图View 所谓的视图就是用户可视化操作界面. 2.视图View组成 view类(模板引擎类似Smarty) 模板文件(html模板) 3.视图的定义 默认视图的定义规则: ./项目目录/Home或Admin模块下的View文件夹/Public控制器名称/login操作方法.html ① 在控制器中定义相关操作方法,如下图所示: ② 在./Application/Admin/View/Public文件夹下创建login.html模板文件 ③ 显示效果

Spring 开发中用到几个类,监听器总结

MethodInvokingFactoryBean 通过MethodInvokingFactoryBean工厂Bean,可以将指定方法返回值注入成为目标Bean的属性值,MethodInvokingFactoryBean用来获得指定方法的返回值,该方法可以是静态方法 ,也可以是实例方法. 获得的方法返回值既可以被注入到指定Bean实例的指定属性,也可以直接定义成Bean实例. <bean id="sessionHolder" class="org.springframe

[刘阳Java]_Spring MVC中的视图解析器_ViewResolver_第5讲

所有的We MVC框架都有一套它自己的解析视图的机制,Spring MVC也不例外,它使用ViewResolver进行视图解析,让用户在浏览器中渲染模型.ViewResolver是一种开箱即用的技术,能够解析JSP.Velocity模板和XSLT等多种视图. Spring处理视图最重要的两个接口是ViewResolver和View.ViewResolver接口提供了视图名称和真正的视图之间的映射: 而View接口则是将真正的视图呈现给用户. 常用的ViewResolver有如下几种 Intern

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

ADO.NET中有一层对象,用来创建任意数据源的抽象模型.其中包括DataSet,DataTable,DataRow,DataView,DataRelation等等. 所有这些对象都定义在System.Data名字空间.它们形成一个抽象模型,使得无论针对Windows Form,Web Form还是Web Service进行编程,都可以使用相同的编程接口.在实际应用中,这些对象大多会对诸如SQL Server一类的关系型数据库中的数据进行操作.但是,它们可以处理各种数据,而不管它的物理存储媒介.

SQLserver中的视图与主外键的创建

一.背景 原来学过数据库的相关内容,只是形式上的,从来也没有实践过,徐徐飘过而已,如今在做机房时,很多知识需要用到视图,才开始去慢慢的实践. 视图:我理解的就是一张表,它把我们所需要的某个表或某几个表中的部分信息提取出来,形成了一张临时的表. 它主要有两个优点:1.简单,它呈现给我们的数据就是我们想要的数据,没有多余的. 2.安全,提供给用户它们权限范围内的数据 我为什么会用到视图?举一个简单的例子,在查询用户信息时,我们可能会用到两张表中的内容.那么这个时候我就需要将两张表中我需要的数据提取出

NHibernate之旅(14):探索NHibernate中使用视图

本节内容 引入 1.持久化类 2.映射文件 3.测试 结语 引入 在数据库操作中,我们除了对表操作,还有视图.存储过程等操作,这一篇和下篇来学习这些内容.这篇我们来学习如何在NHibernate中使用视图.首先,我们在数据库中建立一个名为viewCustomer视图,选中CustomerId.Firstname.Lastname.OrderId.OrderDate项. 下面我们依次为这个视图编写持久化类和映射吧. 1.持久化类 同持久化数据库中的表类似,我们需要对视图持久化,定义视图中的每个属性

007.Adding a view to an ASP.NET Core MVC app -- 【在asp.net core mvc中添加视图】

Adding a view to an ASP.NET Core MVC app 在asp.net core mvc中添加视图 2017-3-4 7 分钟阅读时长 本文内容 1.Changing views and layout pages 修改视图和布局页 2.Change the title and menu link in the layout file 在布局文件中修改标题与菜单 3.Passing Data from the Controller to the View 从控制器向视图

Android中自定义视图View之---前奏篇

前言 好长时间没写blog了,心里感觉有点空荡荡的,今天有时间就来写一个关于自定义视图的的blog吧.关于这篇blog,网上已经有很多案例了,其实没什么难度的.但是我们在开发的过程中有时候会用到一些自定义的View以达到我们所需要的效果.其实网上的很多案例我们看完之后,发现这部分没什么难度的,我总结了两点: 1.准备纸和笔,计算坐标 2.在onDraw方法中开始画图,invalidate方法刷新,onTouchEvent方法监听触摸事件 对于绘图相关的知识,之前在弄JavaSE相关的知识的时候,