Server
ExtDirectSpring支持轮询服务(POST)和(GET)参数。要配置轮询方法,必须注释@ExtDirectMethod(value = ExtDirectMethodType.POLL, event = "eventName")。这个方法必须是一个Spring管理的bean的成员函数。event属性是事件的名称。如果一个轮询方法需要支持参数,参数需要添加注释@RequestParam。value属性必须对应请求参数的名称,这个参数是可选的如果编译带有调试信息。如果没有value属性Spring试图读参数名从调试信息。
@Service
public class Poll {
@ExtDirectMethod(value = ExtDirectMethodType.POLL, event = "message1")
public String handleMessage1() {
...
}
@ExtDirectMethod(value = ExtDirectMethodType.POLL, event = "message2")
public int handleMessage2(@RequestParam int id) {
...
}
@ExtDirectMethod(value = ExtDirectMethodType.POLL, event = "message3")
public int handleMessage3(@RequestParam(value = "id", defaultValue = "1") int id) {
...
}
@ExtDirectMethod(value = ExtDirectMethodType.POLL, event = "message4")
public int handleMessage4(@RequestParam(required = false) Integer id) {
...
}
注释@RequestParam的工作方式跟Spring MVC一致。handleMessage2方法中参数id是强制的,如果请求丢失参数将会抛出异常。handleMessage3的id参数是可选的,如果请求参数没有值,默认值是1.handleMessage4的id参数也是可选的,但将会赋值为null,如果参数没有赋值。
轮询方法的参数签名也可以包含服务器对象参数。
@ExtDirectMethod(value = ExtDirectMethodType.POLL)
public String message5(HttpServletResponse response, HttpServletRequest request,
HttpSession session, Locale locale,
@RequestParam(value = "id") int id) {
...
}
服务器参数可以出现在任意位置和参数的名称无关。
Client
在JavaScript你可选择配置一个轮询服务提供者直接用new方法或用一个配置对象。
var pollProvider = new Ext.direct.PollingProvider({
type:'polling',
url: Ext.app.POLLING_URLS.message1
});
//Ext JS 3
Ext.Direct.addProvider(pollMessage1);
//Ext JS 4.x and Sencha Touch 2
Ext.direct.Manager.addProvider(pollMessage1);
//Ext JS 3.x
Ext.Direct.addProvider({
type: 'polling',
url: Ext.app.POLLING_URLS.message2,
baseParams: {
id: 1
}
});
//Ext JS 4.x and Sencha Touch 2
Ext.direct.Manager.addProvider({
type: 'polling',
url: Ext.app.POLLING_URLS.message2,
baseParams: {
id: 1
}
});
baseParams是一个特殊的对象,包含的属性在每个轮询请求时会作为参数发送到服务器。
//Ext JS 3.x
Ext.Direct.addProvider({
id: 'myPollingProvider',
type: 'polling',
url: Ext.app.POLLING_URLS.message3,
interval : 9000
});
//Ext JS 4.x and Sencha Touch 2
Ext.direct.Manager.addProvider({
id: 'myPollingProvider',
type: 'polling',
url: Ext.app.POLLING_URLS.message3,
interval : 9000
});
interval表示多长时间调用一次服务器方法。如上面配置每9秒调用一次handleMessage3方法。轮询方法立刻调用在方法添加到服务提供者。可以暂停和启动轮询方法,调用pollProvider.disconnect()和pollProvider.connect()。如果服务提供者有id,Ext.Direct.getProvider('myPollingProvider') / Ext.direct.Manager.getProvider('myPollingProvider')将会返回服务提供者实例。
Ext JS 3
每次JavaScript调用服务器方法,将会创建一个包含结果的event。用Ext.Direct.on 添加一个监听可以注册这些事件,在监听函数处理返回结果。
Ext.Direct.on({
message1: function(e) {
if (true === e.status) {
//Successful
Ext.MessageBox.alert("Result", e.data);
} else {
//Failure
}
},
message2: function(e) {
...
},
message3: function(e) {
...
},
});
Ext JS 4.x and Sencha Touch 2
Ext.direct.Manager.addProvider({
type: 'polling',
url: Ext.app.POLLING_URLS.message3,
listeners: {
data: function(provider, e) {
//first parameter is a reference to PollingProvider that sent the event
//e event object
}
}
});
//OR
var pollProvider = new Ext.direct.PollingProvider({
type:'polling',
url: Ext.app.POLLING_URLS.message1
});
pollProvider.addListener('data', callback, scope);
event包含下面这些属性:
data - 服务器方法的返回值
name - 事件名称
status - true方法调用成功,false方法调用失败
type - 'event' 或 'exception' 如果调用失败
Examples
- http://demo.rasc.ch/eds/extjs3/direct.html
- http://demo.rasc.ch/eds/extjs3/dynamic.html
- http://demo.rasc.ch/eds/extjs42/direct.html
- http://demo.rasc.ch/eds/extjs42/live.html
- http://demo.rasc.ch/eds/extjs41/direct.html
- http://demo.rasc.ch/eds/extjs41/live.html