Dorado 9 : AjaxAction(DCUG)

简介

用于执行远程过程的动作控件。此控件仅在配合Dorado服务端的开发模式中有意义。

参考范例:http://www.bsdn.org/projects/dorado7/deploy/sample-center/com.bstek.dorado.sample.Main.d#4900

配套说明文档:06. 实做AJAX(SEFC)

AjaxAction调用的服务一般都需要使用@Expose标记注册到ExposedService中:

@Component
public class AjaxTestService {
    @Expose
    public String toUpperCase(String parameter) {
        return "input:\n" + parameter + "\n\n" + "output:\n"
                + parameter.toUpperCase();
    }
}

关于ExposedService的详细说明请参考:Ajax(SEQS)#开发Ajax功能

详细属性说明

AjaxAction继承自Action,因此其基本属性请参考:Action

下面我们将只针对其特有的一些属性加以说明:

service

service用于指向具体的后台服务,我们会在后面随ExposedService一同介绍,parameter属性是传递给后台服务的参数,当命令执行成功之后读取returnValue属性可以获得服务端返回的信息。
RemoteServiceAction有同步和异步两种执行模式,通过其async属性可以进行选择。默认是以异步方式执行的,如无特殊需要我们也不推荐您以同步方式执行Ajax操作。

ExposedService

ExposedService就是指暴露给前端的服务,一般而言对应一个服务端的方法。Dorado7的客户端并不能自由的访问任意的后台服务,只有那些被明确声明为暴露的服务才能被客户端访问。要配置一个ExposedService服务的方法非常简单--使用@Expose标注。例如toUpperCaseAction相应的后台服务的声明位于org.dorado.sample.service.ajaxTestService类中,代码如下:

@Component
public class AjaxTestService {
    @Expose
    public String toUpperCase(String parameter) {
        return "input:\n" + parameter + "\n\n" + "output:\n"
                + parameter.toUpperCase();
    }
}

这段代码及其中Annotation的作用是在Spring上下文中注册一个名为ajaxTestService的Bean(这是有Spring提供的@Component标注完成的),并且将此Bean中的toUpperCase方法标注为可暴露服务。

在之前的内容可知RemoteServiceAction是通过spring:ajaxTestService#toUpperCase这样一个字符串来描述该服务的,该字符串的含义是Spring上下文中名为ajaxTestService的Bean中的toUpperCase方法,刚好匹配上面的定义。

 

我们需要对"spring:ajaxTestService#toUpperCase"这个表达式加深一下了解,这是一种由Dorado7引擎解释的表达式,用于描述一种服务,一般对应到一个具体的类实例或类实例中的某个方法。
其中"spring:"这个前缀用于描述该表达式具体的解析规则。这里的"spring:"表示后面来自于Spring上下文中的某个Bean的ID。
"#"是一个特定的分割符,用于分割类实例描述和方法名。如果此表达式是对应到一个类实例而不是某个具体方法的时候则应该省略"#"及其后面的部分。
"spring:"这样的前缀是可以由开发人员扩展的,以便于使表达式也可以与用户系统中的类工厂、服务工厂协同工作。具体的扩展方法以及该表达式更加详细的使用方法超出了本文的讨论范畴。

@Expose不仅可以定义在方法上,也可以定义在类上。@Expose定义在类上表示自动暴露该类中所有的public方法,您就不必再在每个方法上添加@Expose标注了。同时您还可以在此基础上使用@Unexpose将其中的某几个方法再此定义成不暴露。

此服务方法传入参数对应Action的parameter属性,返回值对应Action的returnValue。当然,在未来的使用过程中,Ajax操作的传入参数和返回信息并不总是像本例一样简单。对于更加复杂的情况我们会在后面的例子中进行介绍。

 

这里有一个延伸的话题,对于很多系统而言类似"spring:ajaxTestService#toUpperCase"这样的字符串可能具有一定的敏感性,用户可能不希望将这样的字符串传输至客户端从而增加系统的安全隐患。
Dorado7在设计时已经考虑到了这一点,在浏览器中查看页面源文件你就会发现,实际传输到客户端的是类似"jVaNGHmABd"这样的随机别名,而该随机字符串与真正的服务名之间的映射关系则只保存在后台。因此可暴露服务的服务名对于客户端而言事实是不可见的。
不过,随机别名的使用会在某个特殊场景下带来新的问题,这场景就是自动测试。像LoadRunner这一类的测试工具往往都支持预先录制好一段测试脚本对服务端功能进行测试,而随机别名的使用会令之前录制的脚本失效进而导致自动测试失败。
为了避免这一问题,Dorado7还特地提供了view.useRandomStringAlias选项以供用户选择究竟适用随机别名还是有规律的别名。有规律的别名能够确保总能为每个服务生成固定的别名,这会在一定程度上降低安全

 

batchable

默认模式下,AjaxAction支持自动合并功能:就是说在某个时间段中如果多次发出AjaxAction请求,Dorado会自动将这些Ajax请求打包合并,将多次Ajax请求合并为一个Ajax请求,从而减少HTTP请求的次数,提高运行效率。

但凡事有例外,在某些特殊情况下我们如果希望这个AjaxAction要独立处理,就可以通过设置batchable属性为false.

supportsEntity

是否支持Dorado的数据实体。

如果选择是,那么当有数据从服务端返回时,系统自动判断该数据在服务端的形态。 如果该数据在服务端是Entity/EntityList的形式,那么系统也会在客户端将他们转换成Entity/EntityList的形式。
如果选择否,那么不管这些数据在服务端是怎样的,到了客户端将变成JSON形式。

timeout

以毫秒为单位的超时时长。此特性在同步模式下不生效。

modal

默认情况下AjaxAction执行时会有一个系统提示框

如果想关闭这个默认的提示框,可以将modal属性设置为false

Attachments:

showTaskIndicator.png (image/png)