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规则包,并且根据传入的参数,返回处理结果。
产品试用下载链接:试用下载_Visual Rules (flagleader.com)