3.5高级扩展使用说明
3.5JSP中调用应用里类的方法
在JSP中,如果需要调用应用中类的方法,首先需要引入emap的标签,样例如下:
<%@ taglib prefix="e" uri="/WEB-INF/tags/emap.tld" %>
使用样例如下:
<e:call id="myBean" method="test" params="string"/>
这个标签就会调用当前应用下,bean的id为myBean中的test方法
类的定义样例如下
@Service("myBean")
public class ClassName {
public String test(String param) {
return "....";
}
}
如果是直接调用某个类的静态方法,使用样例如下:
<e:call className="com.wisedu.xxx.ClassName" method="test" params="string"/>
* call标签中各个属性的说明
className,指定需要调用的静态方法所在的类
id,指定需要调用的方法所在的对象(spring中的id)
method,需要调用的方法名,目标对象(或类)中此名称的方法最好只有一个
params,需要传入的参数
var,方法调用的结果将以什么名称设置到当前请求的作用域中,如:var="tmpName",后面就能使用${tmpName}
printResult,是否要将调用的结果输出到标签所在的位置,默认为false
*被调用的方法可以设置的入参类型
HttpServletRequest, HttpServletResponse, JspWriter
String此类型的参数将会获取到params属性中设置的值
3.5.2特殊的条件、参数、输出的处理
如果你需要使用一些特殊的功能,如一些特殊的条件构造方式,一些特殊的结果处理方式。当然,这些处理可以在干预类中实现,如果仅仅是一个特殊的条件构造方式,使用干预类就显得比较费事了。所以EMAP提供了很多扩展口,让你能够定义这些对象。
这些扩展对象需要定义在应用中的config/eterna.xml文件里,相关的对象如何定义将在后面一个个列出。
如果应用是继承自父应用,则父应用的“config/eterna.xml”文件里的配置也会在子应用中生效。
3.5.2.1自定义条件构造器及列表
<?xml version="1.0" encoding="utf-8"?>
<!--
自定义条件构造器及列表的样例
-->
<eterna-config>
<factory>
<objs>
<!-- 定义一个查询是否在子表中的条件构造器 -->
<builder name="myExists" caption="存在" generator="self.micromagic.util.TemplateBuilder">
<attribute name="template" value="[C0] in (select xxxId from T_XXX where xxxColumn = ?)"/>
</builder>
<!--
说明:
builder中的name属性为条件构造器的标识,可以设置在数据模型或业务模型的相关列的“条件构造器”这个属性项中
builder中的标题属性会显示在高级查询中,操作的下拉列表的选项中
builder中的generator数据用于设置构造类,这里使用这个构造类就行了
子元素中名称为template的属性节点,用于设置构造出的条件模板。
模板的说明:
?, 表示传入的参数
[C0], 表示当前列中的列名项
如果在列名为“T_TEST.testCol”列中设置了此条件构造器,那构造出的条件如下:
select ... from ... where ... T_TEST.testCol in (select xxxId from T_XXX where xxxColumn = ?)
-->
<!--
多个列名项的配置:
在业务模型中添加的自定义列中可以自己设置列名,可以通过","分隔设置多个列名
如:“T_TEST.testCol,T_XXX,xxxColumn”
这样,条件构造器可以按如下方式定义
-->
<builder name="myExists2" caption="存在" generator="self.micromagic.util.TemplateBuilder">
<attribute name="template" value="[C0] in (select xxxId from [C1] where [C2] = ?)"/>
</builder>
<!--
说明:
如果列名是以","分隔的多个名称,[C0]、[C1]、[C2]分别表示列名中的第一个、第二个、第三个
-->
<!--
前面的例子中使用的是等于,如果需要以LIEK的方式进行判断,配置方式如下:
-->
<builder name="myExists3" caption="存在" generator="self.micromagic.util.TemplateBuilder" prepare="escapeStr_include">
<attribute name="template" value="[C0] in (select xxxId from T_XXX where xxxColumn LIKE ? escape '\')"/>
</builder>
<!--
说明:
判断方式改为LIKE ? escape '\',并且添加了一个参数处理器“escapeStr_include”
此参数处理器的作用是在传入的字符串两边添加"%",并且将字符串中出现的"%"和"_"替换为"\%"和"\_"
-->
<!-- 定义条件构造器列表 -->
<builder-list name="myBuilderList">
<builder-name name="include"/>
<builder-name name="equal"/>
<builder-name name="notEqual"/>
<builder-name name="myExists"/>
</builder-list>
<!--
说明:
builder-list中的name属性为条件构造器列表的标识,可以设置在数据模型或业务模型的相关列的“条件构造器列表”这个属性项中
字节的中的每个builder-name节点用于指定一个条件构造器的名称,这个列表将作为高级查询中,操作的下拉列表
-->
</objs>
</factory>
</eterna-config>
注:如果需要调整默认的条件构造器,只需要修改条件构造器列表中的第一个值就行了。如全局定义的字符串条件构造器列表如下:
<builder-list name="cbl_String">
<builder-name name="equal"/>
<builder-name name="notEqual"/>
<builder-name name="include"/>
<builder-name name="notInclude"/>
<builder-name name="beginWith"/>
<builder-name name="endWith"/>
<builder-name name="m_value_include"/>
<builder-name name="m_value_equal"/>
<builder-name name="m_value_not_include"/>
<builder-name name="m_value_not_equal"/>
</builder-list>
现在第一个是“equal”即相等,也就是默认构造的条件是相等,如果把“include”调整到第一个,那默认构造的条件就会变为包含。
你可以在应用的“config/eterna.xml”文件里重新定义这个条件构造器列表,用于调整默认构造的条件。如果多个应用使用的配置相同,则可在公共的父应用中统一设置。
另外,全局定义的转大写构造列表如下:
<builder-list name="cbl_upper_String">
<builder-name name="upper_equal"/>
<builder-name name="upper_notEqual"/>
<builder-name name="upper_include"/>
<builder-name name="upper_notInclude"/>
<builder-name name="upper_beginWith"/>
<builder-name name="upper_endWith"/>
<builder-name name="upper_m_value_include"/>
<builder-name name="upper_m_value_equal"/>
<builder-name name="upper_m_value_not_include"/>
<builder-name name="upper_m_value_not_equal"/>
</builder-list>
3.5.2.2自定义条件构造器对象
<builder name="myBuilder" caption="包含" generator="com.wisedu.MyBuilder"/>
需要使用的条件构造实现类可以在generator属性中指定,如上面的例子。实现类的编写样例如下:
public class MyBuilder extends AbstractConditionBuilder{
public BuilderResult buildeCondition(String colName, Object value, ConditionProperty cp){
ValuePreparer[] arr = new ValuePreparer[2];
arr[0] = this.createValuePreparer(cp, value);
arr[1] = this.createValuePreparer(cp, "test");
return new BuilderResult(colName + " in (?, ?)", arr);
}
}
参数说明:
colName,为数据模型或业务模型中设置的列名
value,为当前传入的条件值
cp,为条件的配置信息
返回类型为BuilderResult,可以直接构造。第一个参数为语句片段,如果有参数请用“?”占位。第二个参数为与语句片段中的“?”对应的列表,构造方式见上面代码中的样例。
3.5.2.3自定义对象的使用
使用自定义的条件构造器,可以将它的名称直接设置在数据(/业务)模型的“条件构造器”属性上。
使用自定义的条件构造器列表,可以将它的名称直接设置在数据(/业务)模型的“条件构造器列表”属性上。
注:所有自定义的对象不会在下拉列表中显示出来,需自行输入。
3.5.3特殊的环境变量
环境变量会使用在如下场景:
1.数据(/业务)模型的默认值,以“env:”起始
2.页面模型的参数来源,以“env:”起始
3.权限脚本的变量,用“${…}”包裹
4.字典条件脚本的变量,用“${…}”包裹
5.动作流的表达式,不加特殊标识
3.5.3.1获取用户对象中的item
使用样例,custom.currentUserItems.[itemName]
[itemName]为需要获取的item名称。
3.5.3.2获取指定方法的返回值
使用样例,bean.[beanId].[property]
[beanId]为注册在当前应用spring中对象的id
[property]为对象中的get方法名,此方法必须为无参且有返回值的方法
如spring中对象的id为testBean,其中有个方法为getValue,则配置如下:
bean.testBean.value
此环境变量可以用在权限的脚本中,用于动态生成行过滤需要的条件值。需要的用户对象或request对象可以通过CurrentThread中获取。
注:这样可以灵活的控制行权限,但请不要将权限与查询的需要混在一起。
3.5.4让spring扫描应用中的lib
如果应用中lib目录下的jar包也要进入spring的扫描,那需要在应用的spring中添加额外的配置。如:<context:component-scan base-package="com.wisedu.xxx.*">,表示需要扫描jar包中“com.wisedu.xxx”package下的类。
注:spring的配置文件为:[应用目录]/config/spring.xml。此文件如果不存在请自行创建。