My FAQ,最新最全的IT技术FAQ
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 未整理篇 | 技术讨论
  当前位置:> Bea专区 > WebLogic Portal
使用门户规则控件实现动态网页流
作者:Cindy McMullen 时间:2005-10-19 16:27 出处:互连网 责编:小渔
              摘要:WebLogic Portal通过规则的使用提供了动态商业智能。规则由用户定义,并由规则引擎在运行期进行评估。围绕规则的逻辑是个性化流程的基础。

WebLogic Portal通过规则的使用提供了动态商业智能。规则由用户定义,并由规则引擎在运行期进行评估。围绕规则的逻辑是个性化流程的基础。

规则的制定可以通过人工编辑一个规则设置,也可以利用Portal管理工具来定义商业活动和用户部分的规则。当服务器启动后,这些规则就会加载到运行的服务器中,同时在用户修改规则时可以动态重新加载。

Portal页面流或者WebLogic Integration 过程类似,这里也有决策点。在决策点处的路径选择是由规则引擎根据动态输入的用户信息在运行期计算出来的。比如,根据那些“'Gold”或“Silver”成员的分类不同,我们可能希望向他们展示特定的内容。要做到这一点,我们不仅需要知道当前用户的信息,而且需要有预定义的规则,从而依据特定的标准对用户进行分类。

本文介绍了如何使用Portal RulesExecutorControl来根据当前用户的属性动态地控制页面流。假设本文章的读者已经对页面流中的Portal控件有了基本的认识,同时知道如何编写和部署门户规则。如果需要更多了解Portal规则引擎和规则编写的更多内容,请参阅Portal 文档。同时本文还包含了几个规则集和页面流的例子。

一个规则集的例子

下面是个比较复杂的规则的例子,但它展示了Portal规则引擎的强大功能和灵活性,同时在本文后面的页面流的例子中还要用到它。你还可以在dev2dev网站上找到更多的规则集的例子。
       这个例子包含了两条规则。每条规则都会对满足条件的输入对象起作用。这个例子中,假设应用程序已经将用户的ProfileWrapper放入了满足规则的输入对象的数组里。注意,在p13n/src/p13n_ejb/com/bea/p13n/expressions/parser-mapping-type.properties中定义了键入的别名'user'。规则的属性会调用ProfileWrapper.getPropertyString propertySetNameString propertyName)并返回一个对象。如果返回的对象是一个整数而且它小于一个特定的值(比如10),那么我们就创建一个新的Classification对象。然后根据这个Classification对象的类型来确定向用户显示哪种页面。

<cr:rule-set is-complete="true" 
    xmlns="http://www.bea.com/servers/p13n/xsd/expression/expressions/2.1.1" 
    xmlns:cr="http://www.bea.com/servers/p13n/xsd/rules/core/2.1.1" 
    xmlns:literal="http://www.bea.com/servers/p13n/xsd/expression/literal/1.0.1" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:string="http://www.bea.com/servers/p13n/xsd/expression/string/1.0.1" 
    xsi:schemaLocation="http://www.bea.com/servers/p13n/xsd/rules/core/2.1.1 rules-core-2_1_1.xsd">
<!-- First rule -->
<cr:rule>
<cr:name>GoldClassifier</cr:name>
<cr:description>Classifies Gold Card members</cr:description>
         <!-- 'user' is mapped to then class com.bea.p13n.usermgmt.profile.ProfileWrapper object via the 
                  parse-mapping-type.properties -->
         <cr:conditions>
                 <greater-than-or-equal-to>
                 <instance-method>
                          <variable>
                                   <type-alias>user</type-alias>
                          </variable>
                          <name>getProperty</name>
                          <arguments>
                                   <literal:string>FooPropertySet</literal:string>
                                   <literal:string>CreditScore</literal:string>
                          </arguments>
                 </instance-method>
                 <literal:integer>10</literal:integer>
         </greater-than-or-equal-to>
         </cr:conditions>
         <!-- 'classification' is mapped to the com.bea.p13n.user.Classification object via the 
                   parse-mapping-type.properties -->
         <cr:actions>
                 <new-instance>
                          <type-alias>classification</type-alias>
                          <arguments>
                                   <literal:string>GoldCardMembers</literal:string>
                          </arguments>
                 </new-instance>
         </cr:actions>
</cr:rule>
<!-- Second rule -->
<cr:rule>
         <cr:name>SilverClassifier</cr:name>
         <cr:description>Classifies Silver Card members</cr:description>
         <cr:conditions>
                 <multi-and>
                          <less-than-or-equal-to>
                                   <instance-method>
                                            <variable>
                                                    <type-alias>user</type-alias>
                                            </variable>
                                            <name>getProperty</name>
                                            <arguments>
                                                     <literal:string>FooPropertySet</literal:string>
                                                     <literal:string>CreditScore</literal:string>
                                            </arguments>
                                   </instance-method>
                                   <literal:integer>9</literal:integer>
                          </less-than-or-equal-to>
                          <greater-than>
                                   <instance-method>
                                            <variable>
                                                             <type-alias>user</type-alias>
                                            </variable>
                                            <name>getProperty</name>
                                            <arguments>
                                                     <literal:string>FooPropertySet</literal:string>
                                                     <literal:string>CreditScore</literal:string>
                                            </arguments>
                                   </instance-method>
                                   <literal:integer>5</literal:integer>
                          </greater-than>
                 </multi-and>
                 </cr:conditions>
                 <cr:actions>
                          <new-instance>
                                   <type-alias>classification</type-alias>
                                   <arguments>
                                            <literal:string>SilverCardMembers</literal:string>
                                   </arguments>
                          </new-instance>
                 </cr:actions>
         </cr:rule>
</cr:rule-set>

门户规则控件

Portal控件允许你在应用程序开发过程中更快速地使用门户的各种功能。就像WebLogic Workshop中包含的内置控件一样,Portal控件能够使你自己在入口中加入一些很好实现的功能,而不用亲自编写大量代码。门户专用的控件为门户开发人员经常遇到的问题提供了可重用的解决方案。dev2dev中有几篇文章更加详细的讲述了控件的相关内容。

Portal 8.1 SP3提供了两个新的规则控件。一个是RulesManagerControl,用于访问和管理规则;另一个是RulesExecutorControl,用于评估规则集并有选择地筛选结果。这些控件可以通过访问门户规则引擎来简化规则的运行,而无须编写更复杂的代码,诸如EJB的查找和创建。

你可以下载一个可预览的jar文件,它不仅包含这些控件,还同时提供了配置和访问这些控件的相关说明。另外,dev2dev中还有一篇有关门户规则的介绍性文章和一个展示规则集的例子。

RulesExecutorControl控件

利用RulesExecutorControl控件,使得基于规则的商业逻辑的评估,以及在页面流中有选择地筛选和使用这些结果变得更为容易。这个控件使用底层的BEA规则引擎定义了用于执行指定的规则集和(或)规则的API。规则集、规则和筛选都是控件的属性,可在控件属性设置GUI中编辑它们。

假定用户知道规则库中存在的规则。使用RulesManagerControl可以列举、访问和管理这些规则。规则集将会存储在门户数据储存库中,并使用数据同步进行更新。在服务器启动时,规则集会自动加载。

为了使用数据同步来方便地加载规则集,可简单地将规则集文件(一般以.rls结束)放入应用程序的META-INF/data目录中。如果希望具有更好的结构,你可以将规则集文件放入一个子目录中,比如META-INF/data/rulesets。规则集的URI是相对于应用程序的META-INF/data目录而言的。这个控件使用的API如下:

public interface RulesExecutorControl extends Control
{
public Iterator evaluateRule(Object[] inputObjects) throws P13nControlException;   
public Iterator evaluateRuleSet(Object[] inputObjects) throws P13nControlException;
}
 

第一个方法对调用者提供的对象集使用了一个指定的规则,并返回对象结果集的一个迭代器。规则集的URI和规则名必须在控件的属性中指定。规则可以根据特定的类、类的组或规则进行任意筛选。使用到的筛选参数可在控件的属性中设置。如果没有设置它们,就将返回未经筛选的结果。如果要了解有关筛选结果的更多内容,可以查看com.bea.p13n.rules.manager.RuleResultClassFilterjava文档。

第二个方法对调用者提供的对象集使用了指定规则集中的所有规则,并返回对象结果集的一个迭代器。规则集的URI必须在控件的属性中指定。结果可根据一个特定的类的类组或规则进行任意筛选。使用到的筛选参数可在控件的属性中设置。如果没有设置它们,就将返回未经筛选的结果。

在页面流中进行动态决策

这一部分讲述如何在Portal页面流中使用RulesExecutorControl控件。这种思想是基于上述阐述规则的例子对给定的用户进行分类,然后使用分类结果控制下一个页面的流向。该例子使用了好几个Portal控件,用于实现登入、从用户的配置中提取数据以及评估规则集。还有几个*.jsp页面和几个更多的操作可用于控制页面流,但是本例中并没有包括它们。

请注意RulesExecutorControl控件的注释。这些控件属性是通过Workshop设计界面来设置的 ,并指定该控件将要配置的各种属性。在这里,我们设置了输入规则集的URI,指定了我们将要筛选的结果以便只返回Classification对象。然后我们根据用户的分类情况向用户显示特定的页面。

public class Controller extends PageFlowController
{
    /**
     * @common:control
     */
    private com.bea.p13n.controls.login.UserLoginControl userLoginControl;
 
    /**
     * @common:control
     */
    private com.bea.p13n.controls.profile.UserProfileControl userProfileControl;
 
    /**
     * @common:control
     * @jc:rules-executor filterClassName="com.bea.p13n.user.Classification" filterResults="true"
          rulesetUri="/rulesets/getFromProfile2.rls"
     */
    private com.bea.p13n.controls.rules.RulesExecutorControl rulesExecutorControl;
 
 
    /**
     * @jpf:action
     * @jpf:forward name="default" path="default.jsp"
     * @jpf:forward name="goldCard" path="goldCard.jsp"
     * @jpf:forward name="silverCard" path="silverCard.jsp"
     * @jpf:catch type="com.bea.p13n.controls.exceptions.P13nControlException" path="error.jsp"
     * @jpf:forward name="error" path="error.jsp"
     */
    protected Forward evaulateRuleSetAction(EvaluateRuleSetActionForm form)
    throws P13nControlException
    {
        // Start with an empty list into which we add objects to populate
        // the working memory of the rules engine
        List wmObjects = new ArrayList();
        
        ProfileWrapper pw = userProfileControl.getProfileFromRequest(this.getRequest());
        if ( pw == null)
        {
            throw new P13nControlException("Undable to retrieve profile from request. " +
            "Make sure PortalServletFilter is configured in web.xml for an anonymous user, " +
            "or that a user has logged in.");
        }
        
        // This one will be the condition that fires the rule
        Integer value = new Integer(6);
        userProfileControl.setProperty(pw, "FooPropertySet", "CreditScore", value);
        wmObjects.add(pw);
        
        // Evaulate all rules in the ruleset.  Parameters have been declared on the control via 
        // the rulesExecutorControl property editor.        
        Iterator  iter = rulesExecutorControl.evaluateRuleSet(wmObjects.toArray());
        List results = new ArrayList();
        
        // Let's say we're lookig for GoldCardMembers
        Classification goldCardMembers = new Classification("GoldCardMembers");
        Classification silverCardMembers = new Classification("SilverCardMembers");
        
        // And we'll direct them to a certain page depending on how the rule evaluates
       Classification classification = (Classification)iter.next();
                
        // Now you would do something with that.  Like maybe show them a different page
         if (classification.equals(goldCardMembers))
         {
                // Direct them to high-price stuff
                    return new Forward("goldCard");
                }
                else if (classification.equals(silverCardMembers))
                {
                    // Direct them to lower-price stuff
                    return new Forward("silverCard");
                }
                // Otherwise, it defaults.  Something went wrong...check the rule conditions or turn
                // off filtering on the control to see what's in working memory
            } 
        }
        return new Forward("default");
    }

结束语

Portal具有两个新的规则控件,它们能使用户通过使用Protal规则引擎并基于用户数据的运行时评估轻易地控制页面流。这些控件也能集成为WebLogic Integration工作流的一部分,从而简化工作流各个决策点上的决策控制。

Portal中使用规则并不是一项新技术,但是它对访问一组相当复杂的组件(规则和规则引擎)而提供的拖放功能却是Portal 8.1 SP3.的一个新特性。令人寄予希望的是,本文展示了使用商业智能来使Web应用程序具有更强的动态性和个人化是多么得容易。

作为JSR 73Data Mining API)的成员,BEA对向Data Mining厂商提供规则格式以便从它们的模型中提取的规则可直接输入Portal规则引擎方面具有浓厚的兴趣。

 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 myfaq.com.cn All rights reserved. www.myfaq.com.cn 版权所有