我是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页面并将其呈现给页面?
答案 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代码中有一个对象,带有一个标志,指示它是否被拒绝。此方法适用于无状态知识会话。即
以下有关如何执行此交互的代码示例取自以下完整的类:
// 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,你应该可以很快地试用它,并且可以使用代码。