计算机软件系统基于EL表达式实现Java方法直接调用的方法 【技术领域】
本发明涉及计算机软件系统领域,特别涉及计算机软件系统中Java调用技术领域,具体是指一种计算机软件系统中基于EL表达式实现Java方法直接调用的方法。
背景技术
在现代计算机软件系统中,Java语言和JSP已经被广泛应用,其中JSP中的EL(ExpressionLanguage,表达式语言)表达式方便简单,并且方法调用在应用中的作用是毋庸置疑的。
现有技术中的EL表达式规则和功能,大概有以下两点:
(1)支持标准的Javabean、Map、List、数组的属性或者指定位置的数据取得;
(2)支持各种基本运算符(比如:加减乘除、逻辑运算、条件表达式等)。
其中所存在的问题主要如下:
不支持直接的方法调用,比如:${“abc”.length()},是不可以的。
这样就大大限制了其广泛的应用,给计算机软件系统的开发和利用带来了一定的障碍。
【发明内容】
本发明的目的是克服了上述现有技术中的缺点,提供一种能够支持EL表达式的Java方法直接调用、有效解决EL表达式中变量值取值不灵活的问题、实现过程简单方便、工作性能稳定可靠、适用范围较为广泛的计算机软件系统中基于EL表达式实现Java方法直接调用的方法。
为了实现上述的目的,本发明的计算机软件系统中基于EL表达式实现Java方法直接调用的方法如下:
该计算机软件系统中基于EL表达式实现Java方法直接调用的方法,其主要特点是,所述的方法包括以下步骤:
(1)在系统的后缀属性预定义信息中加入函数后缀定义实现信息;
(2)在系统的EL表达式解析器进行后缀属性预定义信息解析操作中,增加函数后缀定义的解析实现信息;
(3)系统根据EL表达式中的Java方法调用信息查找到对应的Java方法,并调用执行该Java方法。
该计算机软件系统中基于EL表达式实现Java方法直接调用的方法中的后缀属性预定义信息为org.apache.commons.el.PropertySuffix中的信息。
该计算机软件系统中基于EL表达式实现Java方法直接调用的方法中的EL表达式解析器为org.apache.commons.el.parser.ELParser解析器。
该计算机软件系统中基于EL表达式实现Java方法直接调用的方法中的系统根据EL表达式中的Java方法调用信息查找到对应的Java方法,包括以下步骤:
(11)系统提取EL表达式中的Java方法调用信息中的方法名称信息和参数信息;
(12)系统根据所述的方法名称信息和参数信息进行对应的Java方法匹配查找处理;
(13)如果查找到对应的Java方法,则根据该Java方法的参数类型要求,对所述的参数信息进行类型强制转换,并返回上述步骤(3);
(14)如果无法查找到对应的Java方法,则结束。
该计算机软件系统中基于EL表达式实现Java方法直接调用的方法中的根据方法名称信息和参数信息进行对应的Java方法匹配查找处理,包括以下步骤:
(121)系统判断与所述的方法名称信息相同的Java方法是否存在;
(122)如果存在,则判断相应的Java方法所要求的参数个数是否与所述的参数信息相一致,且判断参数类型是否相符合;否则返回无法查找到对应的Java方法的结果;
(123)如果有满足以上条件的Java方法,则判断该满足以上条件的Java方法是否有多个;如果有多个,则从中随机选择一个Java方法,并返回查找到对应的Java方法的结果;否则选择该Java方法,并返回查找到对应的Java方法的结果;
(124)如果没有满足以上条件的Java方法,则从方法名称相同且参数个数相同的Java方法中随机选择一个Java方法,并返回查找到对应的Java方法的结果。
该计算机软件系统中基于EL表达式实现Java方法直接调用的方法中的参数类型相符合的条件为:
(1)byte、Byte、short、Short、int、Integer、long、Long、float、Float、double、Double、BigInteger、BigDecimal,互为相符合的参数类型;
(2)char、Character、String,互为相符合的参数类型;
(3)boolean、Boolean,互为相符合的参数类型;
(4)子类、父类,互为相符合的参数类型。
该计算机软件系统中基于EL表达式实现Java方法直接调用的方法中还包括以下步骤:
(4)在系统的EL表达式解析器进行函数调用信息解析操作中,增加工具类函数后缀定义的解析实现信息;
(5)系统根据EL表达式中的工具类Java方法调用信息查找到对应的工具类Java方法,并调用执行该工具类Java方法。
该计算机软件系统中基于EL表达式实现Java方法直接调用的方法中的函数调用信息为org.apache.commons.el.FunctionInvocation中的信息。
该计算机软件系统中基于EL表达式实现Java方法直接调用的方法中的系统根据EL表达式中的工具类Java方法调用信息查找到对应的工具类Java方法,包括以下步骤:
(21)系统提取EL表达式中的工具类Java方法调用信息中的方法名称信息和参数信息;
(22)系统根据所述的方法名称信息和参数信息进行对应的工具类Java方法匹配查找处理;
(23)如果查找到对应的工具类Java方法,则根据该工具类Java方法的参数类型要求,对所述的参数信息进行类型强制转换,并返回上述步骤(5);
(24)如果无法查找到对应的工具类Java方法,则结束。
该计算机软件系统中基于EL表达式实现Java方法直接调用的方法中的根据方法名称信息和参数信息进行对应的工具类Java方法匹配查找处理,包括以下步骤:
(221)系统判断与所述的方法名称信息相同的工具类Java方法是否存在;
(222)如果存在,则判断相应的工具类Java方法所要求的参数个数是否与所述的参数信息相一致,且判断参数类型是否相符合;否则返回无法查找到对应的工具类Java方法的结果;
(223)如果有满足以上条件的工具类Java方法,则判断该满足以上条件的工具类Java方法是否有多个;如果有多个,则从中随机选择一个工具类Java方法,并返回查找到对应的工具类Java方法的结果;否则选择该工具类Java方法,并返回查找到对应的工具类Java方法的结果;
(224)如果没有满足以上条件的工具类Java方法,则从方法名称相同且参数个数相同的工具类Java方法中随机选择一个工具类Java方法,并返回查找到对应的工具类Java方法的结果。
该计算机软件系统中基于EL表达式实现Java方法直接调用的方法中的参数类型相符合的条件为:
(1)byte、Byte、short、Short、int、Integer、long、Long、float、Float、double、Double、BigInteger、BigDecimal,互为相符合的参数类型;
(2)char、Character、String,互为相符合的参数类型;
(3)boolean、Boolean,互为相符合的参数类型;
(4)子类、父类,互为相符合的参数类型。
采用了该发明的计算机软件系统中基于EL表达式实现Java方法直接调用的方法,由于其中通过对后缀属性预定义信息中加入函数后缀定义实现信息,并在系统的EL表达式解析器进行后缀属性预定义信息解析操作中增加函数后缀定义的解析实现信息,从而使得用户不仅可以直接方便的使用EL表达式对数据进行运算,而且可以直接调用Java方法,不仅可以使用在EOS的图形化编程的图元以及richweb的标签中,而且实现了支持EL表达式的Java方法直接调用,有效解决了EL表达式中变量值取值不灵活的问题,同时实现过程简单方便,工作性能稳定可靠,适用范围较为广泛。
【附图说明】
图1为本发明的计算机软件系统中基于EL表达式实现Java方法直接调用的方法中在系统的后缀属性预定义信息中加入函数后缀定义实现信息的示意图。
图2为本发明的计算机软件系统中基于EL表达式实现Java方法直接调用的方法中增加函数后缀定义的解析实现信息的示意图。
【具体实施方式】
为了能够更清楚地理解本发明的技术内容,特举以下实施例详细说明。
请参阅图1和图2所示,该计算机软件系统中基于EL表达式实现Java方法直接调用的方法,其主要特点是,所述的方法包括以下步骤:
(1)在系统的后缀属性预定义信息中加入函数后缀定义实现信息;该后缀属性预定义信息为org.apache.commons.el.PropertySuffix中的信息;
(2)在系统的EL表达式解析器进行后缀属性预定义信息解析操作中,增加函数后缀定义的解析实现信息;该EL表达式解析器为org.apache.commons.el.parser.ELParser解析器;
(3)系统根据EL表达式中的Java方法调用信息查找到对应的Java方法,并调用执行该Java方法,包括以下步骤:
(a)系统提取EL表达式中的Java方法调用信息中的方法名称信息和参数信息;
(b)系统根据所述的方法名称信息和参数信息进行对应的Java方法匹配查找处理,包括以下步骤:
(i)系统判断与所述的方法名称信息相同的Java方法是否存在;
(ii)如果存在,则判断相应的Java方法所要求的参数个数是否与所述的参数信息相一致,且判断参数类型是否相符合;否则返回无法查找到对应的Java方法的结果;该参数类型相符合的条件为:
(I)byte、Byte、short、Short、int、Integer、long、Long、float、Float、double、Double、BigInteger、BigDecimal,互为相符合的参数类型;
(II)char、Character、String,互为相符合的参数类型;
(III)boolean、Boolean,互为相符合的参数类型;
(IV)子类、父类,互为相符合的参数类型;
(iii)如果有满足以上条件的Java方法,则判断该满足以上条件的Java方法是否有多个;如果有多个,则从中随机选择一个Java方法,并返回查找到对应的Java方法的结果;否则选择该Java方法,并返回查找到对应的Java方法的结果;
(iv)如果没有满足以上条件的Java方法,则从方法名称相同且参数个数相同的Java方法中随机选择一个Java方法,并返回查找到对应的Java方法的结果;
(c)如果查找到对应的Java方法,则根据该Java方法的参数类型要求,对所述的参数信息进行类型强制转换,并返回上述步骤(3);
(d)如果无法查找到对应的Java方法,则结束;
(4)在系统的EL表达式解析器进行函数调用信息解析操作中,增加工具类函数后缀定义的解析实现信息;该函数调用信息为org.apache.commons.el.FunctionInvocation中的信息;
(5)系统根据EL表达式中的工具类Java方法调用信息查找到对应的工具类Java方法,并调用执行该工具类Java方法,包括以下步骤:
(a)系统提取EL表达式中的工具类Java方法调用信息中的方法名称信息和参数信息;
(b)系统根据所述的方法名称信息和参数信息进行对应的工具类Java方法匹配查找处理,包括以下步骤:
(i)系统判断与所述的方法名称信息相同的工具类Java方法是否存在;
(ii)如果存在,则判断相应的工具类Java方法所要求的参数个数是否与所述的参数信息相一致,且判断参数类型是否相符合;否则返回无法查找到对应的工具类Java方法的结果;该参数类型相符合的条件为:
(I)byte、Byte、short、Short、int、Integer、long、Long、float、Float、double、Double、BigInteger、BigDecimal,互为相符合的参数类型;
(II)char、Character、String,互为相符合的参数类型;
(III)boolean、Boolean,互为相符合的参数类型;
(IV)子类、父类,互为相符合的参数类型;
(iii)如果有满足以上条件的工具类Java方法,则判断该满足以上条件的工具类Java方法是否有多个;如果有多个,则从中随机选择一个工具类Java方法,并返回查找到对应的工具类Java方法的结果;否则选择该工具类Java方法,并返回查找到对应的工具类Java方法的结果;
(iv)如果没有满足以上条件的工具类Java方法,则从方法名称相同且参数个数相同的工具类Java方法中随机选择一个工具类Java方法,并返回查找到对应的工具类Java方法的结果;
(c)如果查找到对应的工具类Java方法,则根据该工具类Java方法的参数类型要求,对所述的参数信息进行类型强制转换,并返回上述步骤(5);
(d)如果无法查找到对应的工具类Java方法,则结束。
在实际应用当中,本发明主要对EL表达式规则增加一个补充:方法直接调用。
方法的直接调用需要有下面两个特性(只针对Java):
支持实例的直接方法调用,并且支持嵌套
比如:
${“abc”.length()};
嵌套情况:${“abc”.substring(“abc”.length()-2)}。
支持工具类的直接方法调用,并且支持嵌套
比如:
${class:com.primton.common.Util.test(‘abc’)}。
基本方案如下:
1、基于apache-commons-el-1.0
实例的直接方法调用实现的技术方案:
(1)增加一种org.apache.commons.el.PropertySuffix的实现FunctionSuffix;
(2)在org.apache.commons.el.parser.ELParser解析PropertySuffix时,增加FunctionSuffix的解析实现;
(3)使用FunctionSuffix计算方法的值。
方法,根据参数尽全力匹配,方法找到后,会根据方法的参数类型,强制转换参数后执行方法;如果找不到方法,则会返回null。
方法匹配约束:如果方法名称相同,并且参数个数一致,参数类型大致相仿,则会随机选择一个方法执行;如果还是无法找到,则会随机取一个名称相同,参数个数相同的方法。
参数类型大致相仿是指:
●byte(Byte)、short(Short)、int(Integer)、long(Long)、float(Float)、double(Double)、BigInteger、BigDecimal,统一认为是数字类型,为相同类型;
●char(Character)、String,为相同类型;
●boolean、Boolean,互为相符合的参数类型;
●子类、父类,互为相符合的参数类型。
工具类的直接方法调用实现的技术方案
(1)在org.apache.commons.el.parser.ELParser解析FunctionInvocation时,增加class:XX.XXX的解析实现
(2)修改org.apache.commons.el.FunctionInvocation的evaluate方法实现,跟FunctionSuffix的实现和规则一样。
下面是一段使用的伪代码:
DefaultVariableResolverImpl resover=new DefaultVariableResolverImpl();
resover.put(″abc″,″12345″);
TestBean bean=new TestBean();
resover.put(″bean″,bean);
VariableResolverChain.getInstance().addVariableResolver(100,resover);
ELUtil.evaluate(″${bean.setCount(5)}″);//设定值
System.out.println(ELUtil.evaluate(″${abc.substring(1,bean.count)}″));
//结果是:2345
ELUtil.evaluate(″${class:com.primeton.test.TestBean.test()}″);
采用了上述的计算机软件系统中基于EL表达式实现Java方法直接调用的方法,由于其中通过对后缀属性预定义信息中加入函数后缀定义实现信息,并在系统的EL表达式解析器进行后缀属性预定义信息解析操作中增加函数后缀定义的解析实现信息,从而使得用户不仅可以直接方便的使用EL表达式对数据进行运算,而且可以直接调用Java方法,不仅可以使用在EOS的图形化编程的图元以及richweb的标签中,而且实现了支持EL表达式的Java方法直接调用,有效解决了EL表达式中变量值取值不灵活的问题,同时实现过程简单方便,工作性能稳定可靠,适用范围较为广泛。
在此说明书中,本发明已参照其特定的实施例作了描述。但是,很显然仍可以作出各种修改和变换而不背离本发明的精神和范围。因此,说明书和附图应被认为是说明性的而非限制性的。