10. 如何在XPages里实现典型的Notes权限控制?

(CSDN博客的bug不断,因为某些原因整理历史文章时注意到这一篇在列表中消失了,搜索后发现有其他博主无引用地发表,在自己的博客上反倒被设为私密了。取消私密设置并重新发布,文章的发表日期变为当前日期,出现在文章列表的顶端。原来编辑文章页面下方有保存和发布两个按钮,印象中都不会修改文章原始的发表日期。在分类专栏里尚可以手工排序,在全部文章列表里则只会按修改日期排序。另外编辑摘要的功能也消失。对这些明显的bug,也只能呵呵了。)

在传统Notes开发中,我们经常通过隐藏公式实现对用户权限的控制。在控制权限时,有时依据用户名,有时是用户所属的群组,还有时是其角色。这些信息都被包含在@UserNamesList的返回值里,这样我们就可以很方便地将它们与某个预定或由程序更新的域的内容作比较,实现对权限的灵活控制。@IsMember(@UserNamesList;FieldName)这样的隐藏公式可以作为一个样例。

在XPages开发中,SSJS和Java Bean里,我们如何实现这样的效果?即获得用户的上述信息,并且与指定的身份信息比较。

首先我们想到上述公式在LotusScript 和Java中的对应项。Notes的API文档有一个有用的特点,不同语言——公式、LotusScript、Java的某一页面下方都有一个语言交叉参考的部分,会给出在其它语言中具有同样或类似功能的函数。很不巧@UserNamesList页面下没有LotusScript对应项。Session有一个getUserNameList()的方法,一字母之差,返回的只有用户名和可能的替代名。

那么继续使用公式可以吗?IBM为了方便Notes开发人员,减缓XPages的学习曲线,也使得他们的公式语言知识不至于成为古董,允许在SSJS里嵌入公式。但是这些公式只是原有公式的一部分,并不包含@UserNamesList。此路不通?且慢,我们还有几乎万能的Evaluate嘛。在LotusScript里,我们可以用Evaluate函数计算@Functions的值;在SSJS和Java里,我们有Session.evaluate()方法。实验一下,在一个XPage里,建一个计算文本,取值为session.evaluate(@UserNamesList),结果成功返回。稍微需要注意的是,在SSJS中直接嵌入公式时,公式的写法稍有变化,其中一点就是@Function需要写成@Function()。而在用evaluate方法时,写法还是@Function。

至此,问题似乎解决了。但是我不喜欢混合使用多种语言,在Java和SSJS里夹杂@Functions虽然在功能上可行,但看上去“不美”。可否不用公式实现这些功能呢?

在SSJS的参考中,我们发现DirectoryUser对象可以获得用户名、角色和群组(getDistinguishedName(), getRoles(),getGroups())。接下来在SSJS里就比较容易完成剩下的部分了。为了能在Java中实现,还需要费些力气。我们先查出DirectoryUser的Java类型是接口com.ibm.designer.runtime.directory.DirectoryUser,在SSJS里,它可以从全局对象context的getUser()获得;这个context类型可查出是com.ibm.xsp.designer.context.XSPContext。如何获得它的实例呢?我们只有求助于Java搜索功能,检索返回类型为com.ibm.xsp.designer.context.XSPContext的方法,最后在一个工具类中写出如下的两个方法:

     public static XSPContextgetContext(){

           javax.faces.context.FacesContext fc=javax.faces.context.FacesContext.getCurrentInstance();

           return com.ibm.xsp.designer.context.XSPContext.getXSPContext(fc);

     }

     public static Vector<</span>String> getUserNamesList(){

           Vector<</span>String> result=newVector<</span>String>();

           com.ibm.designer.runtime.directory.DirectoryUseruser=getContext().getUser();

           result.add(user.getDistinguishedName());

           result.addAll(user.getGroups());

           result.addAll(user.getRoles());

           return result;

     }
@IsMember()的功能,在Java中也不是现成的。因为@UserNamesList和多值域返回的都是列表值,@IsMember()对两个列表操作的结果是两者只要有一个公共元素就返回真值。Java的Vector只能对是否包含单个元素或整个Collection做判断。要判断两个Collection是否有交集,可以如此:
 
     public static booleanoverlaps(Collection coll1,Collection coll2){

         Set intersection = newHashSet(coll1);

         intersection.retainAll(newHashSet(coll2));

           return intersection.size()>0;

     }
接下来的部分,相信你就可以轻松完成了:)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于LotusScript,除了Rich-Text域外的元素,如文本、单选框、列表框、复选框等,你可以用几乎相同的代码取得它们的值。例如:如果有一个“Location”域,不论它是何种类型,你都可以用下面的LotusScript代码取得它的值:   fieldVals = doc.Location   或者这样:   fieldVals = doc.GetItemValue("Location")   在LotusScript中,域的类型对于你要取值(值数组)的代码并不重要。但是在JavaScript中,不同类型的域除了显示选项(比如单选框、复选框或者文本)外,并不像在Notes那样,它们是不同的类型的对象,每一个都要用不同的方式去引用。其实,那也不是绝对的,有些对象是相似的,但是引用过程并不像在LotusScript那么流畅。   在JavaScript中,没有所谓的Rich-Text域,在HTML中更没有。Notes提供了一个可以放在浏览器的富文本Java(不是JavaScript)小程序,从而可以得到富文本的一些功能,但是你并不能用JavaScript来对它编程,而且它也不是一个真正的HTML对象类型。   更让Notes开发人员惊讶的是,在Web上还没有数字型或时间型的域。HTML的域都是文本型的。尽管你能用它们来收集数字信息,如数量或单价,而保存的数据依然是文本。为了像数字一样使用它,你必须把它转换成数字类型。另一个区别是在Web上没有计算域,但并不意味着你不能在你的表单加入计算域。你可以加入计算域,计算值将会在Web页中显示,除非域是隐藏的。关键是即使域就在那显示,而HTML通常的处理是没有定义域。如果你把test域改成计算域而不是可编辑的,在测试时你会发现其值是取不到的,我们可以对比下计算域和可编辑域生成的html代码:   计算域的时候生成的代码(js是取不到值的):      action="/weboa/ggxx/Dinner.nsf/test?OpenForm&Seq=1" name="_test">

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值