xpage 传参_XPage 全接触

XPage 全接触

刘 奇

2009 年 8 月 06 日发布

XPage 全接触

XPages 是 IBM Lotus Notes/Domino 8.5 为 Lotus Domino Web 2.0 应用程序开发人员提供的新技术。与以往发行版相比,它们提供了更大的灵活性,并且更好地控制交付给 Web 浏览器客户机屏幕的内容。本文将带大家全面了解 XPage 的各项功能,图 1 显示了 Lotus Domino Designer 8.5 中 XPage 设计页面。在阅读本文的同时,建议读者阅读文章 在 Lotus Domino Designer 中利用 XPages 的威力,该文章是本文一个很好的补充。

图 1. XPage 设计页面(查看大图)

基本控件和基本属性

Lotus 软件试用下载

立即下载最新版本的 IBM Lotus Notes 和 Domino 试用软件,尝试利用 XPage 技术开发第一个 Domino Web 2.0 应用程序。

Lotus Domino Designer 提供了大量可重用的控件供用户开发 Web 2.0 的程序,它主要分为两种:核心控件和容器控件。顾名思义,核心控件指一些比较基本的 XPage 控件,如编辑框、文本标签等;容器控件则是比较复杂、能够包含其它控件的控件,例如面板、表格、视图等。另外,用户还可以自己定制控件,以供自己或者别人重用。

值得注意的是,通过拖拽控件面板上“Other”将控件放到 XPage 设计页面时,您会发现除了您在控件面板上看到的一些控件之外,“Other Controls”部分多了复选框组、单选按钮组等控件,如 图 2 所示。

图 2. “Other Controls”

下面将分别阐述一下应用程序的属性、XPage 页面属性、控件基本属性以及自定义控件属性。

应用程序属性

点击 图 3 所示的 Application Properties 打开应用程序属性设置页面并点击 XPage Tab,如 图 4 所示。在这里,您可以设置数据验证代码是在服务器端还是在客户端执行,压缩以及编码格式和全球化相关的一些属性。

图 3. “Application Properties”入口

图 4. 应用程序属性页面

XPage 页面属性

图 5 展示了 XPage 页面的属性。除了可以设置数据源、样式(字体及大小、背景色、边距等)之外,还可以添加 CSS 文件和 JavaScript 库。

图 5. XPage 页面属性

控件属性

图 6 显示了 Edit 控件的基本属性,对于不同的控件,它的属性也有所不同。

图 6. Edit 控件属性

自定义控件属性

自定义控件的属性除了具有 XPage 页面所具有的基本属性之外,它还允许用户添加新的属性,读者可以参考“自定义控件与 compositeData”小节了解更多的内容。

图 7. 自定义控件属性

Ajax 和 JavaScript 支持

作为非常流行的交互式网页应用的网页开发技术 — Ajax,其在 XPage 中得到了很好的支持。主要表现在以下几个地方:

Ajax 部分页面刷新适用任意的事件

对于任意事件,在服务器端允许用户选择页面更新的方式:全部更新、部分更新、不更新等。例如,点击“Refresh Panel”链接,将仅仅刷新“compute2”,其源码如 清单 1 所示。

清单 1. 部分更新示例源码<?xml version="1.0" encoding="UTF-8"?>

submit="true" refreshMode="partial" refreshId="compute2">

id="pane1">

value="#{javascript:@UpperCase(@Left(@Unique(),5))}"

style="color:rgb(0,128,192)">

value="#{javascript:@UpperCase(@Left(@Unique(),5))}"

style="color:rgb(255,0,0)">

Pager 控件

XPages 中的 Pager 是用于数据源集合导航的控件,经常跟 View,Repeat,Data Table 等一起使用。如 图 8 所示,选中 Partial Refresh,该 Pager 将仅仅刷新 viewPanel(刷新部分由 Attach to 指定的)的内容;反之,如果 Partial Refresh 没有被选中,则刷新整个页面中的内容。

图 8. Pager 控件部分刷新

Ajax Typeahead

Typeahead 是增强用户体验的一项重要措施,它能够根据用户输入的字符(串)猜测用户接下来可能输入的字符并帮助用户完成数据的输入。Edit 控件属性中有一项是 Type Ahead,如 图 9 所示,您可以在 Suggestions 中输入提示的字符串集,也可以书写 JavaScript 等返回字符串集合,其运行如 图 10 所示。

图 9. Typeahead

图 10. Typeahead 运行示例图

嵌入 Dojo 作为客户端的代码库

XPage 对 JavaScript 也有着非常好的支持。例如,不论是在客户端还是在服务器端,任意事件都支持 JavaScript。又例如,Computed Field 也支持 JavaScript 来计算这个域的值。

在服务器端,XPage 还提供:允许用户使用 @function。

大量的全局对象,例如 applicationScope,session 和 requestScope 等。

大量的全局方法,例如 getComponent,getView,getClientId 等。

允许用户使用函数库 DOM、Domino、Runtime、Standard、XSP 等中的函数。

JavaScript 对控件的操作

获取和设置 XPage 中控件的属性以及值在 XPage 应用程序开发过程中是非常重要的。下面将结合实例来讲述如何分别在客户端和服务器端上获取控件值或者属性:

客户端

创建一个简单的 XPage, 如 图 11 所示,源码如 清单 2 所示。

图 11. XPage 示例

清单 2. XPage 示例源码<?xml version="1.0" encoding="UTF-8"?>

选择“设置编辑框文本”按钮并点击事件,书写事件“onClick”客户端运行的 JavaScript 脚本,如代码清单 3 所示。

清单 3. 客户端 JavaScript 代码(操作控件的值)var editID = '#{javascript:getClientId("textExample")}';

document.getElementById(editID).value = "您好!设置成功!";

其中,getClientId("textExample") 是用来获取编辑框的客户端 ID(如 view:_id1:textExample),但是仅仅服务器端可以使用这个函数。为了能够在客户端也能使用,需要将它放在 #{javascript: ... } 中。当运行 XPage 时,这个嵌入在 #{javascript: ... } 中的语句首先被执行,并将执行结果返回。点击“设置编辑框文本”按钮,编辑框就会被设成“您好!设置成功!”。

服务器端

对上述例子,也可以书写服务器端脚本,如 清单 4 所示。

清单 4. 服务器端 JavaScript 代码(操作控件的值)var editComponent:javax.faces.component.UIComponent = getComponent("textExample");

editComponent.setValue( "您好!设置成功!");

其中,getComponent("textExample") 是用来获取 XPage 编辑框对象,调用 setValue 方法可以设置其值。

细心的读者可能发现,除了 setValue 之外,还有很多 UIComponent editComponent 方法供使用,例如 图 12 列出了一些设置编辑框属性的方法。

图 12. UIComponent 设置方法列表

XPage 事件模型

XPage 主要有以下几种事件:

Page 事件

如 图 13 所示,Page 事件主要有 beforePageLoad,afterPageLoad,afterRenderResponse,afterRestoreView,beforeRenderResponse,beforeRestoreView 等。

图 13. Page 事件

Control 事件

XPage 控件的事件比较多,如 图 14 所示,它分为鼠标、焦点、键盘三大类。读者可以参考 Lotus Domino Designer 了解各个事件的具体含义。

图 14. Control 事件

Document 事件

Document 事件主要包含 computeDocument,postNewDocument,postOpenDocument,postSaveDocument 等。

View 事件

View 事件包含 postOpenView,queryOpenView。

Validator

Validator 是用来验证 XPage 控件数据的合法性,它能够发生在服务器端,也可以发生在客户端,您有两种方法来设置这个属性:在应用程序级别,可以打开“Application Properties > XPage TAB”来设置,如 图 15 所示。

图 15. 客户端数据验证设置(应用程序级别)

在控件级别,您可以在控件“Properties >All Properties”中来设置,如 图 16 所示。

图 16. 客户端数据验证设置(控件级别)

数据验证在客户端与服务器端执行返回结果的方式有所不同。仍以 图 11 所示例子来说明,我们对编辑框加上一个数据验证,如 图 17 所示,这样当点击按钮时就会提示“数据错误”的信息。

图 17. 设置 Edit 控件数据验证属性

假如在客户端执行数据验证,点击按钮就会弹出如图所示的对话框,如 图 18 所示。

图 18. 数据错误警告框

假如在服务器端执行数据验证,我们需要创建一个“Display Error”控件来显示错误信息。

Java 代码重用

大家可能在想, 能不能重用 Java 代码,并在 JavaScript 中使用呢?答案是肯定的。主要分为以下几个步骤:切换 Lotus Domino Designer 的视图至 Java 视图,如 图 19 所示。

图 19. 切换视图

您可以选择在 Lotus Domino Designer 中创建一个项目,添加您要重用的 Java 代码,并将这个项目导出成一个 JAR 包。右击 项目,选择 “Export …”,并选择 Java -> JAR file。注意:不是一定要求您在 Lotus Domino Designer 中创建项目,您也可以选择在其他地方,例如 Eclipse 中创建项目并导出来。

将导出的 JAR 包放到 XPage 应用程序(NSF 文件)中。选择 WebContent > WEB-INF,您应该能看到文件夹 lib (如果没有,请创建该文件夹),将 JAR 包放到 lib 文件夹下。这样,您就可以在此 XPage 应用程序中使用 JAR 包中所有的类和相应的方法了。

图 20. 添加 JAR 包

使用 JAR 中的类和方法。例如 清单 5 所示。

清单 5. XPage 中使用 Java 库示例var objectTest = new Test(); -- Test 为 JAR 中包含的类。

objectTest.print();

值得注意的是,您需要等待几分钟,JAR 包中包含的类和方法才能在 XPage 中正式生效。

自定义控件与 compositeData

Custom control 是由一系列的控件组成的,能够被当成一个对象来使用和存储,例如将一个公司的标志加到公司的商业文档中组成一个自定义的控件,这个自定义的控件可以永久的存储在 XPage 中,公司其他人员就可以直接使用这个自定义控件来创建一个带有公司标志的商业文档。

XPage 允许用户为“Custom Control”定义新的属性。创建一个 Custom Control,图 21 显示了 Custom Control 的属性。在 TAB “Property Definition”中,用户可以定义新的属性,图中创建了一个新的属性 text。那么如何访问这些自定义的属性呢?XPage 提供了一个对象 — compositeData,允许用户通过“compositeData.属性名”直接来访问和设置属性的值。

图 21. 添加新属性

总结

本文对 XPage 基本控件和基本属性、XPage 对 Ajax 以及 JavaScript 的支持、控件操作、XPage 事件模型等进行了讲述,相信大家已经对 XPage 有了一个基本的了解,并且能够开发一些简单的 XPage Web 2.0 应用程序。如果读者希望能够进一步的学习,可以阅读参考资料中的相关文档。

相关主题查看教程“在 Lotus Domino Designer 中利用 XPages 的威力”,了解 XPage 的基本知识,以及如何构建 View 类型的 XPage、NotesDocument 类型的 XPage、添加 XPage 前端和多文档删除等。

查看教程“在 IBM Lotus Domino Web 应用程序开发中使用 XPages、Themes 和 Mashups”:在本教程将结合使用 XPages 和 Themes 创建一个企业级销售跟踪和任务分配 Lotus Domino Web 应用程序。

XPages in Domino Designer 8.5:阅读 Rob McDonagh 关于 XPages 的博客文章。

下载试用版 Lotus Domino V8.5,立即体验 XPage 的威力。

下载试用版 IBM Lotus Notes 8.5 和 Domino Designer 8.5,尝试利用 XPage 技术开发第一个 Domino Web 2.0 应用程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XPAGE学习笔记 1 Theme 2 2 在Xpage中使用Dojo 2 2.1 加载dojo.js 2 2.2 设置应用程序主题引入tundra.css 2 2.3 设置xpage属性引入dojo模块 3 2.4 Xpage的页面html代码 4 2.5 在xpage中使用dojo编程 4 2.5.1 按钮(dijit.form.Button) 4 2.5.1.1 通过插入<div>标签生成dojo按钮 5 2.5.1.2 使用xpage按钮控件 7 2.5.1.3 在按钮控件上使用事件处理程序控件 7 2.5.2 Xpage中使用 Spinner(dijit.form.NumberSpinner) 9 2.5.3 在xpage中使用ProgressBar(dijit.ProgressBar) 10 2.5.4 在Xpage中使用树(dijit.Tree) 10 2.5.4.1 JSON与XML数据源 11 2.5.4.2 Box树与Order树 12 2.5.4.3 对树进行添加、删除及重命名操作 13 2.5.4.4 将树的操作记录到后台数据库 14 2.5.4.5 树的拖放 15 3 在Xpage中如何查找控件 16 3.1 理解document.getElementById 16 3.2 理解dojo.byId 17 3.3 理解dijit.byId 17 3.4 理解XSP.getElementById 17 3.5 理解getComponent 17 4 Xpage VS 表单 18 5 使用oneui主题 18 6 参考 18 6.1 JSON与String转换 18 6.2 XPage中调试代码 18 1 Theme 主题在Domino中的路径:D:\IBM\Lotus\Domino\xsp\nsf\themes 2 在Xpage中使用Dojo  Xpage自动加载dojo.js  通过设置应用程序主题将tundra.css引用到xpage  设置xpage属性,引用dojo模块  在xpage中使用dojo编程 2.1 加载dojo.js Xpage会自动加载dojo.js,默认情况下xpage自动查找data\domino\js下的最新版本。也可以通过设置xsp.properties文件来修改dojo版本,重命名xsp.properties.sample 文件(D:\IBM\Lotus\Domino\data\properties\ xsp.properties.sample) 2.2 设置应用程序主题引入tundra.css 通过设置应用程序主题将tundra.css引用到xpage 2.3 设置xpage属性引入dojo模块 2.4 Xpage的页面html代码 2.5 在xpage中使用dojo编程 2.5.1 按钮(dijit.form.Button)  通过插入<div>标签生成dojo按钮  使用xpage按钮控件  在按钮控件上使用事件处理程序控件 2.5.1.1 通过插入<div>标签生成dojo按钮 第一步:在xpage中插入<div dojoType=”dijit.form.Button” id=”dojoBtn”></div> 第二步:在xpage中插入<xp:scriptBlock></xp:scriptBlock> 第三步:编写客户端javascript <div dojoType="dijit.form.Button" id="dojoBtn"></div> <xp:scriptBlock> <xp:this.value><![CDATA[function showDia(){ var dia = new dijit.Dialog({title:"dojo按钮演示",style:"width:150px"}); var pane = document.createElement("div"); pane.innerHTML = "<span>Hello Dojo!</span>"; dia.setContent(pane); dia.show(); } function btnDemo(){ var dojoBtn = dijit.byId("dojoBtn"); var dojoBtnNode = dojo.byId("dojoBtn"); dojoBtn.setLabel("Dojo Button"); // dojo.connect(dojoBtn.domNode,"onclick","showDia"); dojo.connect(dojoBtnNode,"onclick","showDia"); } dojo.addOnLoad(btnDemo);]]></xp:this.value> </xp:scriptBlock> 2.5.1.2 使用xpage按钮控件 <xp:button id="button1" value="按钮控件"> <xp:this.onclick> <![CDATA[ var dia = new dijit.Dialog({title:"提示:",style:"width:150px;"}); var pane = document.createElement("div"); pane.innerHTML = "<span>dojo按钮演示!</span>"; dia.setContent(pane); dia.show(); ]]> </xp:this.onclick> </xp:button> 2.5.1.3 在按钮控件上使用事件处理程序控件 将事件处理程序控件拖放到按钮控件上 2.5.2 Xpage中使用 Spinner(dijit.form.NumberSpinner) <xp:inputText id="numSales"></xp:inputText> <xp:scriptBlock> <xp:this.value><![CDATA[ dojo.addOnLoad(function(){ new dijit.form.NumberSpinner({ name:"#{id:numSales}", value:50, smallDelta:1, min:0, places:0},XSP.getElementById("#{id:numSales}")); }); ]]></xp:this.value> </xp:scriptBlock> var myvalue = "#{javascript: var value; if(getComponent("numSales").getValue() != null){ value = getComponent("numSales").getValue().intValue(); }else{ value = 50; } return value.toFixed(0);}"; new dijit.form.NumberSpinner({name:"#{id:numSales}", value:myvalue, smallDelta:1, constraints:{min:0,places:0}}, XSP.getElementById("#{id:numSales}")); 2.5.3 在xpage中使用ProgressBar(dijit.ProgressBar) <div dojoType="dijit.ProgressBar" style="width:300px" jsId="jsProgress" id="div1"> </div> <xp:button value="Start" id="button2"> <xp:eventHandler event="onclick" submit="false"> <xp:this.handlers> <xp:handler type="text/javascript"> <xp:this.script><![CDATA[ var numParts = Math.floor(100/7); jsProgress.update({ maximum: numParts, progress:0 }); for (var i=0; i<=numParts; i++){ setTimeout("jsProgress.update({ progress: " + i + " })",(i+1)*100 + Math.floor(Math.random()*100)); } ]]></xp:this.script> </xp:handler> </xp:this.handlers> </xp:eventHandler> </xp:button> 2.5.4 在Xpage中使用树(dijit.Tree)  JSON与XML数据源  Box树与Order树  对树进行添加、删除及重命名操作  将树的操作记录到后台数据库  树的拖放 2.5.4.1 JSON与XML数据源 box.json文件 { identifier:'id', label:'name', items:[ {id:1,name:"盒子1",type:"box",weight:0} ] } order.xml文件 <orders> <order> <orderNumber>001</orderNumber> <description>订单001</description> <priority>航运</priority> <line> <orderNumber>001-1</orderNumber> <qty>1</qty> <sku>11761</sku> <description>精通DOJO</description> </line> <line> <orderNumber>001-2</orderNumber> <qty>3</qty> <sku>11789</sku> <description>项目管理那些事儿</description> </line> </order> <order> <orderNumber>002</orderNumber> <description>订单002</description> <priority>快递</priority> <line> <orderNumber>002-1</orderNumber> <qty>10</qty> <sku>11763</sku> <description>精通J2EE</description> </line> <line> <orderNumber>002-2</orderNumber> <qty>30</qty> <sku>11799</sku> <description>超越对手</description> </line> </order> </orders> 2.5.4.2 Box树与Order树 <div dojoType="dojo.data.ItemFileWriteStore" jsId="boxStore" url="/tree/box.json"> </div> <div dojoType="dojox.data.XmlStore" jsId="orderStore" label="description" keyAttribute="orderNumber" url="/tree/order.xml"> </div> <div dojoType="dijit.tree.ForestStoreModel" jsId="boxModel" store="boxStore" rootLabel="退货物品" childrenAttrs="orders,items"> </div> <div dojoType="dijit.tree.ForestStoreModel" jsId="orderModel" store="orderStore" rootLabel="订单" childrenAttrs="line,order"> </div> <xp:td style="height:200.0px" valign="top"> <xp:panel> <div dojoType="dijit.Tree" id="boxTree" model="boxModel"> <script type="dojo/method" event="onClick" args="item"> lastBoxSelected = item; </script> </div> </xp:panel> </xp:td> <xp:td style="height:200.0px" valign="top"> <xp:panel> <div dojoType="dijit.Tree" id="orderTree" model="orderModel"> </div> </xp:panel> </xp:td> 2.5.4.3 对树进行添加、删除及重命名操作 <xp:table> <xp:tr> <xp:td> <div dojoType="dijit.form.Button" id="addBtn"> 添加 <script type="dojo/method" event="onClick"> boxStore.newItem({id:2,name:"盒子2",type:"box",weight:0,orders:[]}); </script> </div> </xp:td> <xp:td> <div dojoType="dijit.form.Button" id="delBtn"> 删除 <script type="dojo/method" event="onClick"> if(boxStore.isItem(lastBoxSelected)){ boxStore.deleteItem(lastBoxSelected); } </script> </div> </xp:td> <xp:td> <div dojoType="dijit.form.Button" id="reBtn">重命名 <script type="dojo/method" event="onClick"> if(boxStore.isItem(lastBoxSelected)){ boxStore.setValue(lastBoxSelected,"name","新盒子"); } </script> </div> </xp:td> </xp:tr> </xp:table> 2.5.4.4 将树的操作记录到后台数据库 <div dojoType="dojo.data.ItemFileWriteStore" jsId="boxStore" url="/tree/box.json"> <script type="dojo/connect" event="onNew" args="newItem"> var itemId = this.getValue(newItem,"id"); var itemName = this.getValue(newItem,"name"); dojo.xhrPost({ url:"agCreateNewBox?OpenAgent", content:{id:itemId,name:itemName}, timeout:10000, error:function(){alert("对不起,出错啦!");}, load:function(){alert("数据保存成功!");console.debug("数据保存成功!");} }); </script> <script type=”dojo/connect” event=”onDelete” args=”delItem”> </script> </div> 2.5.4.5 树的拖放 要使树具有拖放功能,仅仅需要设置dndController属性(dijit._tree.dndSource已废弃): 要限制拖放的行为,仅仅需要实现checkAcceptance或checkItemAcceptance处理函数即可: 以上已经实现了树的拖放功能了! 但是,如果要将拖放的结果保存起来,也就是说要改变树的模型并将模型数据保存,那么应该编写onDndDrop的处理函数(通过增加jsId获得dndController会出现this.avaria is null 错误,所以下面通过小部件初始化时将dndController传递给变量controller): 在boxDrop中与checkAcceptance一样可以得到target与source,另外,onDndDrop中的source与nodes有些相似source.selection[something]=nodes[somethin] 结合ItemFileWriteStore 可以实现对模型数据的保存 3 在Xpage中如何查找控件 3.1 理解document.getElementById 得到node,创建node可以用document.createElement 这样访问或设置节点的所有属性 node.innerHTML = “” node.value=”” var id = node.id var style = node.style 3.2 理解dojo.byId 得到node,也可以通过dijit.byId().domNode得到节点 dojo.byId(“myid”).value dojo.byid(“myid”).id dojo.attr(node,attribute) 如读取dojo.attr(node,”id”) dojo.attr(node,attribute,value) 如设置dojo.attr(node,”id”,”myid”) dojo.hasAttr(node,attribute) 如判断 dojo.hasAttr(node,”id”) dojo.connect(node,”onclick”,handler) dojo.removeClass(node,”myclass”) 3.3 理解dijit.byId 得到dojo控件对象,也可以通过dijit.byNode(dojo.byId())得到对象 不同的控件的getValue()返回值类型不一样 在xpage中对于<div>标签可能使用期dijit.byId(“myid”),对于<xp:>标签是不可以的 dijit.byId().getValue() dijit.byId().setValue() 3.4 理解XSP.getElementById 这是XSPClientDojo 库中定义的,XSP全局变量相当于document对象,为客户端访问xpage控件提供方法 XSP.getElementById(“#{id:myid}”)使用JSF表达式查询控件 var xid = XSP.getElementById(“#{id:myid}”) xid.value = “myvalue” xid.name = “myname” xid.disabled = false 3.5 理解getComponent javascript服务器端访问控件 getComponet(“myid”).getValue(); getComponet(“myid”).getSubmittedValue(); getComponent(“myid”).setValue(); getComponent(“myid”).setSubmittedValue(); 4 Xpage VS 表单 5 使用oneui主题 6 参考 6.1 JSON与String转换 dojo.fromJson(string) 返回json对象 dojo.toJson(object) 返回string对象 eval(‘(‘+string+’)’) 返回json对象 6.2 XPage中调试代码 window.alert 函数不可用于服务器脚本。 使用以下函数写入服务器上的 console.log(例如 C:\Notes\Data\IBM_TECHNICAL_SUPPORT\console.log): print(string) 写入一个字符串。 _dump(object) 写入表示对象的字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值