规则引擎Visual Rules Solution开发基础教程【连载17】--VisualRules接口调用(六)

VisualRules接口调用(六)

——Java类中含类



本案例的需求是:
         规则包:新建一个学生规则包,此规则包接受一系列参数(编号,姓名,性别,年龄,年级,备注),定义两个map参数(学生,教师)用于接收数据,一个学生由多名教师授课,录入一条学生信息,显示该学生的任课老师。
         Java类调用:在Eclipse中制作,main中接收对象,将对象传给规则执行,查询执行结果,可执行选择版本,执行不同版本下的规则文件。


一、规则包开发

1.新建规则包
         右键点击工程“test1”—“新建规则包(P)”,并将规则包命名为“学生”,如下图:





         右键点击规则包“学生”下的“对象库”,在“对象库”中的传入数据中定义如下参数:(参照:规则包开发 3、定义参数)




         右键点击“对象库”—“添加对象分类”,如下图:




         右键点击“对象分类”—“数据库字典”,如下图:




         弹出窗体,进行修改后点击确定,如下图:




         将“对象库”中的参数复制到“数据字典”中,由于“数据字典”的特殊,复制的参数可能会发生改变,如下图:




         修改成如下图:




         点击“数据字典”,选择选下卡“数据字典操作”,点击图标,如下图:




         勾选linkData(java.util.Map)方法,如下图:




         点击确定后显示如下:




         右键点击“对象库”—“添加树状结构”,如下图:




         将复制“对象库”的变量到“数据树”中的“数据树属性”选项卡中,如下图:




         点击“数据树”中的“数据树操作”选项卡中的图标 ,弹出如下窗体,勾选上方法loadFromMap(java.util.Map)和createMapDate()两个方法,如下图:




         确定后显示如下:




         右键点击“数据树”—“添加树状结构”,并将该树状结构的节点改名为“学生”,如下图:




         定义“学生”参数和设置节点“学生”的属性,如下图:




         “教师”节点同“学生”节点,完成如下:




2.新建规则
         右键点击规则包“学生”—“添加规则(N)”,如下图:





         配置规则,点击图标 —“请点击选择”—“数据字典操作”,如下图:




         点击“点击选择字典表操作”—“数据字典”—“方法”—“数据库直接...”,如下图:




         选择的方法,需要传参,点击“请选择”—“传入数据”—“学生”,如下图:




         点击图标—“执行方法”,如下图:




         点击“选择方法”—“数据树”—“方法”—“数据树.loadFromMap({arg1})”,如下图:




         选择的方法需要传入一个map类型的方法,点击“请点击选择”—“选择值”,如下图:





         新建规则“字典数据”,如下图:




         点击“数据字典”选择“数据字典数据”选项卡,复制“id”,如下图:




         将复制的id,粘贴到规则“字典数据”中,如下图:




         粘贴后如下图:




         如下操作:




         点击“请选择”—“传入数据”—“编号”,如下图:




         根据编号将其他数据添加进来,当添加到“性别”是,发现传入数据中没有对应的“性别”,如下图:




         复制“对象库”中的“性别”,如下图:




         操作如下图:




         完成如下配置




         新建规则“数据树”,右键点击“数据树”—“树状结构操作向导”—“设置数据属性向导”,如下图:




         弹出窗体,勾选上字段,如下图:




         点击确定后,显示如下图:




         新建规则“学生节点”, 右键点击“学生节点”—“树状结构操作向导”—“设置数据属性向导”,如下图:




         勾选如下字段




         点击确定后显示如下:




         新建规则“学生节点”, 右键点击“学生节点”—“树状结构操作向导”—“设置数据属性向导”,修改规则如下图:




         设置属性,如下图:




         新建规则“教师取值”,点击图标 —“请点击选择”—“变量赋值”,如下图:




         点击“选择变量”—“传入数据”—“教师”,如下图:




         选择如下方法,如下图:




         完成规则配置




         修改规则包“学生”的外部调用名“student.info”,如下图:




         选择规则包“学生”点击图标 ,弹出窗体“浏览文件夹”,选择目录,如下图:




二、Java调用

1.新建类Student.java
         根据学生“节点”定义,字段名称需与规则中一致,如下
package com.flagleader.student;
/**
* 学生信息
* @author
*
*/

public class Student {
private int id;//编号
private String name;//姓名
private int age;//年龄
private char sex;//性别
private String grade;//年龄
private String remark;//备注
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}

public Student() {}
public Student(int id, String name, int age, char sex, String grade,
String remark) {
super();
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.grade = grade;
this.remark = remark;
}
@Override
public String toString() {
return "Student [age=" + age + ", grade=" + grade + ", id=" + id
+ ", name=" + name + ", remark=" + remark + ", sex=" + sex
+ "]";
}

}
2.新建类StudentInfo.java
         根据 “对象库”中的两个map参数定义,字段名称需与规则中一致,如下
package com.flagleader.student;
import java.util.ArrayList;
import java.util.List;
public class StudentInfo {
private Student student=new Student();
private List<Teacher> teacher = new ArrayList<Teacher>();
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public List<Teacher> getTeacher() {
return teacher;
}
public void setTeacher(List<Teacher> teacher) {
this.teacher = teacher;
}
public StudentInfo() {
teacher.add(new Teacher(1, "李丽"));
teacher.add(new Teacher(2, "战栗"));
teacher.add(new Teacher(3, "庆阳"));
teacher.add(new Teacher(4, "周娇"));
teacher.add(new Teacher(5, "秦毅"));
}
}
3.新建类StudentMap.java
         “对象库”中所有参数,其中部分参数封装在Student.java中,在此定义一个Student类的字段,字段名由使用者定义,还有部分参数封装在StudentInfo.java中,在定义一个StudentInfo类的字段,字段名使用者定义,如下图:
package com.flagleader.student;
public class StudentMap {
private Student student =new Student();
private StudentInfo teacher=new StudentInfo();
public StudentInfo getTeacher() {
return teacher;
}
public void setTeacher(StudentInfo teacher) {
this.teacher = teacher;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public StudentMap() {
student = new Student(6, "庆隆", 12, '男', "六年级", "无");
}
}
4.新建类StudentDto.java
         在java工程中添加一个java类,名为StudentDto.java,其内容编辑如下
package com.flagleader.student;
import java.io.File;
import com.flagleader.engine.RuleEngine;
import com.flagleader.engine.RuleEngineException;
import com.flagleader.engine.RuleEngineFactory;
import com.flagleader.engine.RuleEngineManager;
public class StudentDto {
public static void main(String[] args) {
try {
RuleEngineManager.getInstance().init(new File("E:\\rscfile"));
RuleEngine engine=RuleEngineFactory.newInstance().getRuleEngine();
StudentMap map=new StudentMap();
engine.executeBeans("student.info", map,map.getStudent());
System.out.println(map.getStudent());
System.out.println(map.getTeacher().getTeacher());
System.out.println(map.getTeacher().getStudent());
} catch (RuleEngineException e) {
e.printStackTrace();
}
}
}



三、执行java测试类

         点击执行后,可以看到如下结果:




         这时候我们发现Teacher中的数据不对,那是因为我们规则中有对节点“teacher”进行了操作,修改规则,如下图:




         保存后将规则导出,如下图:






         为了能执行规则件E:\rscfile\1.1\studnet\info.rsc,新建了一个java类StudentDto1.java,代码如下
package com.flagleader.student;
import java.io.File;
import com.flagleader.engine.RuleEngine;
import com.flagleader.engine.RuleEngineException;
import com.flagleader.engine.RuleEngineFactory;
import com.flagleader.engine.RuleEngineManager;
public class StudentDto1 {
public static void main(String[] args) {
try {
RuleEngineManager.getInstance().init(new File("E:\\rscfile"));
RuleEngine engine=RuleEngineFactory.getInstance("1.1").getRuleEngine();
StudentMap map=new StudentMap();
engine.executeBeans("student.info", map,map.getStudent());
System.out.println(map.getStudent());
System.out.println(map.getTeacher().getTeacher());
} catch (RuleEngineException e) {
e.printStackTrace();
}
}
}

         点击执行后,可以看到如下结果:





         说明已经调用了student.info规则包,并且根据传入的参数,返回处理结果。

猜你喜欢

转载自1990994609.iteye.com/blog/2264467