【发明内容】
基于此,有必要提供一种即能节省存储空间又能减少数据库与应用程序之间的数据传输,从而能提高***性能的JSF中执行动态方法的方法。
一种JSF中执行动态方法的方法,包括以下步骤:对方法进行注册得到方法表达式,并存储在数据库中;执行方法时从数据库中查询方法表达式;根据所述方法表达式调用方法。
优选的,所述对方法进行注册得到方法表达式的步骤为:获取托管Bean的名称和方法名;组合所述托管Bean的名称和方法名,得到方法表达式。
优选的,所述获取托管Bean的名称的步骤为:获取输入的类名;根据所述类名使用工具类计算得到托管Bean的名称。
优选的,所述从数据库中查询方法表达式的步骤之前还包括:将方法执行时所需实参保存在数据库中。
优选的,所述根据所述方法表达式调用方法的步骤为:根据所述方法表达式解析出托管Bean的名称和方法名;根据所述托管Bean的名称创建托管Bean对象;从所述托管Bean对象中获取环境参数,根据所述环境参数调用所述方法名对应的方法。
此外,还有必要提供一种既能节省存储空间又能减少数据库与应用程序之间的数据传输,从而能提高***性能的JSF中执行动态方法的装置。
一种JSF中执行动态方法的装置,包括:注册模块,用于对方法进行注册,得到方法表达式;数据库,用于存储所述方法表达式;查询模块,用于在执行方法时从所述数据库中查询方法表达式;执行模块,用于根据所述查询到的方法表达式调用方法。
优选的,所述注册模块包括:获取模块,用于获取托管Bean的名称和方法名;组合模块,用于组合所述托管Bean的名称和方法名,得到方法表达式。
优选的,所述获取模块用于获取输入的类名,并根据所述类名使用工具类计算得到托管Bean的名称。
优选的,所述数据库还用于保存方法执行时所需实参。
优选的,所述执行模块包括:解析模块,用于根据所述方法表达式解析出托管Bean的名称和方法名;创建模块,用于根据所述托管Bean的名称创建托管Bean对象;调用模块,用于从所述托管Bean对象中获取环境参数,根据所述环境参数调用所述方法名对应的方法。
上述JSF中执行动态方法的方法及装置,通过将方法注册得到的方法表达式存储在数据库中,在执行方法时则根据方法表达式来调用方法,无需将环境参数存储在数据库中,方法执行时使用JSF中的方法表达式技术就可以恢复环境参数,从而不需要从数据库恢复环境参数,这样,既节省了存储空间,又能减少数据库与应用程序之间的数据传输,提高了***运行性能。
【具体实施方式】
在一个实施例中,如图1所示,一种JSF中执行动态方法的方法,包括以下步骤:
步骤S10,对方法进行注册得到方法表达式,并存储在数据库中。
在一个实施例中,如图2所示,步骤S10中对方法进行注册得到方法表达式的具体过程为:
步骤S102,获取托管Bean的名称和方法名。
JavaBean是一种Java语言写成的可重用组件。用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创建的对象进行打包,并且其它开发者也可以通过内部的JSP页面、Servlet、其他JavaBean、Applet程序或者应用来使用这些对象。托管Bean(Managed Bean)是JSF中由框架负责管理其生命周期的一种JavaBean,它的创建、初始化、销毁等生命周期行为都由JSF框架负责完成。一个托管Bean描述了一个JavaBean如何创建和管理的。
在一个实施例中,如图3所示,步骤S102中获取托管Bean的名称的具体过程如下:
步骤S112,获取输入的类名。
不同的托管Bean,其托管Bean的名称是不一样的。JSF中,使用通用的工具类,就可以根据托管Bean的类名来计算得到当前的托管Bean的名称。
步骤S122,根据类名使用工具类计算得到托管Bean的名称。
用户只需要输入一个参数,即托管Bean的类名,使用工具类就可以自动计算出托管Bean的名称。
步骤S102中获取方法名可以是用户提供的方法名或预先约定的方法名。若预先未约定方法名,则用户需要输入类名和方法名,若预先约定了方法名,例如约定所有托管Bean里特定用户的方法名都叫remove,那么用户只需要输入类名即可。
步骤S104,组合托管Bean的名称和方法名,得到方法表达式。
方法表达式是表达式语言(Expression Language,EL)中的一种,方法表达式允许调用一个任意类的任意公用(public)方法,可以在调用时传递一系列参数,如果调用的方法有返回值的话,方法表达式可以返回这个返回值。
该实施例中,方法表达式为托管Bean的名称+方法名。例如,组合托管Bean和方法名得到的方法表达式为:String el=″#{″+elFromDB+″.methodName}″,其中,el表示方法表达式,String表示该方法表达式的数据类型为字符串型,″+elFromDB+″为托管Bean的名称,methodName为方法名。
该实施例中,将上述组合得到的方法表达式存储在数据库中,便于后续在执行方法时从数据库中取出方法表达式。
在一个实施例中,将方法执行时所需实参也保存在数据中。
在执行方法时,若方法只依赖于环境参数,而不依赖于非环境参数,则不需要保存实参,否则需要保存实参。例如,要进行一个通用的删除功能,对于不同的类(比如学生、课程、教师)有不同的删除方法,也可从不同的表中删除。在动态删除方法执行时,可能唯一关心的是删除哪一个对象(如哪个学生或哪个课程或哪个教师),即删除方法需要一条记录的关键字,该关键字即为实参。该实参在执行方法时先计算好,然后传递到动态方法中。例如,选择从表格中删除一个教师,先计算选择的教师的ID值teacherId,然后查找要执行的方法为teacherBean.removeTeacher,执行时实参为teacherId。
步骤S20,执行方法时从数据库中查找方法表达式。
步骤S30,根据方法表达式调用方法。
在一个实施例中,如图4所示,步骤S30的具体过程是:
步骤S302,根据方法表达式解析出托管Bean的名称和方法名。
JSF应用的运行环境即JSF引擎,步骤S302中,JSF引擎内的EL解析工具会将方法表达式自动分解,从而得到托管Bean的名称和方法名。
步骤S304,根据托管Bean的名称创建托管Bean对象。
托管Bean对象是托管Bean的一个实例,由托管Bean管理器来创建托管Bean对象。托管Bean管理器在创建托管Bean对象时,会自动初始化环境参数,因此,从托管Bean对象中能获取到方法执行时所需的环境参数。
步骤S306,从托管Bean对象中获取环境参数,根据所述环境参数调用所述方法名对应的方法。
由于托管Bean管理器在创建托管Bean对象时,会自动恢复环境参数,因此不需要事先将环境参数存储在数据库中,既节省了存储空间,又能减少数据库与应用程序之间的数据传输,提高了***运行性能。
在一个实施例中,如图5所示,一种JSF中执行动态方法的装置,包括注册模块10、数据库20、查询模块30和执行模块40,其中:
注册模块10用于对方法进行注册,得到方法表达式。
在一个实施例中,如图6所示,注册模块10包括获取模块102和组合模块104,其中:
获取模块102用于获取托管Bean的名称和方法名。
在一个优选的实施例中,获取模块102获取输入的类名,根据类名使用工具类计算得到托管Bean的名称。该实施例中,用户只需要输入一个参数,即托管Bean的类名,获取模块102使用工具类就可以自动计算出当前的托管Bean的名称。
获取模块102获取方法名可以是用户提供的方法名或预先约定的方法名。若预先未约定方法名,则用户需要输入类名和方法名,若预先约定了方法名,例如约定所有托管Bean里特定用户的方法名都叫remove,那么用户只需要输入托管Bean的类名即可。
组合模块104用于组合托管Bean的名称和方法名,得到方法表达式。
组合模块104得到的方法表达式为托管Bean的名称+方法名。例如,组合托管Bean和方法名得到的方法表达式为:Stringel=″#{″+elFromDB+″.methodName}″,其中,el表示方法表达式,String表示该方法表达式的数据类型为字符串型,″+elFromDB+″为托管Bean的名称,methodName为方法名。
数据库20用于存储方法表达式。
在一个实施例中,数据库20还用于保存方法执行时所需实参。
查询模块30用于在执行方法时从数据库20中查询方法表达式。
执行模块40用于根据查询到的方法表达式调用方法。
在一个实施例中,如图7所示,执行模块40包括解析模块402、创建模块404和调用模块406,其中:
解析模块402用于根据方法表达式解析出托管Bean的名称和方法名。
该实施例中,解析模块402是JSF引擎内的EL解析工具,其会将方法表达式自动分解,从而得到托管Bean的名称和方法名。
创建模块404用于根据托管Bean的名称创建托管Bean对象。
在创建托管Bean对象时,会自动恢复环境参数。因此从托管Bean对象中能获取到方法执行时所需的环境参数。
调用模块406用于从托管Bean对象中获取环境参数,根据环境参数调用所述方法名对应的方法。
由于创建模块404在创建托管Bean对象时能够自动恢复环境参数,因此不需要事先将环境参数保存在数据库20中,节省了存储空间,又能减少数据库20与应用程序之间的数据传输,从而提高了***运行性能。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。