Drools在网页中呈现输出

时间:2013-10-23 12:59:04

标签: java drools

我是Drools Expert的新手,目前来自drools的Sample项目,我只能在控制台上打印一些东西。现在我将drools集成到一个Web项目中并且它成功了,我能够根据用户与页面的交互将某些东西打印到控制台。

我的规则目前是这样的:

rule "A test Rule"

    when
        m: FLTBean ( listeningScore == 1, test : listeningScore  )
    then
        System.out.println( test );

end

那么如果我想将它打印到网页怎么办?我该怎么办?我是否需要使用return将某些值返回到java页面并将其呈现给页面?

1 个答案:

答案 0 :(得分:1)

为了在网页上显示内容,您需要使用API​​调用Drools并获取一些输出,然后由Web应用程序呈现。

因此,您需要考虑如何在Java代码中从中获取输出。有几种方法可以做到这一点。

例如,在执行诸如验证请求之类的简单操作时,只需对您插入的请求进行操作即可。例如:

rule "IBAN doesn't begin with a country ISO code."
    no-loop
when
    $req: IbanValidationRequest($iban:iban, $country:iban.substring(0, 2))
    not Country(isoCode == $country) from countryList
then
    $req.reject("The IBAN does not begin with a 2-character country code. '" + $country + "' is not a country.");
    update($req);
end

在那个例子中,我对我插入的事实称之为“拒绝”方法。这会修改插入的事实,因此在规则执行后,我的Java代码中有一个对象,带有一个标志,指示它是否被拒绝。此方法适用于无状态知识会话。即

  1. Java代码 - 通过API插入请求事实
  2. Drools规则 - 修改请求事实(标记拒绝,注释,设置属性等)
  3. Java代码 - 查看事实,看看它做了什么
  4. 以下有关如何执行此交互的代码示例取自以下完整的类:

    https://github.com/gratiartis/sctrcd-payment-validation-web/blob/master/src/main/java/com/sctrcd/payments/validation/payment/RuleBasedPaymentValidator.java

    // Create a new knowledge session from an existing knowledge base
    StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
    // Create a validation request
    PaymentValidationRequest request = new PaymentValidationRequest(payment);
    // A stateless session is executed with a collection of Objects, so we
    // create that collection containing just our request. 
    List<Object> facts = new ArrayList<Object>();
    facts.add(request);
    
    // And execute the session with that request
    ksession.execute(facts);
    
    // At this point, rules such as that above should have been activated.
    // The rules modify the original request fact, setting a flag to indicate 
    // whether it is valid and adding annotations to indicate if/why not.
    // They may have added annotations to the request, which we can now read.
    
    FxPaymentValidationResult result = new FxPaymentValidationResult();
    // Get the annotations that were added to the request by the rules.
    result.addAnnotations(request.getAnnotations());
    
    return result;
    

    有状态会话中的另一种选择是规则可以将事实插入工作内存中。执行规则后,您可以通过API查询会话并检索一个或多个结果对象。您可以使用KnowledgeSession的getObjects()方法获取会话中的所有事实。要获取具有特定属性的事实,还有一个getObjects(ObjectFilter)方法。下面链接的项目包含在KnowledgeEnvironment和DroolsUtil类中使用这些方法的示例。

    或者,您可以将服务作为全局变量插入。然后规则可以调用该服务的方法。

    有关如何在Web应用程序中使用Drools的示例,我最近敲了这个网站,它提供了一个REST API来调用Drools规则并获得响应。

    https://github.com/gratiartis/sctrcd-payment-validation-web

    如果你安装了Maven,你应该可以很快地试用它,并且可以使用代码。