2008年8月5日
#
2008年7月26日
#
2008年7月17日
#
2008年7月6日
#
2008年6月21日
#
下载
2008年6月11日
#
一 ajax View类型支持。Imvc的视同是通过一个View类来返回的,在action中通过return new View("/xxx.html")返回一个视图,然后IMVC会通过Value中的数据渲染这个视图。这是一般的流程,有些特殊的流程可以返回其他类型的View,我们先来看看View类的代码:
publicfinalclassViewimplementsCloneable{/*** 属性介绍:普通的view,通过模板转换*/publicstaticfinalintTYPE_VIEW=1;/*** 属性介绍:转向,不改变url*/publicstaticfinalintTYPE_REDIRECT=2;/*** 属性介绍:专心 ,改变url*/publicstaticfinalintTYPE_REDIRECT2=3;/*** 属性介绍:直接返回string,path的值*/publicstaticfinalintTYPE_AJAX=4;publicstaticfinalintTYPE_EXCEPTION=5;privateString path;privateinttype=1;publicView(String path){this.path=path;
}publicView(String path,inttype){this.path=path;this.type=type;
}publicView(Map map){
JSONObject jsono=JSONObject.fromObject(map);
path=jsono.toString();
type=TYPE_AJAX;
}publicView(List array){
JSONArray jsona=JSONArray.fromObject(array);
path=jsona.toString();
type=TYPE_AJAX;
}publicView(Object bean){
JSONObject jsono=JSONObject.fromObject(bean);
path=jsono.toString();
type=TYPE_AJAX;
}publicString getPath() {returnpath;
}publicvoidsetPath(String path) {this.path=path;
}publicintgetType() {returntype;
}publicvoidsetType(inttype) {this.type=type;
}publicView clone(String path){
View v=cloneBase();
v.path=path;returnv;
}publicView clone(String path,inttype){
View v=cloneBase();
v.path=path;
v.type=type;returnv;
}publicView clone(Map map){
View v=cloneBase();
JSONObject jsono=JSONObject.fromObject(map);
v.path=jsono.toString();
v.type=TYPE_AJAX;returnv;
}publicView clone(List array){
View v=cloneBase();
JSONArray jsona=JSONArray.fromObject(array);
v.path=jsona.toString();
v.type=TYPE_AJAX;returnv;
}publicView clone(Object bean){
View v=cloneBase();
JSONObject jsono=JSONObject.fromObject(bean);
v.path=jsono.toString();
v.type=TYPE_AJAX;returnv;
}privateView cloneBase(){
View v=null;try{
v=(View)super.clone();
}catch(CloneNotSupportedException e) {//TODO Auto-generated catch blocke.printStackTrace();
}returnv;
}
}
我们主要关注以下几个变量:
/*** 属性介绍:普通的view,通过模板转换*/publicstaticfinalintTYPE_VIEW=1;/*** 属性介绍:转向,不改变url*/publicstaticfinalintTYPE_REDIRECT=2;/*** 属性介绍:专心 ,改变url*/publicstaticfinalintTYPE_REDIRECT2=3;/*** 属性介绍:直接返回string,path的值*/publicstaticfinalintTYPE_AJAX=4;publicstaticfinalintTYPE_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=newUser();
u.setAge(1);
u.setName("汪汪汪");returnViewFactory.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支持就讲到这里。
2008年6月10日
#
publicinterfaceIAction {/*** 属性介绍:验证器,放入Map value 的key*/publicstaticfinalString MVC_STATIC_validation="__validation";/*** 属性介绍:文件上传 Map value中的key*/publicstaticfinalString MVC_STATIC_createUpload="__createUpload";/*** 属性介绍:这是编辑器*/publicstaticfinalString MVC_STATIC_editor="__editor";/*** 方法说明:action的核心方法
&
nbsp; *<
span style="color: #808080;">@paramobject 如果是post方法,object就
是该action对应的form,如果是get方法并且配置get方法没有form
* 那么这里就是null,如果配置get方法也是有form的,这里也是form
*
&
nbsp; *<
span style="color: #808080;">@paramvalue 一个map,在
action中添加内容到view都往这里添加
*@return* String*/publicView execute(Object object,Value value);
}
前
面三个变量这里暂时不说,我们来关注最后一个方法,execute,任何action都需要实现这个接口,同时也就是说必须在action中有这个方法。
这个方法有两个传入变量Object和Value,第一个是想要的formBean,如果是get方法并且没有配置get方法设置form,那么这个时候
就是null,如果是非get方法,而且还传入了参数,那么IMVC会自动封装相应的form传入到这个。第二个Value参数,Value也是一个很核
心的接口。在IMVC中有ValueImpl类来实现。
Value 接口:
publicinterfaceValue {publicString getString(String key);publicString[] getArray(String key);publicvoidsetObject(String key,Object value);publicObject getObject(String key);
}
ValueImpl 类:
publicfinalclassValueImplextendsHashMapimplementsMap,Value,InstantValue{//InstantValuepublicvoidsetArray(String key ,String[] arr){super.put(key, arr);
}//user ValuepublicString[] getArray(String key) {return(String[])super.get(key);
}publicObject getObject(String key) {returnsuper.get(key);
}publicString getString(String key) {
Object o=super.get(key);if(o==null){returnnull;
}if(oinstanceofString[]){return((String[])o)[0];
}else{returnnull;
}
}publicvoidsetObject(String key, Object value) {super.put(key, value);
}//以下实现clone。。提供性能privateValueImpl cloneBase(){
ValueImpl vimpl=(ValueImpl)super.clone();
vimpl.clear();returnvimpl;
}publicstaticValueImpl valueImpl=newValueImpl();publicstaticValueImpl cloneSelf(){returnvalueImpl.cloneBase();
}
}
这个类也相当简单,我们看第一句:
publicfinalclassValueImplextendsHashMapimplementsMap,Value,InstantValue
说
明这个类 继承了HashMap,实现了Map,Value,InstantValue 三个接口。这三个接口其实就是三个权限版本,比如Value是用
户操作权限,我们看到在action中传入的是Value,但是在IMVC内部操作的时候是把ValueImpl类转换为InstantValue借口的
InstantValue 接口:
publicinterfaceInstantValue {publicvoidsetArray(String key,String[] value);
}
这个几口只有一个方法,这个方法是不会暴露给用户的,是提供IMVC内部设值用的。
下面还有一个拦截器接口
IInerceptor 拦截器接口:
publicinterfaceIInterceptor {publicvoidexecute(HttpServletRequest request,HttpServletResponse response,Value value);
}
这个接口也相当简单,只有一个方法,传入request和response参数,同时还有一个Value参数,这个Value上面已经说过,是一个用户操作的数据接口。
整个IMVC流程图简单来说如下:
首先,请求来了后,IMVC会创建一个ValueImp转换为Value传给前拦截器(如果没有设
置就不用),拦截器操作完毕,在把这个ValueImp转换为InstantValue接口传给IMVC内部操作,操作完毕接着把它转化为Value接口
供用户Action操作,最后执行后拦截器,执行完毕转换为Map借口供模板引擎渲染试图。
一个ValueImp要转换为三种权限接口,所以他的实现就要implements 三个接口。
actionPackageBasePath="test.action"formPackageBasePath="test.form"templateBasePath="/template"resourceBasePath="/re"urlPostfix=".x"webUrl="yao.com:8282"/>
isOpenActionCache="false"isOpenValidationCache="false"isGetMethodHasForm="false"isOpenAjaxIdentityValidate="false"fileUploadBasePath="/upload"fileUploadMax="1974592963"fileUploadFormat="pdf,jpg,gif"printOutCharacter="UTF-8"templateCharacter="UTF-8"uploadCharacter="UTF-8"isOpenFreemarkerCache="false"/>
前面那个 baseConfig是必须设置,后面optionalConfig是可选,可以不设置,IMVC有默认设置。具体的配置如下:
必填:
actionPackageBasePath :基础action包根目录
formPackageBasePath:基础form包根目录
templateBasePath:基础模板文件根目录
resourceBasePath:InstantMVC自带的资源文件目录
urlPostfix:action请求后缀
webUrl:网站域名,比如yao.com主要用于ajaxView的权限检测
可选:
isOpenActionCache="false" :是否开启action的缓存,也就是是否设置action为单例
isOpenValidationCache="false":是否开启检验框架的缓存
isGetMethodHasForm="false":是否为get方法也设置form填充
isOpenAjaxIdentityValidate="false":是否开启ajaxView的权限验证(不能跨域调用)
fileUploadBasePath="/upload":文件上传根目录,默认是/upload
fileUploadMax="1974592963":上传文件最大 ,可选,默认1048576=1024×1024 b
fileUploadFormat="pdf,jpg,gif":上传允许默认的格式,可选,默认为 pdf,jpg,gif,txt
printOutCharacter="UTF-8" : #可选,默认为UTF-8,表示通过action直接打印到客户端字符的编码,一般用到ajax发生
templateCharacter="UTF-8" :#可选,默认为UTF-8 ,表示通过模板方式显示到客户端的编码,一般用到直接的请求
isOpenFreemarkerCache="false":#是否开启freemarker模板缓存
最基础的配置就这些了,后面那个可选其实也可以去掉。
然后我们在项目中新建立一个包
test.action.test
然后在包下新旧一个java类:Hello:
publicclassHelloimplementsIAction{publicView execute(Object object, Value value) {
&
nbsp;
value.setObject("<
/span>hello","hello,欢迎来到
InstantMVC的世界。。。");returnViewFactory.getView("/test.html");
}
}
ok,然后我们在 web项目根目录下创建一个模板文件夹 template
在template下创建一个html文件 :test.html:
HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
test.html${hello}很
简单的Html,里面只有一个地方需要主意的就是 ${hello}这个东西,还记得上面Hello.java中的value.setObject("hello"
,"hello,欢迎来到InstantMVC的世界。。。");
吗?其实这就是取出hello中的值。好一切配置都完成。额。好像还缺点什么,对,没有配置web.xml,下面是基本的 配置:<
br />
instantMVCControlleryao.instant.mvc.sevlet.InstantFrontControllermvc_config/mvcConfig.xmlsingle_config/instant.single0instantMVCController*.x
其
中yao.instant.mvc.sevlet.InstantFrontController
是IMVC的前端拦截器,有两个参数,第一个是刚刚写的配置文件mvcConfig.xml相对于classPath的路径,第二个是IMVC内建的一个
对象管理容器的配置,这里可以先不写(或则在classPath下新建一个空的文件Instant.single,内容不用写)。下面那个是url映射,
把.x的后缀映射到IMVC框架。好了,一切的搞定,下面就运行
启动tomcat,在浏览器中输入http://localhost:8080/test/hello.x 就会看到一下结果:
看,一个简单的helloworld程序就完成了。下面我们回顾一下这个过程是怎么进行的。
首先,我们先回顾下我们的配置文件中有一个配置选项:
actionPackageBasePath="test.action"
这
个选项表示IMVC将会首先通过这个路径去寻找相应的匹配url的action,比如我们上面的url是:/test/hello.x 那么IMVC会首
先寻找 test.action.test包下的Hello类,如果没有存在,会报异常,如果存在,就执行Hello类的execute方法。在
execute方法最后返回了一个View,其中一个参数是模板位置,比如本例中是View("/test.html"),那么这个文件在哪呢?IMVC
又是怎么去寻找的呢,再回来看配置文件,其中的一个参数:
templateBasePath="/template"
这
个参数的意识就是吧web目录下的template作为主要的模板文件的根目录,此例中/test.html就是寻找的
/template/test.html文件,然后渲染模板,会把其中的${hello}参数渲染为 action中通过value这个对象设置的值,比
如本例中是:value.setObject("hello", "hello,欢迎来到InstantMVC的世界。。。");<
br />
至此,一个简单的get方法的IMVC流程结束。
这里其他的功能没有说道,比如View中有一种专门的返回ajax的View类型,比如还有拦截器,比如还有form填充和参数获取等都没说,下次再详细说明。
ps:InstantMVC目前还在内部修改完善,还不能提供版本下载。