TRS+WCM二次开发文档_第1页
TRS+WCM二次开发文档_第2页
TRS+WCM二次开发文档_第3页
TRS+WCM二次开发文档_第4页
TRS+WCM二次开发文档_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、trs+wcm二次开发文档trs wcm二次开发文档第1页1文档概述7ii文档的建立71.2 文档的适用范围71.3 文档的组织71.4 文档的目标81.5 文档术语91.6 我们的建议92阅读前的准备102.1 安装 trs wcm v65 应用102.2 安装 eclipse102.3 导入 trs wcm developer 工程102.4 运行方法10101011133 wcm持久化实现3.1 概述3.2 集合和元素创3.3 集合和元素进阶3.4 集合和元素的产生14341配置ant运行环境143.4.2 mwcmstudio7/e153.5 查询sql描述对象wcmfilter.16

2、trs wcm二次开发文档第3页3.6查询读取指定条件的数据20212222233.10.1判断指定id是否在集合中233.10.2.获取指定位置的元素3.7 删除指定的数据3.8 新增数据3.9 修改数据3.10 集合常用操作26243.10.3获取指定id的元素24310.4从集合中移除指定位置的元素,不从数243.10.5从集合中移除指定id的元素,不从数据3.11 元素常用操作253.11.1.根据id获取指定元素对象253.2判断指定对象是否可以被当前用户修改253.12数据类型trs wcm二次开发文档第3页3.13如何操作没有对应持久化对象的表3.14 常犯错误24253.14.

3、1 构造wcmfilter包含关键字253.14.2 构造wcmfilter时sql各部分顺序反了263.14.3 .构造wcmfmer时漏了要提取的字段263.14.4 构造wcmfilter时指定的字段在元素对应的表中不存在.26273.14.6.查询数据采用了低效方式28.权限判断返回不是预期的值3.14.5 根据业争取元素采用集合方式3.14.8 集合移除操作需要从后往前29303.15 常见问题3.15.1 每次会否需要领用户303.15.2.如何分页读取集合数据303.75.3 多表联合查询怎么办313.15.4.不同的查询条件和排序条件如何合并31345.5如何

4、规避sql注入323.15.6是否支持从其它表中提取数据323.15.7.如果查询语句要有333.15.8.如果新增段,如果使用象读取3059构时候是指定三个参数会出现什么情况.4 wcm分层介绍344.1持久层4.2业务层4.3服务层3435365如何使用服务层375.1概述37trs wcm二次开发文档第35页5.2使用步骤4153实战1获取固定栏目的文档415.4 实战2汨文档455.5 实战3处理参数和服务要求的参数名不一致475.6 实战4仅显示状态为已发的文档.485.7 实战5使用多个服务516如何撰写服务层536.1撰写步骤536.l1实现合适的接口iservicep,ouid

5、er或者其 壬类536.l3撰写服务层测试用例、5355556.l2撰写配置文件6.2常用api6.2.1 保存法中将传入的参数都设置到对象中.6.2.2 查询(query)服务中将页面传入的参数56组合成wcmfilter7在 wcm 中注入项目特性578给wcm换一个表现575757582hello,北9置标扩展9.2理解trs wcm 置标9.1阅读建议9.3 置标解析器(parser) 9.5如何获取置标上设置的属性9.4 ahhello, world!京/上海/广州!9.6 如何获取置标所处语境页面对象的信息-hello,站点 xxx/栏目 xxx/文档 xxx!99.7 如何获取置

6、标所处语境当前相关对象的信息显示文档作者的联系电话9.8 wcm置标属性规范981 id9.8.1 field983num9.8.4 autoformatautoformattype9.9 常用的方法991根据置标id上设置的属性获取相关的栏 旦169.9.2根据置标设置的属性获取相关的栏且171818993获取当前页面所在路径994获取指定对象的http路径、9.95 获取文档的httpurl (第一页)18 996计算一个地址相对于当前页面的相对地 址189.96 8按照置标属性设定的要求转义字符串.189.97 9将文件分发到分发点上199.98 10将置标可以很指定的栏目建立触发发布

7、,2210附录23101附录1: wcm常用的持久化对象及对应 的表2310.2 附录2:数据类型2410.3 附录3:服务调用对象jsprequestprocessor26常用fao27104 附录 4: publishtagcontext 常用介绍3010.4.1获取置标属性set attribute)3010.4.2 获取置标所处语境页面对象(火 etpaweelement) 3110.4.3 获取置标所处语境当前对象(getupperhost) 32trs wcm二次开发文档trs, 2011-02-201文档概述1. 1文档的建立/本文档是专门针对wcm产品的二次开发 而编写的指导性

8、手册;它从设计原理和应用 实践两个方面详细阐述了有关二次开发中 所涉及的问题。,本文档是由trs wcm产品开发组共同建 立和维护的。在实际的应用中,wcm开发 组有义务不断更新和补充完善本文档。1.2文档的适用范围所有内容适用于trs wcm v6.0以上版本。wcm持久化实现和业务逻辑层开发可适用于 trs wcm v5.2wcm持久化实现可适用于trs wcmv5.0/5.11. 3文档的组织/本文档在内容组织上,注重设计原理和应用 实践两个方面并重。因为我们认为,理解设 计原理是更好应用的基础,也是较深层的二 次开发所必须了解的内容。/本文档在布局上,按照下面的方式安排: 首先阐述wc

9、m开发平台的持久哈,它 是应用和扩展wcm的最基础、最核心 的内容; 然后分别阐述了 wcm分层架构, 最后重点讨论。1.4文档的目标在阅读完本文档后,您应当明确理解和掌握的 内容是:/如何应用wcm持久化框架操作数据库中数据;/如何扩展wcm持久化对象/如何熟练应用wcm中有关任务和计划调度、工作流、发布等关键性的扩展性支持开 发;/如何熟练解决wcm应用开发中的一些问题。/最终:您应当能够熟练掌握和应用本文档中 所有wcm扩展开发内容。1. 5文档术语eclipse:对象:实例:见xxx.xxx():为参考工程中实例方法1. 6我们的建议在阅读和学习本文档时,我们建议您注重以下 方面:1

10、.从设计原理上去理解和把握wcm解决关键问题的思路和方法;2 .多做练习,在练习中理解wcm对象模型的体系结构和建构原则,并熟练应用该模型 解决实际问题和扩展应用。3 .在较短的时间内,迅速完成本文档中所有涉 及到的关键性开发问题;如果把一切问题都待实际应用开发中去做,往往会事倍功半。2阅读前的准备2.1安装trs wcm 65应用2. 2 安装 eclipse2. 3 导入 trs wcm developer 工程1 .从ftp上下载工程2 .在eclipse中导入工程3 .修改工程中数据库配置文件,指向新装的wcm数据库4 .修改工程的注册码,将wcm65应用中的注册码更新到工程中2. 4

11、 example中示例方法运行方法如下图所示,在方法上点击回右键runas-junit test assign worxmg6vcm.v6.5.devekrc。 toggle method breakpoint3 com.trsrun as5documentdebug as,examplecompare with,ej documercp|accw;th coarestore fromlocal history.dfwt7 query2q : void31jv 1 ju nit testalt+shift+x, t. g-trun configurations.(xxx)纸目(docunten

12、c = null) aont1nue;41 imi 方t;记:x or wy?京1tem.out.println(doctitle: + document.get for3 wcm持久化实现2.1 概述应用系统首先需要解决持久化问题,就是如何 将关系数据库中的数据转换成java对象;很多 系统利用hibernate开源框架解决,wcm开发平台是自主研发的持久化框架o她的特点是“集合、元素”、“分页载入”、“先 载入id再读取数据”、“拆分sql”如何利用wcm持久化框架操作关系数据库 中的数据是一切的基础,所以读懂和扩展wcm 先从这里开始。3. 2集合和元素初始select doctitle

13、,docld,cruser from wcmdocument where docld=l and docld=l and dqcld=l and docld=10,hdoctitle zdocid,cruserh);/ 2发出查询请求,获取结果对应的集合documents documents = documents.openwcmobjs(null, filter);/ 3遍历集合,输出每条记录的数据for (int i = 0 z nsize = documents.size() ; i save、insert、update delete remove均会调用父类中方法与数据库交互,产生预期

14、的结果,与数据库操作都定义在超级父类baseobj中,使用者不用关心数 据库细节与数据库耦合主要在于wcmfilter (查询语 句的构造上)元素对象都必须以公开静态常量的方式定义对应的表和id字段名,id的字段类型必须是整型ublic class document extends cmsobj /常是定义小对象类型(605) 7public final static int obj_type- 605;/“对象所对应的数据表名7public final static string db_table_name = wcmdocument”;/*对象数据存储的id字段名7public final

15、 static string db_id_name =doqd”;uiipui i win. xini a. ulix. ua iauat)c. t-,spublic class test extends cjisdbj a*对象类型编号*/public final static int gbj.type = 166485363;/*对象物捉存储的蓟抿隹名因public final static strin; db_table_nahe = wchtest、/*对象数据存储的id字翳fpublic final static string db id m颂e = testid;/*构造图数.:保

16、留默认接口 */3. 4集合和元素的产生可利用 wcmstudio产生,wcmstudio从内网获取;只能运行在windows环境中;3.4.1 配置ant运行环境下载ant介质,解压将ant配置到系统的path中进入cmd窗口,运行ant命令看到如下结果, 证明成功,否则重新配置:sb 管理员:c:windowssys.tem 32cmd.exemicrosoft uindovs 版本 6.1,7601j版权所有 2009 microsoft cohpoiation 保留所有权利c:usersscaohuiant buildfile: build.xml does not exist? bu

17、ild failed3.4.2 利用wcmstudlo产生代码下载介质,解开直接点击运行3*; acuw6utt a gee&a-5fi*q cuf &t-klstj/w mmw. /k/ 易csvmil 0 : j 3,an口i”局悻加无在右侧project节点点击右键今新建packagee q szoject少com/ ih-jl) con/ ,jd test2白至trsr-sj hai o -3d :”c .c ldxx(h il d.一1在新的package上点击右键今新建javabean点击新的对象,依次在属性列表中通过右键“添加”新建属性,其中页面显示不关注:序性设置j点击保存,然

18、后点击生成代码,系统将产生:元素和集合对应的java类(在。trs.wcm.devsrc 中)创建数据库的脚本buildfila: d:xvostuliobui:d zn:*scnar&ta:jave2 log4no appencers could be found for locger r (coa trs. xvcz. tcastudio. ceneratns3cxvigefagece?.javaz ic4j:wasn please initielise the los4j systez piopexly.(java!或二生前工件r . ;tf.s r.xv.srcmoat”i2itas:

19、 javajava?求m生怠工俘,.itfs cx. dv.srccoate5t2;tests. javajava;我喧生我工1多,.、tfs rat. v.contdzt.taitsxtazt_asdcc:t. jspjav 我h生或文件:.-.ies. z3. ccv.5antazttast2tczt-addcclt.二二1lave:玄关生或工件:.ies.cc order select;其中:这四部分的关键字都不能在参数中设置from如果不指定,默认为持久化对象对应的表名;select不指定,默认为/错误的代码1,带了关键字where和selectwcmfilter filter = n

20、ew wcmfilter(mhz -where docld=lz select doctitie , dodd, crusern );/错误的代码2, where和order反了wcmfilter filter = new wcmfilter(nh, -docld desch z ndocid=lz doctitle zdocidzcruserh);一般为了规避sql注入,不再推荐见where 中直接写查询条件,需要改为?的方式,比如查 询曹辉创建的文档,id小于10的wcmfilter 建议这么写:wcmfilter filter = new wcmfilter(hncruser=? doc

21、ld=10n r ndoctitle zdocidzcruser*);3. 6查询读取指定条件的数据实现步骤:1 . 了解要操作的表对应的集合对象(比如文档对应为document),见附录1:附录1: wcm常用的持久化对象及对应的 表2 .构造查询语句并设置查询用到的参数3 .通过对应的集合对象发出查询请求,获取结 果对应的集合4 .遍历集合,逐个读取元素的属性如何分页显示见常见问题描述章节:如何分页 读取集合数据示例代码(读取admin发布的id小于10的文档),见 documentexample.query2():/ 1构造查询语句并设置where用到的参数wcmfilter filte

22、r = new wcmfilter(z cruser=? docld=?zdoctitle zdocidruser);filter addsearchvalues(nadminm;filter.addsearchvalues(10);/ 2通过对应的集合对象发出查询请求,获取结果对应的集合documents documents = documents.openwcmobjs(null, filter);/ 3遍历集合,输出每条记录的数据for (int i = 0, nsize = documents.size(); i = 0);3.10.2 获取指定位置的元素相关方法:baseobjs.g

23、etat(int)示例代码:/获取指定文档集合中第三条记录的文档int nlndex = 2;document document = (document)documents.getat(nlndex);3.10.3 获取指定id的元素相关方法:baseobjsegetbyid(int)示例代码:/获取指定文档集合中指定文档工d为23的文档int ndocid = 23;document document = (document)documents.getbyld(ndocid);3.10.4 从集合中移除指定位置的元素,不从数据库删除相关方法:baseobjs.removeat(int, bo

24、olean)示例代码:/移除指定文档集合中第三条记录的文档int nlndex = 2;documents.removeat(nlndex, false);3.10.5 从集合中移除指定id的元素,不从数据库删除相关方法:baseobjseremove(int, boolean)示例代码:/移除指定文档集合中工d为23的文档int ndodd = 23;documents . remove(ndocidf false);3. 11元素常用操作3.1.1 根据id获取指定元素对象相关方法:findbyld(int)示例代码(所有元素对象都要求定义了这个方 法):/ 1产生元素对象的实例int n

25、docid = 23;document document = document.findbyjd(ndocid);3.1.2 判断指定对象是否可以被当前用户修改所有元素对象都支持锁定操作,防止被其它用 户修改,如果a用户锁定了指定元素对象d,那 么b用户就不可以修改指定元素对象d;支持锁定的元素对象一般都是从cmsobj继承而来相关方法:cmsobj.canedit(user)示例代码:/ 2判断是否可以修改 boolean bcanedit = document . cailedlt (loginuser);3.12数据类型wcm所有元素对象都是从baseobj继承而 来,支持:通过通用方法

26、getproperty读取属性通过通用方法setproperty设置属性和数据库中字段类型对应关系见附录:附拈 数据类型3. 13如何操作没有对应持久化对象的表按照wcm开发平台约定,wcm db中所有的表都有对应的集合和元素,但是不可避免有些表没有对应的java对象,为了解决这类问题,系统提供一个通用的集合和元素对象:集合:com.trs.infra.persistent.cmyresultsets元素:com.trs.infra.persistent.cmyresultset(查询文档com.trs.example.cmyresultsetsexample.query documents(

27、):/指定查询的sqlstring ssql = hselect doctitle,docld from wcmdocvunent where docid10000;/指定这次查询相关的sql/如果确定这次查询没有明确id字段,系统支持将记录行号作为工d string sldfieldname = ndocidm;/发出查询获取集合cmyresultsets amyresuitesets = new cmyresultsets(); amyresultesets.open(ssql, sldfieldname);/遍历输出结果(hfind + amyresultesets

28、.size() + record!h);for (int i = 0; i =ln , hselect doctitiezdocld,cruserh;3.14.2 构造wcmfilter时sql各部分顺序反了/错误的代码2, where和。rder反了wcmfilter filter = new wcmfilter ( , docld desc , ,docid=l, “ doctitle zdocld, cruser1);3.14.3 构造wcmfilter时漏了要提取的字段/错误代码3:需要提取的字段没有在select中wcmfilter filter3 = new wcmfilter(h

29、, ndocid=l and docid=10h, hdocid desc , hdocidzcruser11);documents documents = documents.openwcmobjs(null, filter3);for (int i = 0, nsize = documents.size(); i =l and docid=10h,- dodd desc-, -doctitle2 ,docld,cruserh;documents = documents , openwcmobjs(null, filter4);for (int i = 0, nsize = document

30、s.size(); i nsize; i+) document document = (document) documents.getat(i);if(document = null)/永远是走到这个逻辑上system, out .printin (hwcmfiltermi? ?); continue;/永远走不到这个逻辑system.out.printin(ndoctitle: ” + document.gettitle();/ end for在后台将会看到这样的异常输出:err-1100装载指定页(0)失败(ponents.wcm.content.persistent.documents

31、ensurepageloaded)err-40装载指定页失败(ponents.wcm.content.persistent.document s ,loadpage) : sql=select doctitle2 z docldf cruser from wcmdocument where docid in(?f ?, ?, ?, ?z ?z ?z ?z ?z ?) =l and docid=10h rdocuments documents = documents , openwcmobjs(null, filter); for (int 1=0, nsize = documents.size

32、(); i =l and docidcruser;这样构造文档对象,虽然提取字段少了,高效 了,但权限判断可能会出现问题:int ndocid = 23;document document = document.findbyid(ndoctdfndocid, doctitle, cruser, docchannel ”);应该这样构造:int ndocid = 23;document document = document.findbyid(ndoctdf hdocid z doctitle n;3.14.8 集合移除操作需要从后往前在某些场景下,需要遍历集合中所有元素,如 果符合某些条件,将

33、元素从集合中移除;经常看 到有些代码从0开始操作,这样很容易出现一些 元素被略过处理,如果倒数第二个元素是被溢出 还会出现下标溢出情况。这是任何java集合操作都需要规避的问题, 不是wcm强制规则;/错误代码:下标不应该递增for (int i = 0 z nsize = documents.size() ; i =0; i-) document document = (document) documents.getat(i); if (hasright(document)continue;documents . removeat (i z false); / end for3.15常见问题

34、3.15.1 每次打开集合是否需要传递用户如果不执行删除所有的操作(removeall),所有 集合查询时要求传入的用户都可以指定为null3.15.2 如何分页读取集合数据实现步骤:1 . 了解要操作的表对应的集合对象(比如文档 对应为document),见附录1:附录1: wcm常用的持久化对象及对应的 表2 .构造查询语句并设置查询用到的参数3 .通过对应的集合对象发出查询请求,获取结 果对应的集合4 .构造分页对象5 .遍历集合,使用分页对象决定边界,逐个读取元素的属性示例代码(读取admin发布的id小于10的文档,仅仅显示第2页的数据,分页大小为3),见 documentexamp

35、le.query2():/ 1构造查询谙句并设置where用到的参数wcmfilter filter = new wcmfilter(z cruser=? docld=?, ndoctitle zdocidzcruserh);filter , addsearchvalues (nadmin*); filter.addsearchvalues(10);/ 2通过对应的集合对象发出查询请求,获取结果对应的集合 documents documents = documents.openwcmobjs(null, filter);/ 3构造分页对象int npagesize = 15; / 分页大小in

36、t ncurrpagelndex = 2; /当前显示第几页,从工开始 cpager pager = new cpager(npagesize);pager , setltemcount(documents , size(); pager , setcurrentpagelndex(ncurrpagelndex);/ 4遍历集合,输出每条记录的数据for (int i = pager. getfirstltemlndex () ; i pager.getlastltemlndex(); i+) document document = (document) documents.getat(i - 1); if (document = null) continue;/元素的属性也可通过getxxx获取system.out.printin(ndoctitle: + document.gettitle(); / end for3.15.3 多表联合查询怎么办3.15.4 不同的查询条件和排序条件如何合并可利用wcmfilter的合并方法支持将sql语 句合并,例如有两个查询语句,一个是根据trs wcm二次开发文档第39页

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论