IMVC对ajax有了很好的支持。主要体现在两方面。
一 ajax View类型支持。Imvc的视同是通过一个View类来返回的,在action中通过return new View("/xxx.html")返回一个视图,然后IMVC会通过Value中的数据渲染这个视图。这是一般的流程,有些特殊的流程可以返回其他类型的View,我们先来看看View类的代码:
public final class View implements Cloneable{
/**
* 属性介绍:普通的view,通过模板转换
*/
public static final int TYPE_VIEW=1;
/**
* 属性介绍:转向,不改变url
*/
public static final int TYPE_REDIRECT=2;
/**
* 属性介绍:专心 ,改变url
*/
public static final int TYPE_REDIRECT2=3;
/**
* 属性介绍:直接返回string,path的值
*/
public static final int TYPE_AJAX=4;
public static final int TYPE_EXCEPTION=5;
private String path;
private int type=1;
public View(String path){
this.path=path;
}
public View(String path,int type){
this.path=path;
this.type=type;
}
public View(Map map){
JSONObject jsono=JSONObject.fromObject(map);
path=jsono.toString();
type=TYPE_AJAX;
}
public View(List array){
JSONArray jsona=JSONArray.fromObject(array);
path=jsona.toString();
type=TYPE_AJAX;
}
public View(Object bean){
JSONObject jsono=JSONObject.fromObject(bean);
path=jsono.toString();
type=TYPE_AJAX;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public View clone(String path){
View v=cloneBase();
v.path=path;
return v;
}
public View clone(String path,int type){
View v=cloneBase();
v.path=path;
v.type=type;
return v;
}
public View clone(Map map){
View v=cloneBase();
JSONObject jsono=JSONObject.fromObject(map);
v.path=jsono.toString();
v.type=TYPE_AJAX;
return v;
}
public View clone(List array){
View v=cloneBase();
JSONArray jsona=JSONArray.fromObject(array);
v.path=jsona.toString();
v.type=TYPE_AJAX;
return v;
}
public View clone(Object bean){
View v=cloneBase();
JSONObject jsono=JSONObject.fromObject(bean);
v.path=jsono.toString();
v.type=TYPE_AJAX;
return v;
}
private View cloneBase(){
View v=null;
try {
v = (View) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return v;
}
}
我们主要关注以下几个变量:
/**
* 属性介绍:普通的view,通过模板转换
*/
public static final int TYPE_VIEW=1;
/**
* 属性介绍:转向,不改变url
*/
public static final int TYPE_REDIRECT=2;
/**
* 属性介绍:专心 ,改变url
*/
public static final int TYPE_REDIRECT2=3;
/**
* 属性介绍:直接返回string,path的值
*/
public static final int TYPE_AJAX=4;
public static final int TYPE_EXCEPTION=5;
第一个是普通的View,通过ViewFactory.getView("/tt.html")这个方法返回的是普通的view,也就是可以通过IMVC渲染的视图,而TYPE_REDIRECT则是返回一个跳转view,可以跳转到下一个action,TYPE_REDIRECT2也是一个跳转view,不过是改变URL地址的view。TYPE_AJAX就是ajax试图了,也是今天要讲的主角了,至于最后一个TYPE_EXCEPTION,是把异常返回到客户端浏览器到view,这里暂时不考虑。我们可以通过这样一个构造函数创造出ajax试图,比如new View("这是ajax信息",View.TYPE_AJAX),或者通过ViewFactory.getView("这是ajax信息",View.TYPE_AJAX)也是一样,不过用factory创建的对象是通过对象的clone创建的,能节省一定的性能开销。当返回的是一个ajax View的时候,信息就会直接返回,而不是通过渲染试图,比如上面的就直接返回“这是ajax信息”给客户端,如果这个action是由客户端ajax请求的话,直接返回数据,是不是很方便呢?
接下来的ajx特性也许会让你觉得更方便,比如以下代码:
....action前面的内如.....
User u=new User();
u.setAge(1);
u.setName("汪汪汪");
return ViewFactory.getView(u);
这样的返回会直接在客户端打印出 {"age":1,"name":"汪汪汪"};也就是IMVC把对象映射成立JSON(一种js对象的String形式),这个返回数据在客户端直接可以调用,比如data.name就直接调用出“汪汪汪”,是不是很方便?而且IMVC还支持把List,数组,Map,还有对象相互无限级嵌套返回成JSON数据,这将大大增加AJAX开发的敏捷性和清晰性。
二 ajax Chain支持。我们假设有一个全部ajax的网页,里面有几个div中的数据都是通过ajax的方式向服务器请求的,那么每个div都会请求一次ajax action,这样就导致了请求次数频繁,资源的浪费,IMVC提供了一种ajaxChain的概念,可以通过一个url请求多个action,然后把数据自动合并,比如下面的url
http://xxx.com/ajaxChain.x?id=|one,two?id=1|
这个url请请求了两个action,然后把action数据合并,比如本来one.x返回的数据是{"name":"111"},而two返回的数据是 {"name":"2222"};则现在应该返回的是{"one":{"name":"111"},"two?id=1",{"name":"2222"}},这样,ajaxChain支持无数个action的连接。这样以后可以将多个ajax合并为一个ajax,节省服务器资源。
好了,IMVC的ajax支持就讲到这里。
--InstantMVC:j2ee轻量级mvc框架