它提供了两个重要的类:FrontAction和JSONActionSupport 。它们的用法如下:
前端Action类,所有的客户端请求通过此类转发到实际处理的Action类, 其思想和FrontServlet一样。在struts中如下配置:
struts.xml
......
<package name="net.sourceforge.kivu4j.utils.action.frontAction" extends="struts-default">
<action name="services" class="net.sourceforge.kivu4j.utils.action.FrontAction" method="services">
<result name="success" type="chain">
<param name="actionName">${actionName}</param>
<param name="namespace">${namespace}</param>
</result>
</action>
</package>
......
说明:客户端提交,必须指定namespace和actionName属性,用于确定具体处理的Action类及方法。
这样的设计,灵感来自解决Extjs库中Ext.data.Store的问题。通常情况下,这样使用Ext.data.Store的:
var ds = new Ext.data.JsonStore({
url : '../initAction/welcome.do',
fields : ["name", "value"]
}
});
ds.load();
问题:
应该创建子类BaseStore,继承Ext.data.Store。BaseStore类的url是固定的, 它访问的是FrontAction类的services方法,代码:
BaseStore.js
BaseStore = function(config){
var cfg = {
url:'services.action'
};
config = Ext.apply(config || {}, cfg);
// 设置namespace
this.setBaseParam('namespace', config.namespace);
// 调用父构造函数
BaseStore.superclass.constructor.call(this, config);
};
Ext.extend(BaseStore, Ext.data.JsonStore);
现在,可以创建一个特定对象的数据访问Store。比如PersonStore,它是人员的访问。代码:
PersonStore.js
PersonStore = function(config){
var cfg ={
fields:[{
name: 'ID'
},{
name: 'firstName'
},{
name: 'lastName'
}]
};
config = Ext.applyIf(config || {}, cfg);
config = Ext.apply(config, {
namespace:'/person',
});
PersonStore.superclass.constructor.call(this, config);
};
Ext.extend(PersonStore, BaseStore,{
loadById:function(id,options){
this.setBaseParam('actionName', 'loadById');
this.setBaseParam('id', id);
this.load(options);
},
loadByName:function(name,options){
this.setBaseParam('actionName', 'loadByName');
this.setBaseParam('name', name);
this.load(options);
},
});
可以这样使用:
var ds = new PersonStore();
ds.loadById(1);
......
ds.loadByName('张三');
......
ds.save({firstName:'三',lastName:'张'});
public class YourAction extends JSONActionSupport {
@Resource
private YourManager yourManager;
public String doAction1(){
try{
Long id = this.getRequestAsLong(); //{199} //转换json格式数据
String rslt = this.yourManager.doSomething(id); //处理数据
this.setResponseData(new ResponseList<String>(rslt)); //返回客户端数据
}catch(Exception e){
this.handleException(e);
}
return SUCCESS;
}
}
//字符串
String s = this.getRequestAsStr();// {'abc'}
//数值
Long l = this.getRequestAsLong();// {100}
//map
RequestMap rm = this.getRequestAsMap(); // {'name':'张三', 'age':30}
String name = rm.getStr("name");
Long age = rm.getLong("age");
//对象
Example e = this.getRequest(Example.class);// {name:'张三', age:30}
public class Example{
private String name;
private Long age;
// sets and gets
......
}