RecordView控件的两个文件的完整代码在本文末尾给出。虽说完整,仅靠这两个文件,RecordView控件还不能正常工作,因为在这两个文件里还引用了其他自定义控件,调用了作为managed bean的starrow.xsp.App的方法,即使把这些代码也都全加上,仍然不是自足的,因为在starrow.xsp.App类里,又调用了其他辅助类的代码。所以这两个文件的代码不像笔者在以前很多文章中给出的代码一样可以直接使用,而仅仅是为了展示RecordView控件的全貌,起到参考作用。XPages自定义控件(三)高级搜索整个系列的三篇文章与其说是介绍一个可重用的控件,不如说是用一个实例解剖自定义控件,展示它的结构、创建和使用它涉及到的知识和技术以及用XPages实现多条件查询。无法给出一个通用的控件,除了前面提到的多条件查询的界面要据具体需求设计以外,还有两方面的原因。一是大家已经看到的一个自定义控件的功能除了控件本身的两个文件之外,还可能会依赖其他自定义控件,用到保存在其他设计元素里的服务器端JavaScript和Java代码,需要faces-config.xml配置文件里的managed bean的设置。这样的分散性,再加上自定义控件的名称本身并没有全局唯一性的保证,使得对像本文介绍的这样的自定义控件,很难做到像系统自带的控件那样轻松在不同应用程序里重用。第二个原因则和XPages技术本身跨浏览器的能力和稳定性有关。笔者在8.5.3的环境下开发出63. XPages自定义控件(三)高级搜索之一提到的员工考勤系统,在做浏览器测试的时候,发现在IE 9和Firefox下多条件查询界面都能正常工作,但是输入起始日期的两个日期框显示略有差别,为了使日期框与同一行的输入员工姓名的编辑框保持水平一致,笔者还在这两个控件上加了一些CSS属性。因为不能确保系统用户所用的IE版本,笔者又用IE 9自带的开发工具模拟IE 8、7和Quicks模式,结果十分令人失望。有的模式下日期框显示正常,有的显示不正常但能正常工作,有的两者皆不行。无奈笔者只能使用一个技巧,指示浏览器在可能的情况下采用最新的IE 9模式(在下面代码的页面的beforeRenderResponse事件里可见到这段SSJS),这样实际上也没有彻底解决问题。既然选择了基于组件的用户界面技术,保证控件可以跨浏览器是基本要求,可惜XPages在这一点上做得不算好,在8.5.1版本时,日期控件就不支持IE 8,需要使用同样的技巧让浏览器模拟IE 7的模式(http://www-10.lotus.com/ldd/ddwiki.nsf/dx/Date_Time_Picker_XPages_8.5.1_and_Internet_Explorer_8)。实际上如果用XPages Extension Library里的dojo的日期控件都不会有这样的问题。时间到了Lotus Domino 9,情况又有了更新,在Firefox和IE 7、8、9、Quicks模式和最新的IE 10下,日期控件都能正常工作了,除了在IE 7和新的IE 5 Quicks模式下显示依然不正常以外。这实际上就印证了笔者在61. 两种类型的web框架:基于请求的和基于组件的里的观点,基于组件的框架要保证控件能够跨浏览器并且在浏览器和自己的不断升级中保持住这一点,是很困难的。
RecordView.xsp:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xp:view xmlns:xp="http://www.ibm.com/xsp/core"
  3. xmlns:xc="http://www.ibm.com/xsp/custom"
  4. xmlns:xp_1="http://www.ibm.com/xsp/coreex">
  5. <xp:this.beforeRenderResponse><![CDATA[#{javascript:if (context.getUserAgent().isIE()) {
  6. facesContext.getExternalContext().getResponse().setHeader("X-UA-Compatible", "IE=9");
  7. }}]]></xp:this.beforeRenderResponse>
  8. <xp:panel rendered="${javascript:compositeData.showSearch}">
  9. Staff
  10. <xc:InputUser id="inputUser1"></xc:InputUser>
  11. From
  12. <xp:inputText id="inpFrom" style="width:auto; top:0px;">
  13. <xp:dateTimeHelper id="dateTimeHelper1"></xp:dateTimeHelper>
  14. <xp:this.converter>
  15. <xp:convertDateTime type="date"></xp:convertDateTime>
  16. </xp:this.converter>
  17. </xp:inputText>
  18. To
  19. <xp:inputText id="inpTo" style="width:auto; top:0px;">
  20. <xp:dateTimeHelper id="dateTimeHelper2"></xp:dateTimeHelper>
  21. <xp:this.converter>
  22. <xp:convertDateTime type="date"></xp:convertDateTime>
  23. </xp:this.converter>
  24. </xp:inputText>
  25. <xp:button value="Test" id="button2" rendered="false">
  26. <xp:eventHandler event="onclick" submit="true"
  27. refreshMode="complete">
  28. <xp:this.action><![CDATA[#{javascript:var inputUser1:com.ibm.xsp.component.UIIncludeComposite = getComponent("inputUser1");
  29. requestScope.message=inputUser1.findComponent("Users").getValue();
  30. }]]></xp:this.action>
  31. </xp:eventHandler>
  32. </xp:button>
  33. <xp:button value="Search" id="btnSearch">
  34. <xp:eventHandler event="onclick" action="#{app.search}"
  35. submit="true" refreshMode="complete">
  36. </xp:eventHandler>
  37. </xp:button>
  38.  
  39. <xp:button value="Clear" id="button1">
  40. <xp:eventHandler event="onclick" action="#{app.clearSearch}"
  41. submit="true" refreshMode="complete">
  42. </xp:eventHandler>
  43. </xp:button>
  44. <xp:br></xp:br>
  45. <xc:Message>
  46. <xc:this.rendered><![CDATA[${javascript:app.isLocal() || session.getEffectiveUserName()=="CN=Starrow Pan/OU=SCRO/O=CITIGROUP";}]]></xc:this.rendered>
  47. </xc:Message>
  48. </xp:panel>
  49. <xp:panel rendered="${javascript:compositeData.showEdit}">
  50.  
  51. <xp:button value="Refresh" id="button5">
  52. <xp:eventHandler event="onclick" submit="true" refreshMode="complete">
  53. <xp:this.action><![CDATA[#{javascript:database.updateFTIndex(false);}]]></xp:this.action>
  54. </xp:eventHandler></xp:button><xp:button value="New" id="button3" rendered="true">
  55. <xp:eventHandler event="onclick" submit="false">
  56. <xp:this.script><![CDATA[window.open("record.xsp", "_blank");]]></xp:this.script>
  57. </xp:eventHandler></xp:button>
  58. <xp:button value="Delete" id="button4"><xp:eventHandler event="onclick" submit="true" refreshMode="complete">
  59. <xp:this.action>
  60. <xp:deleteSelectedDocuments view="viewPanel1"
  61. message="Are you sure to delete the selected records?">
  62. </xp:deleteSelectedDocuments>
  63. </xp:this.action></xp:eventHandler></xp:button>
  64. </xp:panel>
  65. <xp:viewPanel rows="20" id="viewPanel1" viewStyle="width:99%"
  66. pageName="/record.xsp">
  67. <xp:this.facets>
  68. <xp:pager partialRefresh="true" layout="Previous Group Next"
  69. xp:key="headerPager" id="pager1">
  70. </xp:pager>
  71. <xp:pager partialRefresh="true" layout="Previous Group Next"
  72. xp:key="footerPager" id="pager2">
  73. </xp:pager>
  74. </xp:this.facets>
  75. <xp:this.data>
  76. <xp:dominoView var="view1"
  77. viewName="${javascript:compositeData.notesView;}"
  78. search="#{javascript:compositeData.filter;}" sortOrder="descending"
  79. sortColumn="$8">
  80. </xp:dominoView>
  81. </xp:this.data>
  82. <xp:viewColumn id="viewColumn8" columnName="$8"
  83. showCheckbox="${javascript:compositeData.showEdit}">
  84. <xp:this.displayAs><![CDATA[${javascript:if (compositeData.showEdit) return "link";}]]></xp:this.displayAs>
  85. <xp:this.facets>
  86. <xp:viewColumnHeader xp:key="header"
  87. id="viewColumnHeader8" value="Date">
  88. </xp:viewColumnHeader>
  89. </xp:this.facets>
  90. <xp:this.converter>
  91. <xp:convertDateTime type="date"></xp:convertDateTime>
  92. </xp:this.converter>
  93. </xp:viewColumn>
  94. <xp:viewColumn columnName="StaffName" id="viewColumn4">
  95. <xp:viewColumnHeader value="Staff Name"
  96. id="viewColumnHeader4">
  97. </xp:viewColumnHeader>
  98. </xp:viewColumn>
  99. <xp:viewColumn columnName="AccessTime" id="viewColumn1">
  100. <xp:this.converter>
  101. <xp:convertDateTime type="time"></xp:convertDateTime>
  102. </xp:this.converter>
  103. <xp:viewColumnHeader value="Access Time"
  104. id="viewColumnHeader1">
  105. </xp:viewColumnHeader>
  106. </xp:viewColumn>
  107. <xp:viewColumn id="viewColumn9" columnName="Type">
  108. <xp:this.facets>
  109. <xp:viewColumnHeader xp:key="header"
  110. id="viewColumnHeader9" value="Type">
  111. </xp:viewColumnHeader>
  112. </xp:this.facets>
  113. </xp:viewColumn>
  114. <xp:viewColumn columnName="CardNo" id="viewColumn2"
  115. rendered="false">
  116. <xp:viewColumnHeader value="Card Number"
  117. id="viewColumnHeader2">
  118. </xp:viewColumnHeader>
  119. </xp:viewColumn>
  120. <xp:viewColumn columnName="StaffNo" id="viewColumn3"
  121. rendered="false">
  122. <xp:viewColumnHeader value="Staff Number"
  123. id="viewColumnHeader3">
  124. </xp:viewColumnHeader>
  125. </xp:viewColumn>
  126. <xp:viewColumn columnName="Department" id="viewColumn5">
  127. <xp:viewColumnHeader value="Department"
  128. id="viewColumnHeader5">
  129. </xp:viewColumnHeader>
  130. </xp:viewColumn>
  131.  
  132. <xp:viewColumn columnName="Office" id="viewColumn7">
  133. <xp:viewColumnHeader value="Office"
  134. id="viewColumnHeader7">
  135. </xp:viewColumnHeader>
  136. </xp:viewColumn>
  137. </xp:viewPanel>
  138. </xp:view>

RecordView.xsp-config:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <faces-config>
  3. <faces-config-extension>
  4. <namespace-uri>http://www.ibm.com/xsp/custom</namespace-uri>
  5. <default-prefix>xc</default-prefix>
  6. </faces-config-extension>
  7. <composite-component>
  8. <component-type>RecordView</component-type>
  9. <composite-name>RecordView</composite-name>
  10. <composite-file>/RecordView.xsp</composite-file>
  11. <composite-extension>
  12. <designer-extension>
  13. <in-palette>true</in-palette>
  14. </designer-extension>
  15. </composite-extension>
  16. <property>
  17. <property-name>filter</property-name>
  18. <property-class>string</property-class>
  19. <property-extension>
  20. <designer-extension>
  21. <default-value>${javascript:""}</default-value>
  22. <editor>com.ibm.std.String</editor>
  23. </designer-extension>
  24. <required>false</required>
  25. </property-extension>
  26. </property>
  27. <property>
  28. <property-name>notesView</property-name>
  29. <property-class>string</property-class>
  30. <display-name>NotesView</display-name>
  31. <property-extension>
  32. <designer-extension>
  33. <editor>com.ibm.xsp.extlib.designer.tooling.editor.ViewNameEditor</editor>
  34. </designer-extension>
  35. </property-extension>
  36. </property>
  37. <property>
  38. <property-name>showSearch</property-name>
  39. <property-class>boolean</property-class>
  40. <display-name>Show search function</display-name>
  41. <property-extension>
  42. <designer-extension>
  43. <editor>com.ibm.std.Boolean</editor>
  44. <default-value>true</default-value>
  45. </designer-extension>
  46. </property-extension>
  47. </property>
  48. <property>
  49. <property-name>showEdit</property-name>
  50. <property-class>boolean</property-class>
  51. <display-name/>
  52. <description>Determine whether to display the features for editing records.</description>
  53. </property>
  54. <property>
  55. <property-name>showLink</property-name>
  56. <property-class>boolean</property-class>
  57. <display-name>Show link</display-name>
  58. <property-extension>
  59. <designer-extension>
  60. <editor>com.ibm.std.Boolean</editor>
  61. </designer-extension>
  62. </property-extension>
  63. </property>
  64. <property>
  65. <property-name>showCheckbox</property-name>
  66. <property-class>boolean</property-class>
  67. <display-name>Show checkbox</display-name>
  68. </property>
  69. </composite-component>
  70. </faces-config>

faces-config.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <faces-config>
  3. <managed-bean>
  4. <managed-bean-name>app</managed-bean-name>
  5. <managed-bean-class>starrow.xsp.App
  6. </managed-bean-class>
  7. <managed-bean-scope>application</managed-bean-scope>
  8. </managed-bean>
  9. <!--AUTOGEN-START-BUILDER: Automatically generated by IBM Domino Designer. Do not modify.-->
  10. <!--AUTOGEN-END-BUILDER: End of automatically generated section-->
  11. </faces-config>

65. XPages自定义控件(三)高级搜索之三的更多相关文章

  1. Google高级搜索语法

    Google高级搜索语法   Google搜索果真是一个强悍的不得了的搜索引擎,今天转了一些 google的高级搜索语法 希望能帮助到大家. 一.allinanchor: anchor是一处说明性的文 ...

  2. 如何使用GOOGLE高级搜索技巧

    如何使用GOOGLE高级搜索技巧 一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发 ...

  3. Google高级搜索技巧十则

    前言:多数人在使用Google搜索的过程是非常低效和无谓的,如果你只是输入几个关键词,然后按搜索按钮,你将是那些无法得到Google全部信息的用户,在这篇文章中,Google搜索专家迈克尔.米勒将向您 ...

  4. GOOGLE高级搜索的秘籍

    一.摘要 本文内容来源自互联网,全面的介绍Google搜索的各种功能和技巧. 二.GOOGLE简介 Google(http://www.google.com/)是一个搜索引擎,由两个斯坦福大学博士生L ...

  5. GOOGLE高级搜索技巧

    前记:  我是完整的看完了.内容有点乱啊,自己没有时间整理,先放在自己的印象笔记里了....   二,GOOGLE特色 GOOGLE支持多达132种语言,包括简体中文和繁体中文: GOOGLE网站只提 ...

  6. 使用github高级搜索

    想瞅瞅github上面有哪些中国开发者最活跃,followers最多.可以按照下面的步骤: 打开github的搜索页面 输入 location:china .点search 然后选择不同的排序方式. ...

  7. 使用 Google 高级搜索的一些技巧

      一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明,Google Inc. 于 ...

  8. Github 高级搜索功能

    参考文章链接:https://zhuanlan.zhihu.com/p/55294261 GitHub 提供高级搜索方式. 一.明确搜索仓库标题.仓库描述.README 1.只想查找仓库名称包含XX的 ...

  9. google、baidu高级搜索技巧

    1.baidu(可以去高级搜索查看更多信息) intitle搜索范围限定在网页标题:intitle:和后面的关键词之间不要有空格----intitle:中国 site搜索范围限定在特定站点中:“sit ...

随机推荐

  1. HDU 5832 A water problem 水题

    A water problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5832 Description Two planets named H ...

  2. hdu 5735 Born Slippy 暴力

    Born Slippy 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5735 Description Professor Zhang has a r ...

  3. 读think in java有感

    .... 2.2.1 保存到什么地方 程序运行时,我们最好对数据保存到什么地方做到心中有数.特别要注意的是内存的分配.有六个地方都可以保存数据: (1) 寄存器.这是最快的保存区域,因为它位于和其他所 ...

  4. MySQL主从复制几个重要的启动选项

    MySQL主从复制几个重要的启动选项 (1)  log-slave-updates log-slave-updates这个参数用来配置从服务器的更新是否写入二进制日志,这个选项默认是不打开的,但是,如 ...

  5. poj 2429 GCD &amp; LCM Inverse 【java】+【数学】

    GCD & LCM Inverse Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9928   Accepted:  ...

  6. delphi Format格式化函数

    Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供大家查询之用: 首先看它的声明:function Format(const Format: ...

  7. iOS sqlite 使用事务操作数据库

    业务层代码: //将解析的更新人员数据批量同步到数据库 +(void)operateCompUsers:(NSMutableArray*)operateCompUsers { sqliteHelper ...

  8. sqlite数据库实现字符串查找的方法(instr,substring,charindex替代方案)

    sqlite数据库是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,资源占用低,执行效率高,可以跨平台使用,已被广泛使用.作为一款轻量级的数据库,功能自然会有所欠缺,比如数据库加密,用户权限设 ...

  9. linux内核自锁旋spinlock常用宏解释

    转自:http://blog.sina.com.cn/s/blog_6929134b0100tdn8.html 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持, ...

  10. ArrayList的总结

    1.ArrayList的特点 主要特点:按照插入顺序来保存元素,可以利用下标来查找值 2.ArrayList的优点: 按照下标访问元素最快 3.ArrayList的缺点: 在中间插入元素很慢 删除元素 ...