在專案中配置urule規則引擎
2.applicationContext.xm加入urule配置檔案
在專案spring配置檔案applicationContext.xml中,引入urule-console的spring配置檔案
<!-- 2.匯入urule-console的spring配置檔案 -->
<import resource="classpath:urule-console-context.xml"/>
3.新建configure.properties
Configure.properties
#用於指定當前知識庫存放目錄,必須存在
urule.repository .dir=D:/repo
#制定管理員使用者
urule.admin.username=susu
然後在專案spring配置檔案applicationContext.xml中,引入
<!-- 3.引入configure.properties -->
<context:property-placeholder ignore-unresolvable="true" order="1" location="classpath:configure.properties"/>
4.web.xml配置urule的servlet
<!-- urule的servlet配置 -->
<servlet>
<servlet-name>uruleServlet</servlet-name>
<servlet-class>com.bstek.urule.console.servlet.URuleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>uruleServlet</servlet-name>
<url-pattern >/urule/*</url-pattern>
</servlet-mapping>
5.在urule控制檯建立動作庫用到
在urule控制檯建立動作庫,需要引入bean_id,因此需要建立一個,並在applicationContext.xml為這個建立一個bean_id;
MethodTest.java
public class MethodTest {
@ExposeAction("列印Student")
public void printUser(String stuName){
System.out.println("Hello "+stuName);
}
}
配置檔案中,建立bean_id
<!-- 5.建立動作庫時,需要引入bean_id -->
<bean id="methodTest" class="com.su.test.MethodTest"></bean>
6.具體建立變數庫、常量庫、引數庫、動作庫方式
參考:http://wiki.bsdn.org/pages/viewpage.action?pageId=75071567
7.以上配置完後,執行專案
執行專案,輸入http://localhost:8081/ProjectName/urule/frame,即可進入urule控制檯
8.操作
在“專案列表”右鍵,建立新專案,然後在“庫”上建立變數庫、常量庫、引數庫、動作庫等,在“決策集”上建立嚮導式決策集、指令碼式決策集等。
9.模擬測試
在以上步驟完後,即可在“知識包”中進行模擬測試
10.urule在程式碼中呼叫
建立一個InvokeTest.java
package com.su.test;
import com.bstek.urule.Utils;
import com.bstek.urule.runtime.KnowledgePackage;
import com.bstek.urule.runtime.KnowledgeSession;
import com.bstek.urule.runtime.KnowledgeSessionFactory;
import com.bstek.urule.runtime.service.KnowledgeService;
import com.su.domain.Student;
/**
* @author su1573
* @since 2018年8月29日
*/
public class InvokeTest {
public void doTest() throws Exception{
//從Spring中獲取KnowledgeService介面例項
KnowledgeService service=(KnowledgeService)Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);
//通過KnowledgeService介面獲取指定的資源包"projectName/知識包編碼"
KnowledgePackage knowledgePackage=service.getKnowledge("SSMDemo/xiangdemo");
//通過取到的KnowledgePackage物件建立KnowledgeSession物件
KnowledgeSession session=KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);
Student stu = new Student();
stu.setStuAge(30);
stu.setStuName("su");
//將業務資料物件Employee插入到KnowledgeSession中
session.insert(stu);
//執行所有滿足條件的規則
session.fireRules();
}
}
再建立一個invoke.jsp,用於呼叫程式碼,進行規則測試
<%@page import="com.su.test.InvokeTest" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Test</title>
</head>
<body>
<%
InvokeTest invoke = new InvokeTest();
invoke.doTest();
%>
</body>
</html>
11.在程式碼中呼叫,並返回結果
public class InvokeTest {
public Student doTest() throws Exception{
//從Spring中獲取KnowledgeService介面例項
KnowledgeService service=(KnowledgeService)Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);
//通過KnowledgeService介面獲取指定的資源包"projectName/知識包編碼"
KnowledgePackage knowledgePackage=service.getKnowledge("SSMDemo/xiangdemo");
//通過取到的KnowledgePackage物件建立KnowledgeSession物件
KnowledgeSession session=KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);
Student stu = new Student();
stu.setStuAge(50);
//將業務資料物件Employee插入到KnowledgeSession中
session.insert(stu);
//執行所有滿足條件的規則
session.fireRules();
Student ss = (Student)session.getParameter("stu");
System.out.println(ss.getStuName());
return ss;
}
}
上面程式碼:
Student ss = (Student)session.getParameter("stu");
System.out.println(ss.getStuName());
return ss;
就是資料經過規則驗證後,從KnowledgeSession 中取到的引數,其中”stu”,需要在引數庫中配置,如下:
12.把知識包存到資料庫
需要在configure.properties配置檔案中新增兩個屬性
#資料來源bean的id
urule.repository.datasourcename=dataSource
#指定資料庫型別
urule.repository.databasetype=oracle
#上面兩個配置連線資料庫
#用於指定當前知識庫存放目錄
urule.repository.dir=D:/repo
一個是在spring配置檔案中資料庫bean的id,一個是資料庫型別(mysql、oracle、sql server、Db2)
13.把資料庫中使用者加入到urule控制檯
在URule當中,在外部沒有提供EnvironmentProvider介面實現的時候,它採用其內部提供的一個預設EnvironmentProvider介面實現,其原始碼如下:
EnvironmentProvider介面的預設實現類原始碼
package com.bstek.urule.console;
import java.util.ArrayList;
import java.util.List;
import com.bstek.urule.console.servlet.RequestContext;
/**
* @author Jacky.gao
* @since 2016年5月25日
*/
public class DefaultEnvironmentProvider implements EnvironmentProvider {
@Override
public User getLoginUser(RequestContext context) {
DefaultUser user=new DefaultUser();
user.setCompanyId("bstek");
user.setUsername("admin");
user.setAdmin(true);
return user;
}
@Override
public List<User> getUsers() {
DefaultUser user1=new DefaultUser();
user1.setCompanyId("bstek");
user1.setUsername("user1");
DefaultUser user2=new DefaultUser();
user2.setCompanyId("bstek");
user2.setUsername("user2");
DefaultUser user3=new DefaultUser();
user3.setCompanyId("bstek");
user3.setUsername("user3");
List<User> users=new ArrayList<User>();
users.add(user1);
users.add(user2);
users.add(user3);
return users;
}
}
在預設的實現類中,getLoginUser返回的是固定的使用者名稱為”admin”的使用者,並且它的isAdmin屬性為true,表示它是管理員,也就是說預設返回的登入使用者是名為admin的管理員,同時他所在的公司ID為”bstek”;在getUsers方法中固定返回user1、user2、user3三個使用者,他們的公司ID皆為”bstek”,與預設返回的登入使用者admin的公司ID相同,所以在上面介紹的許可權配置頁面中我們看到的是user1、user2、user3三個使用者。
關於User的公司ID
在URule當中,通過使用者的companyId(也就是公司ID)實現在一個URule的儲存庫中隔離不同公司使用者所建的規則專案。
某些時候,你可能只會搭建一個URule
Server,在這個Server中會有很多個使用者來建立專案、配置規則,但這些使用者有可能來自不同的公司,這個時候就需要有一種機制來隔離不同公司的人建立的專案,這裡就是通過使用者的companyId屬性實現。companyId為A的使用者建立的專案,companyId為B的人登入後是看不到的,反之亦然。EnvironmentProvider介面中返回的登入使用者如果isAdmin為true,也就是管理員,那麼它可以看到並操作其所在companyId下所有專案,而不需要做任何許可權配置,相反,進行許可權配置的工作也必須要由管理員來操作,否則會顯示“無許可權”的提示。
某個companyId下的管理員進行許可權配置的時候,他能配置的使用者也有與其companyId相同的普通使用者,同時可配置的專案也只有在當前companyId下建立的專案。
如果我們需要將業務系統中的使用者資訊引入到URule當中,那麼只需要實現一個新的EnvironmentProvider介面,並將其配置到spring的上下文中,讓其成為一個標準的bean即可。這樣系統啟動時會自動檢測到該介面實現的存在,從而用它來替換預設的EnvironmentProvider介面實現。
在專案中實現EnvironmentProvider介面
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.bstek.urule.console.DefaultUser;
import com.bstek.urule.console.EnvironmentProvider;
import com.bstek.urule.console.User;
import com.bstek.urule.console.servlet.RequestContext;
import com.su.service.UserService;
/**
* @author su1573
* @since 2018年9月7日
*/
public class TestEnvironmentProvider implements EnvironmentProvider {
@Autowired
private UserService userService;
@Override
public User getLoginUser(RequestContext rec) {
DefaultUser user = new DefaultUser();
user.setCompanyId("100");
user.setUsername("su");
user.setAdmin(true);
return user;
}
@Override
public List<User> getUsers() {
List<com.su.domain.User> list = userService.findAllUser();
List<User> luser = new ArrayList<User>();
for(com.su.domain.User user : list){
DefaultUser du = new DefaultUser();
du.setCompanyId("100");
du.setUsername(user.getLoginName());
luser.add(du);
}
return luser;
}
}
在spring 配置檔案中配置bean
<bean id="TestEn" class="com.su.test.TestEnvironmentProvider"></bean>
這樣就覆蓋了,預設的介面實現
當資料庫使用者出現後,可以對使用者進行配置許可權
author:su1573