在48. 面向对象的LotusScript(十四)之Log4Dom上和49. 面向对象的LotusScript(十五)之Log4Dom下笔者介绍了一个简单实用的日志记录模块,代码用LotusScript写成,在Lotus Notes传统的客户端和web应用程序里都可以使用。在XPages开发里,需要可在SSJS或Java里使用的日志功能。用Java开发时,有很多现成的日志框架,比如Log4J和JDK自带的java.util.logging包。但是这些框架包含日志器层次(logger hierarchy)、过滤器(filter)、记录器(handler)和格式器(formatter)等特性,对于Lotus Notes平台上的开发来说过于复杂。Lotus Notes的环境有特殊性,现成和方便的记录日志的载体就是Notes文档,所以笔者在借鉴了OpenNTF上的Log4Dom项目后,编写了满足典型的Lotus Notes里日志需求的Java类NotesLogger。(与Log4Dom的Java版本比较,NotesLogger放弃了Log4J的可配制记录器的架构,直接将日志写入唯一的载体——指定Notes数据库的文档;更正了bug;简化了使用方法;减少了类的数量;调整了方法的名称和签名。)记录日志的文档使用的表单和视图与LotusScript的Log4Dom一样。下面就是在一个XPage的按钮里分别用xp:eventHandler的action和actionListener属性触发managed bean里的两个测试方法,分成两条日志文档。
<xp:button value="Test eventHandler action" id="button1">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete" action="#{bean.testAction}">
</xp:eventHandler>
</xp:button>
<xp:button value="Test eventHandler actionListener" id="button2">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete" actionListener="#{bean.testActionListener}">
</xp:eventHandler>
</xp:button>
注意两处绑定使用的都是表达式语言,并且XPages继承自JSF,分别可以使用action和actionListener/actionListeners绑定两种签名不同的方法。action属性绑定的方法须为managed bean的公开方法,无参数且返回一个字符串;actionListener/actionListeners绑定的方法同样须为公开方法,但接受一个类型为javax.faces.event.ActionEvent的参数且返回类型为void。 public void testActionListener(ActionEvent ae) throws NotesException{
NotesLogger logger=new NotesLogger(XSPUtil.getSession());
logger.setLogName("test actionListener from bean");
logger.info(ae);
log