TRS+WCM二次开发文档Word格式.docx
- 文档编号:5132014
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:65
- 大小:1.14MB
TRS+WCM二次开发文档Word格式.docx
《TRS+WCM二次开发文档Word格式.docx》由会员分享,可在线阅读,更多相关《TRS+WCM二次开发文档Word格式.docx(65页珍藏版)》请在冰点文库上搜索。
见##X.##x():
为参考工程中实例方法
1.6我们的建议
在阅读和学习本文档时,我们建议您注重以下方面:
1.从设计原理上去理解和把握WCM解决关键问题的思路和方法;
2.多做练习,在练习中理解WCM对象模型的体系结构和建构原则,并熟练应用该模型解决实际问题和扩展应用。
3.在较短的时间,迅速完成本文档中所有涉与到的关键性开发问题;
如果把一切问题都留待实际应用开发中去做,往往会事倍功半。
2阅读前的准备
2.1安装TRSWCMV65应用
2.2安装Eclipse
2.3导入TRSWCMDeveloper工程
1.从FTP上下载工程
2.在Eclipse中导入工程
3.修改工程中数据库配置文件,指向新装的WCM数据库
4.修改工程的注册码,将WCM65应用中的注册码更新到工程中
2.4Example中示例方法运行方法
如以下图所示,在方法上点击回右键RunAs→JUnitTest
3WCM持久化实现
3.1概述
应用系统首先需要解决持久化问题,就是如何将关系数据库中的数据转换成Java对象;
很多系统利用Hibernate开源框架解决,WCM开发平台是自主研发的持久化框架。
她的特点是“集合、元素”、“分页载入”、“先载入ID再读取数据”、“拆分SQL”
如何利用WCM持久化框架操作关系数据库中的数据是一切的基础,所以读懂和扩展WCM先从这里开始。
3.2集合和元素初始
一条查询语句会查询出多条数据,如以下图所示,WCM持久化框架这样描述查询结果:
●每一个表对于一类集合和元素对象,WCMDocument表对应的为Documents和Document,有s表示是集合对象;
●WCM对应的表都有一个ID字段(每个表的字段名一般都不一样)、创建者(CrUser)、创建时间(CrTime)
●一个WCMFilter对象的实例描述一条查询语句;
●一个集合对象的实例描述查询的结果;
●单条元素对象的实例描述单条记录;
●元素对象的属性描述记录中的字段值;
对应的代码为(见工程中的QueryDocuments.query1方法):
//1构造查询语句(注:
集合和元素都知道自己管理那表,所以第一个参数From可以不用输入)
WCMFilterfilter=newWCMFilter("
"
"
DocId>
=1andDocId<
=10"
DocTitle,DocId,CrUser"
);
//2发出查询请求,获取结果对应的集合
Documentsdocuments=Documents.openWCMObjs(null,filter);
//3遍历集合,输出每条记录的数据
for(inti=0,nSize=documents.size();
i<
nSize;
i++){
Documentdocument=(Document)documents.getAt(i);
if(document==null)
continue;
//元素的属性提取方法1:
对象定义的方法get##X获取
System.out.println("
Doctitle:
+document.getTitle());
//元素的属性提取方法2:
通用方法getProperty(##X)获取
//其中##X为字段名,不区分大小写
System.out.println("
+document.getProperty("
DocTitle"
));
}//ENDFor
3.3集合和元素进阶
◆集合对象是CMSBaseObjs的子类,元素对象是CMSObj的子类;
◆CMSBaseObj(s)是BaseObj(s)的子类,他主要负责与用户有关的行为,比如对象的锁定等等
◆每个元素的实例在部定义了一个Hashtable,存放从数据库查询的数据,字段名是Key,字段值是Value
◆集合和元素的find、save、insert、update、delete、remove均会调用父类中方法与数据库交互,产生预期的结果,与数据库操作都定义在超级父类BaseObj(s)中,使用者不用关心数据库细节
◆与数据库耦合主要在于WCMFilter(查询语句的构造上)
◆元素对象都必须以公开静态常量的方式定义对应的表和ID字段名,ID的字段类型必须是整型
3.4集合和元素的产生
可利用WCMStudio产生,WCMStudio从网获取;
只能运行在Windows环境中;
3.4.1配置Ant运行环境
◆下载Ant介质,解压
◆将Ant配置到系统的Path中
◆进入cmd窗口,运行ant命令看到如下结果,证明成功,否则重新配置:
3.4.2利用WCMStudio产生代码
◆下载介质,解开直接点击运行
◆在右侧Project节点点击右键→新建Package
◆在新的Package上点击右键→新建JavaBean
◆点击新的对象,依次在属性列表过右键“添加”新建属性,其中页面显示不关注:
◆点击保存,然后点击生成代码,系统将产生:
⏹元素和集合对应的Java类(在。
\TRS.WCM.Dev\src中)
⏹创建数据库的脚本
3.5查询SQL描述对象——WCMFilter
WCMFilter的实例描述将要查询的语句,最常用的构造函数为四个参数的构造函数,分别对应于查询语句中的四部分:
From、Where、Order、Select;
其中:
这四部分的关键字都不能在参数中设置
From如果不指定,默认为持久化对象对应的表名;
Select不指定,默认为
//错误的代码1,带了关键字Where和Select
WhereDocId>
=1"
SelectDocTitle,DocId,CrUser"
//错误的代码2,Where和Order反了
"
DocIddesc"
一般为了规避SQL注入,不再推荐见Where中直接写查询条件,需要改为?
的方式,比如查询辉创建的文档,ID小于10的WCMFilter建议这么写:
WCMFilterfilter=newWCMFilter("
CrUser=?
DocId<
=?
filter.addSearchValues("
辉"
filter.addSearchValues(10);
会引起SQL注入的写法:
CrUser='
辉'
andDocId>
3.6查询读取指定条件的数据
实现步骤:
1.了解要操作的表对应的集合对象(比如文档对应为Document),见附录1:
附录1:
WCM常用的持久化对象与对应的表
2.构造查询语句并设置查询用到的参数
3.通过对应的集合对象发出查询请求,获取结果对应的集合
4.遍历集合,逐个读取元素的属性
如何分页显示见常见问题描述章节:
如何分页读取集合数据
示例代码(读取admin发布的ID小于10的文档),见DocumentExample.query2():
//1构造查询语句并设置Where用到的参数
admin"
//2通过对应的集合对象发出查询请求,获取结果对应的集合
//元素的属性也可通过get##X获取
}//ENDFor
3.7删除指定的数据
1.获取需要删除的数据对应的集合或者元素
2.调用集合或者元素的删除方法(集合是:
removeAll元素是:
delete),发出删除请求
示例代码1(删除多个ID的文档,DocumentExample.deleteObjects()):
//0获取当前操作的用户,此处假定为admin
UserloginUser=User.findByName("
//1获取需要删除的文档ID序列
StringsDeleteDocumentIds="
23,45,67"
;
Documentsdocuments=Documents.findByIds(loginUser,sDeleteDocumentIds);
//2发出删除请求
documents.removeAll(true);
示例代码2(删除指定ID的文档,DocumentExample.deleteObject()):
//1获取需要删除的文档
intnDeleteDocId=23;
Documentdocument=Document.findById(nDeleteDocId);
document.delete(loginUser);
3.8新增数据
1.产生元素对象的实例
2.设置元素的属性
3.调用save方法保存
示例代码(新增文档:
DocumentExample.insertDocument()):
//1产生元素对象的实例
Documentdocument=Document.createNewInstance();
//2设置必要的属性
document.setTitle("
刚刚新增的文档"
document.setPropertyWithString("
//也可以采用这样的通用方法设置属性
document.setChannel(43);
document.setContent("
正文容"
document.setHtmlContent("
<
b>
加粗的字体<
/b>
测试图文混排的正文"
//3执行保存操作,插入到数据库中
document.save(loginUser);
3.9修改数据
1.根据ID获取元素对象的实例
2.判断是否可以修改,如果可以修改同时锁定,不可以抛出异常
3.修改元素指定的属性
4.调用save方法保存入库
示例代码(修改指定文档的标题:
.trs.example.DocumentExample.updateDocument()):
intnDocId=23;
Documentdocument=Document.findById(nDocId);
//2判断是否可以修改,如果可以修改同时锁定,不可以抛出异常
document.validCanEditAndLock(loginUser);
//3修改标题
这篇文档我修改了一下标题,呵呵,加入一个标记"
+System.currentTimeMillis());
//4执行保存操作,将所做修改保存入库
document.save(loginUser);
3.10集合常用操作
3.10.1判断指定ID是否在集合中
相关方法:
BaseObjs.indexOf(int)
示例代码:
//判断指定文档集合是否包含ID为23的文档
booleanbExists=(documents.indexOf(nDocId)>
=0);
3.10.2获取指定位置的元素
BaseObjs.getAt(int)
//获取指定文档集合中第三条记录的文档
intnIndex=2;
Documentdocument=(Document)documents.getAt(nIndex);
3.10.3获取指定ID的元素
BaseObjs.getById(int)
//获取指定文档集合中指定文档Id为23的文档
Documentdocument=(Document)documents.getById(nDocId);
3.10.4从集合中移除指定位置的元素,不从数据库删除
BaseObjs.removeAt(int,boolean)
//移除指定文档集合中第三条记录的文档
documents.removeAt(nIndex,false);
3.10.5从集合中移除指定ID的元素,不从数据库删除
BaseObjs.remove(int,boolean)
//移除指定文档集合中ID为23的文档
documents.remove(nDocId,false);
3.11元素常用操作
3.11.1根据ID获取指定元素对象
findById(int)
示例代码(所有元素对象都要求定义了这个方法):
3.11.2判断指定对象是否可以被当前用户修改
所有元素对象都支持锁定操作,防止被其它用户修改,如果A用户锁定了指定元素对象D,那么B用户就不可以修改指定元素对象D;
支持锁定的元素对象一般都是从CMSObj继承而来
CMSObj.canEdit(User)
//2判断是否可以修改
booleanbCanEdit=document.canEdit(loginUser);
3.12数据类型
WCM所有元素对象都是从BaseObj继承而来,支持:
●通过通用方法getProperty读取属性
●通过通用方法setProperty设置属性
和数据库中字段类型对应关系见附录:
附录2:
数据类型
3.13如何操作没有对应持久化对象的表
按照WCM开发平台约定,WCMDB中所有的表都有对应的集合和元素,但是不可避免有些表没有对应的JAVA对象,为了解决这类问题,系统提供一个通用的集合和元素对象:
集合:
.trs.infra.persistent.CMyResultSets
元素:
.trs.infra.persistent.CMyResultSet
示例代码(查询文档com.trs.example.CMyResultSetsExample.queryDocuments()):
//指定查询的SQL
StringsSQL="
selectDocTitle,DocIdfromwcmdocumentwheredocid<
10010anddocid>
10000"
//指定这次查询相关的SQL
//如果确定这次查询没有明确ID字段,系统支持将记录行号作为ID
StringsIdFieldName="
docid"
//发出查询获取集合
CMyResultSetsaMyResulteSets=newCMyResultSets();
aMyResulteSets.open(sSQL,sIdFieldName);
//遍历输出结果
logger.info("
find["
+aMyResulteSets.size()+"
]record!
for(inti=0;
aMyResulteSets.size();
CMyResultSetaObj=(CMyResultSet)aMyResulteSets.getAt(i);
if(aObj==null)
aObj.doctitle:
+aObj.getPropertyAsString("
aObj.docid:
DocId"
}
3.14常犯错误
3.14.1构造WCMFilter包含关键字
3.14.2构造WCMFilter时SQL各部分顺序反了
3.14.3构造WCMFilter时漏了要提取的字段
//错误代码3:
需要提取的字段没有在Select中
WCMFilterfilter3=newWCMFilter("
DocId,CrUser"
Documentsdocuments=Documents.openWCMObjs(null,filter3);
//这时取出的Title肯定为Null,虽然文档有标题,Filter没有指定
3.14.4构造WCMFilter时指定的字段在元素对应的表中不存在
//错误代码4:
指定的字段在元素对应的表中不存在,读取集合的时候老没有出现结果,但是后台有异常
WCMFilterfilter4=newWCMFilter("
DocTitle2,DocId,CrUser"
documents=Documents.openWCMObjs(null,filter4);
if(document==null){
//永远是走到这个逻辑上
WCMFilter设置错误?
?
}
//永远走不到这个逻辑
在后台将会看到这样的异常输出:
[ERR-1100]装载指定页(0)失败(.trsponents.wcm.content.persistent.Documents.ensurePageLoaded)
--[ERR-40]装载指定页失败(.trsponents.wcm.content.persistent.Documents.loadPage):
SQL=selectDocTitle2,DocId,CrUserfromWCMDOCUMENTwhereDOCIDin(?
?
)
--java.sql.SQLException:
列名'
DocTitle2'
无效。
3.14.5根据ID获取元素采用集合方式
低效方法(采用开集合的方式):
DocId=2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TRS WCM 二次开发 文档
![提示](https://static.bingdoc.com/images/bang_tan.gif)