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。此文件如果不存在请自行创建。

results matching ""

    No results matching ""