Dorado 5 : 17.3.常用的dorado工具类 (RF1)

PagingHelper

dorado的CustomDataset,DODataset,MarmotDataset等实现分批数据下载功能时,需要按照dataset的需要提供其相应的数据以及要告诉dataset本次查询结果的总页数信息,典型代码(如Hibernate)如下:

int pageSize = dataset.getPageSize();
int pageIndex = dataset.getPageIndex();
List employees = query.list();//获取所有的数据
...根据pageSize,pageIndex计算employees中符合条件的数据
dataset.fromDO(employees.subList(pageSize*(pageIndex-1), pageSize*pageIndex));//这里还要考虑pageIndex,pageSize为零的处理,整数处理
dataset.setPageCount(employees.size()/pageSize);//这里需要考虑为零的处理,整数处理

com.bstek.dorado.data.PagingHelper用于对List类型的数据提供分页计算的工具类。
构造函数如下:

PagingHelper(int pageSize, int pageIndex) //构造器
PagingHelper(int pageSize, int pageIndex, int totalRow) //构造器

根据给定的pageSize,pageIndex可以计算出起始序号与结束序号,以及根据总记录数计算总页数等功能。
常用功能:

int getFromIndex() //返回当前页记录的起始序号。
int getPageCount() //返回总页数。
int getToIndex() //返回当前页记录的结束序号。

采用PagingHelper之后,范例代码如下:

List employees = query.list(); // 通过逻辑层获得完整的结果集
PagingHelper paging = new PagingHelper(dataset.getPageSize(), dataset.getPageIndex(), employees.size());
List employees = employees.subList(paging.getFromIndex(), paging.getToIndex()); // 当页的记录
dataset.fromDO(employees);
dataset.setPageCount(paging.getPageCount());

ConnectionHelper

dorado中在datasource.xml中配置常用的数据连接可以通过工具类
com.bstek.dorado.common.ds.ConnectionHelper访问

Connection conn = ConnectionHelper.getConnection(String datasoruce);

指定datasource.xml文件中配置的datasource获得相应的Connection对象,datasource.xml文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<datasource name="doradosample" type="JDBC">
<minEvictableIdleTimeMillis>30000</minEvictableIdleTimeMillis>
<timeBetweenEvictionRunsMillis>30000</timeBetweenEvictionRunsMillis>
<driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://127.0.0.1:3306/doradosample</url>
<dialect>com.bstek.dorado.data.db.dialect.MySQLDialect</dialect>
<user>root</user>
<password>dorado</password>
<minIdle>0</minIdle>
<maxIdle>0</maxIdle>
<maxActive>0</maxActive>
<loginTimeout>0</loginTimeout>
<maxWait>0</maxWait>
</datasource>
</datasources>

ConnectionHelper还提供了getDefaultConnection方法获取Connection:

Connection conn = ConnectionHelper.getDefaultConnection();

该方法自动从setting.xml文件的common.defaultDataSource获取默认的数据源:

<property name="common.defaultDataSource" value="doradosample"/>

DoradoContext

com.bstek.dorado.common.DoradoContext:Dorado上下文对象。
此对象用于屏蔽用户的逻辑代码对Http的依赖, 保证代码的可移植性.
对于基于Http的应用, 我们建议您在逻辑代码中尽可能使用此对象替代对Request对象的访问.可以 使用如下代码获取DoradoContext:

DoradoContext context = DoradoContext.getContext();

注意:DoradoContext内部通过线程来标识不同的Context,以保证每个线程在调用 DoradoContext.getContext()时可以获的正确的Context对象. 该机制在绝大多数的Web应用的服务端代码中都不会有任何问题.
但是如果在一个多线程任务中使用DoradoContext.getContext()将无法获得预期的效果, 因此我们建议在启动多线程任务之前应首先将要访问的资源从Context中取出并传入到线程中.
但是通过DoradoContext也可以存取HTTP中的相关信息,分别提供了对HttpServletRequest, HttpSession, HttpServletContext等对象的属性存取工作。
DoradoConext提供了以几个方法存取HTTP中的信息:
根据指定的作用域从上下文中获取一个属性的值:

public java.lang.Object getAttribute(int scope, java.lang.String key)

为指定的作用域中的某个属性设定一个值:

public abstract void setAttribute(int scope,
java.lang.String key,
java.lang.Object object)

其中scope属性的取值:

取值范围

等值于

DoradoContext.REQUEST

Request范围(HttpServletRequest)

DoradoContext.SESSION

Session范围(HttpSession)

DoradoContext.APPLICATION

Application范围(ServletConext)

DoradoContext.View

View范围

以及方法:

public java.lang.Object getAttribute(java.lang.String key)

从上下文的Request作用域中获取一个属性的值.对于基于Http的应用而言, 可以通过此方法来获取HttpServletRequest中的参数(Attribute)。
方法:

public java.lang.String getParameter(java.lang.String key)

从上下文中获取一个参数的值.对于基于Http的应用而言, 可以通过此方法来获取HttpServletRequest中的参数(Parameter)。

HttpDoradoContext

dorado中用com.bstek.dorado.common.DoradoContext屏蔽用户的逻辑代码对Http的依赖,但我们还是可以通过HttpDoradoContext获得HttpServletRequest对象,使用方法如下:

HttpDoradoContext context = (HttpDoradoContext)DoradoContext.getContext();
HttpServletRequest request = context.getRequest();

Log

dorado的系统日志类,位于com.bstek.dorado.common.log包下。

使用

与log4j的使用基本类似。

Log.error(java.lang.Object o);
Log.debug(java.lang.Object o);
Log.fatal(java.lang.Object o);
Log.info(java.lang.Object o);
...

集成到Log4J中

在log4j.properties中可以通过如下方式设置dorado的log日志等级设定:

Com.bstek.dorado.common.log.Log=DEBUG

MessageHelper

com.bstek.dorado.common.MessageHelper是用于处理Message的工具类.
对于普通的Http请求而言,利用MessageHelper设置的消息可以通过 <d:MessageIterator>和<d:Message>显示到JSP中。使用方法如下:
第一步在action中加入相关信息

MessageHelper.addMessage(DoradoContext.getContext(), "密码错误!");
MessageHelper.addMessage(DoradoContext.getContext(), "用户登陆失败!");

第二步在JSP中添加如下的标签:

<d:MessageIterator>
<li><d:Message /></li>
</d:MessageIterator>

对于Dorado的RPC调用而言(包含Dataset的动态数据加载和数据提交的Server段逻辑代码), 利用MessageHelper设置的消息将自动在RPC调用成功之后在Client端以弹出提示的方式显示给用户. 而其他其它消息会被Client端忽略。使用范例如:

MessageHelper.addMessage(DoradoContext.getContext(), "记录保存成功!");

VariantSet

可支持多种类型的对象集合。其功能类似于一个功能增强了的Map。dorado中的DBStatement,DOUtils等工具类的编程中会用到该对象,另外在dorado的一些参数集合中也会用到,例如View的properties(), Dataset的parameters()以及Field的properties()等都是以com.bstek.dorado.utils.variant.VariantSet为基类处理的。
与Map不同的是:

类型处理

VariantSet提供了类型的处理,如下的Map代码:

String empId = (String)map.get("empId");

使用VariantSet之后就可以用如下的代码访问:

String empId = variantSet.getString("empId");

VariantSet支持的数据类型有:
java.math.BigDecimal
boolean
byte
int
java.util.Date
double
float
long
short
java.lang.String
java.lang.Object
com.bstek.dorado.utils.variant.Variant
以上类型中Variant是dorado提供的一种用于包装以上列表中其他数据类型的特殊类型。也提供了数据类型处理功能:

Variant v = new Variant();
v.setValue("ANLIN");
String empId = v.getString();
v.setValue(3000);
int num = v.getInt();

基本管理函数

另外VariantSet还提供了其他几个函数用与Map的对应表如下:

VariantSet

Map

count();

size();

clear();

clear();

equasl(Object o);

equals(Object o);

exists(String name);

containsKey(Object key);

VariantSet值存取操作

Map获取一个键值的代码:

Map m = new HashMap();
m.put("empId", "ANLIN");
String empId = (String)map.get("empId");

使用VariantSet可以用如下的代码访问:

VariatnSet v = new VariantSet();
v.setString("empId", "ANLIN");
String empId = v.getString("empId");

另外,VariantSet还支持索引访问:

VariatnSet v = new VariantSet();
v.setString("empId", "ANLIN");
v.setInt("num", 3000);
String empId = v.getString(0);
int num = v.getInt(1);

主键差异

Map对主键没有类型要求,VariantSet要求主键必须为String类型。

Setting

com.bstek.dorado.common.Setting 为dorado项目中存取setting.xml文件的工具类。
可以通过如下的代码访问和修改:

int maxCount = Setting.getInt("i18n.cache.maxCount");

修改:

Setting.setInt("i18n.cache.maxCount", "250");

Setting工具类一般来说属于系统使用,项目中不会轻易的接触该工具类,由于Setting.xml文件一般来说都属于整个工程中通用的,并且一般不需要动态的变动修改,因此建议Setting类以getXXX()的使用方式为主,只读不存。

UniqueKey

GUID(全球唯一标识)是微软使用的一个术语,由一个特定的算法,给某一个实体,如Word文档,创建一个唯一的标识,GUID值就是这个唯一的标识码。
com.bstek.dorado.utils.UniqueKey是生成全球唯一的GUID的工具类:

String key = UniqueKey.getKey();









(完)