﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-设计java-文章分类-我的框架</title><link>http://www.blogjava.net/kingyaoo/category/31979.html</link><description>设计java，设计人生</description><language>zh-cn</language><lastBuildDate>Tue, 10 Jun 2008 02:25:45 GMT</lastBuildDate><pubDate>Tue, 10 Jun 2008 02:25:45 GMT</pubDate><ttl>60</ttl><item><title>IMVC 核心接口介绍</title><link>http://www.blogjava.net/kingyaoo/articles/206789.html</link><dc:creator>刹那</dc:creator><author>刹那</author><pubDate>Mon, 09 Jun 2008 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/kingyaoo/articles/206789.html</guid><wfw:comment>http://www.blogjava.net/kingyaoo/comments/206789.html</wfw:comment><comments>http://www.blogjava.net/kingyaoo/articles/206789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingyaoo/comments/commentRss/206789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingyaoo/services/trackbacks/206789.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; IMVC（InstantMVC简称）有几个比较核心的接口，通过对这几个接口的了解，可以更深入的了解IMVC到核心机制。<br />
1.IAction接口<br />
&nbsp;&nbsp;&nbsp; action是整个MVC的核心，如果了解struts或者webwork等MVC框架的朋友应该知道，action是一个用户处理模块，当MVC容器接受到一个请求的时候，他会通过一定的方法获得一个相应的action类，然后执行action类中相应的方法，最后返回一个视图给客户端，这就是最普通的mvc框架的流程。和其他框架的action类似，IMVC的action接口也有一个核心方法，如下<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);">&nbsp;IAction&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：验证器，放入Map&nbsp;value&nbsp;的key<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;MVC_STATIC_validation</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">__validation</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：文件上传&nbsp;Map&nbsp;value中的key<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;MVC_STATIC_createUpload</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">__createUpload</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：这是编辑器<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;MVC_STATIC_editor</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">__editor</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;方法说明：action的核心方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);">&nbsp;object&nbsp;如果是post方法，object就是该action对应的form，如果是get方法并且配置get方法没有form<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;那么这里就是null，如果配置get方法也是有form的，这里也是form<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);">&nbsp;value&nbsp;&nbsp;一个map，在action中添加内容到view都往这里添加<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: rgb(128, 128, 128);">@return</span><span style="color: rgb(0, 128, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;String<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;View&nbsp;execute(Object&nbsp;object,Value&nbsp;value);<br />
}</span></div>
前面三个变量这里暂时不说，我们来关注最后一个方法，execute，任何action都需要实现这个接口，同时也就是说必须在action中有这个方法。这个方法有两个传入变量Object和Value，第一个是想要的formBean，如果是get方法并且没有配置get方法设置form，那么这个时候就是null，如果是非get方法，而且还传入了参数，那么IMVC会自动封装相应的form传入到这个。第二个Value参数，Value也是一个很核心的接口。在IMVC中有ValueImpl类来实现。<br />
<br />
Value 接口：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);">&nbsp;Value&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getString(String&nbsp;key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;String[]&nbsp;getArray(String&nbsp;key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;setObject(String&nbsp;key,Object&nbsp;value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;Object&nbsp;getObject(String&nbsp;key);<br />
}</span></div>
<br />
ValueImpl 类：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;ValueImpl&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;HashMap&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);">&nbsp;Map,Value,InstantValue{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">InstantValue</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;setArray(String&nbsp;key&nbsp;,String[]&nbsp;arr){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">.put(key,&nbsp;arr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">user&nbsp;Value</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;String[]&nbsp;getArray(String&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;(String[])</span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">.get(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;Object&nbsp;getObject(String&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">.get(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getString(String&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;o</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">.get(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(o</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(o&nbsp;</span><span style="color: rgb(0, 0, 255);">instanceof</span><span style="color: rgb(0, 0, 0);">&nbsp;String[]){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;((String[])o)[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;setObject(String&nbsp;key,&nbsp;Object&nbsp;value)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">.put(key,&nbsp;value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">以下实现clone。。提供性能</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;ValueImpl&nbsp;cloneBase(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValueImpl&nbsp;vimpl</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">(ValueImpl)&nbsp;</span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">.clone();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vimpl.clear();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;vimpl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;ValueImpl&nbsp;valueImpl</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ValueImpl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;ValueImpl&nbsp;cloneSelf(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;valueImpl.cloneBase();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
这个类也相当简单，我们看第一句：<br />
<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;ValueImpl&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;HashMap&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);">&nbsp;Map,Value,InstantValue<br />
说明这个类 继承了HashMap，实现了Map，Value，InstantValue 三个接口。这三个接口其实就是三个权限版本，比如Value是用户操作权限，我们看到在action中传入的是Value，但是在IMVC内部操作的时候是把ValueImpl类转换为InstantValue借口的<br />
<br />
InstantValue 接口：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);">&nbsp;InstantValue&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;setArray(String&nbsp;key,String[]&nbsp;value);<br />
}</span></div>
这个几口只有一个方法，这个方法是不会暴露给用户的，是提供IMVC内部设值用的。<br />
下面还有一个拦截器接口<br />
IInerceptor 拦截器接口：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);">&nbsp;IInterceptor&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;execute(HttpServletRequest&nbsp;request,HttpServletResponse&nbsp;response,Value&nbsp;value);<br />
}</span></div>
这个接口也相当简单，只有一个方法，传入request和response参数，同时还有一个Value参数，这个Value上面已经说过，是一个用户操作的数据接口。<br />
<br />
整个IMVC流程图简单来说如下：<br />
<img src="http://www.blogjava.net/images/blogjava_net/kingyaoo/iMVC.jpg" alt="" border="0" /><br />
<br />
&nbsp;&nbsp;&nbsp; 首先，请求来了后，IMVC会创建一个ValueImp转换为Value传给前拦截器（如果没有设置就不用），拦截器操作完毕，在把这个ValueImp转换为InstantValue接口传给IMVC内部操作，操作完毕接着把它转化为Value接口供用户Action操作，最后执行后拦截器，执行完毕转换为Map借口供模板引擎渲染试图。<br />
&nbsp;&nbsp;&nbsp; 一个ValueImp要转换为三种权限接口，所以他的实现就要implements 三个接口。<br />
<br />
<img src ="http://www.blogjava.net/kingyaoo/aggbug/206789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingyaoo/" target="_blank">刹那</a> 2008-06-09 16:50 <a href="http://www.blogjava.net/kingyaoo/articles/206789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Instant MVC 框架 hello world 程序。。。。。</title><link>http://www.blogjava.net/kingyaoo/articles/206675.html</link><dc:creator>刹那</dc:creator><author>刹那</author><pubDate>Sun, 08 Jun 2008 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/kingyaoo/articles/206675.html</guid><wfw:comment>http://www.blogjava.net/kingyaoo/comments/206675.html</wfw:comment><comments>http://www.blogjava.net/kingyaoo/articles/206675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingyaoo/comments/commentRss/206675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingyaoo/services/trackbacks/206675.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; InstantMVC框架的基本功能基本上已经完成，框架的接口设计（抽象层）也已经完工，以后修改大概不会有很大的接口变动，这里就贴出一个比较简单的hello world程序。<br />
<br />
&nbsp;&nbsp;&nbsp; 首先导入InstantMVC（一下简称IMVC）的包，和相应的依赖包（主要一些开源的包，比如commons等）&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 然后再eclipse中新建一个web项目。。这个就不用说了吧。<br />
&nbsp;&nbsp;&nbsp; 然后在classPath下创建一个配置文件 mvcConfig.xml（名字任意起），内如大概如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">baseConfig&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actionPackageBasePath</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">test.action</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formPackageBasePath</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">test.form</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;templateBasePath</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">/template</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resourceBasePath</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">/re</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;urlPostfix</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">.x</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webUrl</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">yao.com:8282</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">optionalConfig<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isOpenActionCache</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">false</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isOpenValidationCache</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">false</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isGetMethodHasForm</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">false</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isOpenAjaxIdentityValidate</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">false</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileUploadBasePath</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">/upload</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileUploadMax</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">1974592963</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileUploadFormat</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">pdf,jpg,gif</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printOutCharacter</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;templateCharacter</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uploadCharacter</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isOpenFreemarkerCache</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">false</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">/&gt;</span></div>
&nbsp;&nbsp; 前面那个 baseConfig是必须设置，后面optionalConfig是可选，可以不设置，IMVC有默认设置。具体的配置如下：<br />
必填：<br />
actionPackageBasePath ：基础action包根目录<br />
formPackageBasePath：基础form包根目录  <br />
templateBasePath：基础模板文件根目录<br />
resourceBasePath：InstantMVC自带的资源文件目录<br />
urlPostfix：action请求后缀<br />
webUrl：网站域名，比如yao.com主要用于ajaxView的权限检测<br />
<br />
可选：<br />
isOpenActionCache="false" ：是否开启action的缓存，也就是是否设置action为单例<br />
isOpenValidationCache="false"：是否开启检验框架的缓存<br />
isGetMethodHasForm="false"：是否为get方法也设置form填充<br />
isOpenAjaxIdentityValidate="false"：是否开启ajaxView的权限验证（不能跨域调用）<br />
fileUploadBasePath="/upload"：文件上传根目录，默认是/upload<br />
fileUploadMax="1974592963"：上传文件最大 ,可选，默认1048576=1024&#215;1024 b<br />
fileUploadFormat="pdf,jpg,gif"：上传允许默认的格式，可选，默认为 pdf,jpg,gif,txt<br />
printOutCharacter="UTF-8" ： #可选，默认为UTF-8，表示通过action直接打印到客户端字符的编码，一般用到ajax发生&nbsp;  <br />
templateCharacter="UTF-8" ：#可选，默认为UTF-8 ，表示通过模板方式显示到客户端的编码，一般用到直接的请求<br />
isOpenFreemarkerCache="false"：#是否开启freemarker模板缓存<br />
<br />
最基础的配置就这些了，后面那个可选其实也可以去掉。<br />
<br />
然后我们在项目中新建立一个包<br />
test.action.test<br />
然后在包下新旧一个java类：Hello：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Hello&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;IAction{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;View&nbsp;execute(Object&nbsp;object,&nbsp;Value&nbsp;value)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value.setObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">hello</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">hello,欢迎来到InstantMVC的世界。。。</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;ViewFactory.getView(</span><span style="color: #000000;">"</span><span style="color: #000000;">/test.html</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
ok，然后我们在 web项目根目录下创建一个模板文件夹 template<br />
在template下创建一个html文件 ：test.html:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">test.html</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">meta&nbsp;</span><span style="color: #ff0000;">http-equiv</span><span style="color: #0000ff;">="keywords"</span><span style="color: #ff0000;">&nbsp;content</span><span style="color: #0000ff;">="keyword1,keyword2,keyword3"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">meta&nbsp;</span><span style="color: #ff0000;">http-equiv</span><span style="color: #0000ff;">="description"</span><span style="color: #ff0000;">&nbsp;content</span><span style="color: #0000ff;">="this&nbsp;is&nbsp;my&nbsp;page"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">meta&nbsp;</span><span style="color: #ff0000;">http-equiv</span><span style="color: #0000ff;">="content-type"</span><span style="color: #ff0000;">&nbsp;content</span><span style="color: #0000ff;">="text/html;&nbsp;charset=UTF-8"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;${hello}</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">br&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span></div>
很简单的Html，里面只有一个地方需要主意的就是 ${hello}这个东西，还记得上面Hello.java中的<span style="color: #000000;">value.setObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">hello</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">hello,欢迎来到InstantMVC的世界。。。</span><span style="color: #000000;">"</span><span style="color: #000000;">);吗？其实这就是取出hello中的值。好一切配置都完成。额。好像还缺点什么，对，没有配置web.xml，下面是基本的 配置：<br />
<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">instantMVCController</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">yao.instant.mvc.sevlet.InstantFrontController</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">init-param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">mvc_config</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param-value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/mvcConfig.xml</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param-value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">init-param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">init-param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">single_config</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param-value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/instant.single</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param-value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">init-param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">load-on-startup</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">0</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">load-on-startup</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">instantMVCController</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">*.x</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; <br />
</span></div>
其中<span style="color: #000000;">yao.instant.mvc.sevlet.InstantFrontController 是IMVC的前端拦截器，有两个参数，第一个是刚刚写的配置文件mvcConfig.xml相对于classPath的路径，第二个是IMVC内建的一个对象管理容器的配置，这里可以先不写（或则在classPath下新建一个空的文件Instant.single,内容不用写）。下面那个是url映射，把.x的后缀映射到IMVC框架。好了，一切的搞定，下面就运行<br />
<br />
启动tomcat，在浏览器中输入http://localhost:8080/test/hello.x 就会看到一下结果：<br />
<img src="http://www.blogjava.net/images/blogjava_net/kingyaoo/hello.jpg" alt="" border="0" /><br />
看，一个简单的helloworld程序就完成了。下面我们回顾一下这个过程是怎么进行的。<br />
<br />
&nbsp;&nbsp; 首先，我们先回顾下我们的配置文件中有一个配置选项：<br />
actionPackageBasePath="test.action"&nbsp; <br />
这个选项表示IMVC将会首先通过这个路径去寻找相应的匹配url的action，比如我们上面的url是：/test/hello.x 那么IMVC会首先寻找 test.action.test包下的Hello类，如果没有存在，会报异常，如果存在，就执行Hello类的execute方法。在execute方法最后返回了一个View，其中一个参数是模板位置，比如本例中是View("/test.html")，那么这个文件在哪呢？IMVC又是怎么去寻找的呢，再回来看配置文件，其中的一个参数：<br />
templateBasePath="/template" <br />
这个参数的意识就是吧web目录下的template作为主要的模板文件的根目录，此例中/test.html就是寻找的/template/test.html文件，然后渲染模板，会把其中的${hello}参数渲染为 action中通过value这个对象设置的值，比如本例中是：value.setObject("hello", "hello,欢迎来到InstantMVC的世界。。。");<br />
<br />
&nbsp;&nbsp;&nbsp; 至此，一个简单的get方法的IMVC流程结束。<br />
<br />
&nbsp;&nbsp;&nbsp; 这里其他的功能没有说道，比如View中有一种专门的返回ajax的View类型，比如还有拦截器，比如还有form填充和参数获取等都没说，下次再详细说明。<br />
<br />
ps：InstantMVC目前还在内部修改完善，还不能提供版本下载。<br />
</span><br />
<br />
<img src ="http://www.blogjava.net/kingyaoo/aggbug/206675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingyaoo/" target="_blank">刹那</a> 2008-06-08 14:10 <a href="http://www.blogjava.net/kingyaoo/articles/206675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>InstantMVC开发笔记（1）</title><link>http://www.blogjava.net/kingyaoo/articles/206374.html</link><dc:creator>刹那</dc:creator><author>刹那</author><pubDate>Fri, 06 Jun 2008 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/kingyaoo/articles/206374.html</guid><wfw:comment>http://www.blogjava.net/kingyaoo/comments/206374.html</wfw:comment><comments>http://www.blogjava.net/kingyaoo/articles/206374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingyaoo/comments/commentRss/206374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingyaoo/services/trackbacks/206374.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 本来InstantMVC是没有xml配置文件的，只是用一个Properties文本文件保存基础的配置信息，但是今天在扩展拦截器功能的时候，却不得不考虑用xml来做配置文件，因为以前的拦截器都是对于所有的请求，而最理想的就是可以设计全局的拦截器，同时也可以设计单个action或者一个目录下的action的独特拦截器，而这些配置以及很难用properties表述清楚了，为了考虑以后的扩展，今天就把properties改成了xml配置。用的是dom4j。用起来还算比较简单。修改后的xml配置文件大体是这个样子：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mvc</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">baseConfig　必须配置&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;目录的配置都是用&nbsp;/xxx&nbsp;这种格式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基础action包根目录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actionPackageBasePath&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基础form包根目录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formPackageBasePath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基础模板文件根目录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;templateBasePath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InstantMVC自带的资源文件目录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resourceBasePath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action请求后缀<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;urlPostfix<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;网站域名，比如yao.com主要用于ajaxView的权限检测<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webUrl<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">baseConfig&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">actionPackageBasePath</span><span style="color: #0000ff;">="test.action"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formPackageBasePath</span><span style="color: #0000ff;">="test.form"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;templateBasePath</span><span style="color: #0000ff;">="/template"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resourceBasePath</span><span style="color: #0000ff;">="/re"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;urlPostfix</span><span style="color: #0000ff;">=".x"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webUrl</span><span style="color: #0000ff;">="yao.com:8282"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">baseConfig　可选配置&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否开启action的缓存，也就是是否设置action为单例<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isOpenActionCache="false"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否开启检验框架的缓存<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isOpenValidationCache="false"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否为get方法也设置form填充<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isGetMethodHasForm="false"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否开启ajaxView的权限验证（不能跨域调用）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isOpenAjaxIdentityValidate="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文件上传根目录，默认是/upload<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileUploadBasePath="/upload"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上传文件最大&nbsp;,可选，默认1048576=1024&#215;1024&nbsp;b<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileUploadMax="1974592963"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上传允许默认的格式，可选，默认为&nbsp;pdf,jpg,gif,txt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileUploadFormat="pdf,jpg,gif"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#可选，默认为UTF-8，表示通过action直接打印到客户端字符的编码，一般用到ajax发生<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printOutCharacter="UTF-8"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#可选，默认为UTF-8&nbsp;，表示通过模板方式显示到客户端的编码，一般用到直接的请求<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;templateCharacter="UTF-8"<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">optionalConfig<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">isOpenActionCache</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isOpenValidationCache</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isGetMethodHasForm</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isOpenAjaxIdentityValidate</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileUploadBasePath</span><span style="color: #0000ff;">="/upload"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileUploadMax</span><span style="color: #0000ff;">="1974592963"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileUploadFormat</span><span style="color: #0000ff;">="pdf,jpg,gif"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printOutCharacter</span><span style="color: #0000ff;">="UTF-8"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;templateCharacter</span><span style="color: #0000ff;">="UTF-8"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">action前拦截器&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">frontInterceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">interceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">test.interceptor.BaseFrontInterceptor</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">interceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">frontInterceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">action后拦截器&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">afterInterceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">interceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">test.interceptor.BaseAfterInterceptor</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">interceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">afterInterceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">特定目录的&nbsp;前拦截器，目录用&nbsp;/xxx/&nbsp;设置&nbsp;&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">pathInterceptor&nbsp;</span><span style="color: #ff0000;">tag</span><span style="color: #0000ff;">="front"</span><span style="color: #ff0000;">&nbsp;url</span><span style="color: #0000ff;">="/test/"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">interceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">test.interceptor.MyFrontInterceptor</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">interceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">pathInterceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">特定目录的&nbsp;后拦截器&nbsp;目录用&nbsp;/xxx/&nbsp;设置</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">pathInterceptor&nbsp;</span><span style="color: #ff0000;">tag</span><span style="color: #0000ff;">="after"</span><span style="color: #ff0000;">&nbsp;url</span><span style="color: #0000ff;">="/test/"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">interceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">test.interceptor.MyAfterInterceptor</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">interceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">pathInterceptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mvc</span><span style="color: #0000ff;">&gt;</span></div>
<br />
&nbsp;&nbsp;&nbsp; 整个mvc框架的配置都在这里了，下面这个是以前的配置文件：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">#</span><span style="color: #000000;">==========</span><span style="color: #000000;">必填</span><span style="color: #000000;">=======================</span><span style="color: #000000;"><br />
#action放的基础地址（包）<br />
actionPackageBasePath</span><span style="color: #000000;">=</span><span style="color: #000000;">test.action<br />
<br />
#form放到基础地址（包）<br />
formPackageBasePath</span><span style="color: #000000;">=</span><span style="color: #000000;">test.form<br />
<br />
#freemarker模板地址，必须用/开头，相对于web程序根目录<br />
templateBasePath</span><span style="color: #000000;">=</span><span style="color: #000000;">/template<br />
<br />
#instantMVC框架自带的资源文件存放的地址，必须用/开头，相对于web程序根目录<br />
resourceBasePath</span><span style="color: #000000;">=</span><span style="color: #000000;">/re<br />
<br />
#是否开启action类的缓存（是否设置为单例，开发阶段，建议设置为flase，正式阶段，建议为true）<br />
isOpenActionCache</span><span style="color: #000000;">=</span><span style="color: #000000;">false<br />
<br />
#是否开启检验框架缓存，调试开发阶段建议关闭，正式运行时期建议开启，开启有助性能提升，但是对于开发阶段可能有些延迟<br />
isOpenValidationCache</span><span style="color: #000000;">=</span><span style="color: #000000;">false<br />
<br />
#网站请求后缀<br />
urlPostfix</span><span style="color: #000000;">=</span><span style="color: #000000;">.x<br />
<br />
#</span><span style="color: #000000;">==========</span><span style="color: #000000;">以下可选</span><span style="color: #000000;">=======================</span><span style="color: #000000;"><br />
<br />
<br />
#前拦截器列表，用逗号分开<br />
frontInterceptor</span><span style="color: #000000;">=</span><span style="color: #000000;">test.interceptor.MyInterceptor<br />
<br />
#后拦截器列表<br />
afterInterceptor</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />
<br />
#是否为get方法的请求也自动填充相应的form（flase有助提升性能）</span><span style="color: #000000;">,</span><span style="color: #000000;">可选，默认为false<br />
isGetMethodHasForm</span><span style="color: #000000;">=</span><span style="color: #000000;">false<br />
<br />
#网站<br />
webUrl</span><span style="color: #000000;">=</span><span style="color: #000000;">yao.com:</span><span style="color: #000000;">8282</span><span style="color: #000000;"><br />
<br />
#是否开启ajax的身份验证，如果开启，则外部网站将不能通过IMVC的ajax接口action访问<br />
#如果开启这个选项，必须设置webUrl选项，默认为开启<br />
isOpenAjaxIdentityValidate</span><span style="color: #000000;">=</span><span style="color: #000000;">true<br />
<br />
#上传文件的基础地址，必须用/开头，相对于web程序根目录</span><span style="color: #000000;">,</span><span style="color: #000000;">可选，默认为&nbsp;/upload，<br />
fileUploadBasePath</span><span style="color: #000000;">=</span><span style="color: #000000;">/upload<br />
<br />
#上传文件最大&nbsp;</span><span style="color: #000000;">,</span><span style="color: #000000;">可选，默认1048576</span><span style="color: #000000;">=</span><span style="color: #000000;">1024</span><span style="color: #000000;">&#215;</span><span style="color: #000000;">1024</span><span style="color: #000000;">&nbsp;b<br />
fileUploadMax</span><span style="color: #000000;">=</span><span style="color: #000000;">1974592963</span><span style="color: #000000;"><br />
<br />
#上传允许默认的格式，可选，默认为&nbsp;pdf</span><span style="color: #000000;">,</span><span style="color: #000000;">jpg</span><span style="color: #000000;">,</span><span style="color: #000000;">gif</span><span style="color: #000000;">,</span><span style="color: #000000;">txt<br />
fileUploadFormat</span><span style="color: #000000;">=</span><span style="color: #000000;">pdf</span><span style="color: #000000;">,</span><span style="color: #000000;">jpg</span><span style="color: #000000;">,</span><span style="color: #000000;">gif<br />
<br />
#可选，默认为UTF-</span><span style="color: #000000;">8</span><span style="color: #000000;">，表示通过action直接打印到客户端字符的编码，一般用到ajax发生<br />
printOutCharacter</span><span style="color: #000000;">=</span><span style="color: #000000;">UTF-</span><span style="color: #000000;">8</span><span style="color: #000000;"><br />
<br />
#可选，默认为UTF-</span><span style="color: #000000;">8</span><span style="color: #000000;">&nbsp;，表示通过模板方式显示到客户端的编码，一般用到直接的请求<br />
templateCharacter</span><span style="color: #000000;">=</span><span style="color: #000000;">UTF-</span><span style="color: #000000;">8</span></div>
<br />
&nbsp;&nbsp;&nbsp; 虽然我还是比较喜欢 properties的配置方式，但是客观的说，随着框架的扩大，xml配置确实比较占优势。<br />
<br />
&nbsp;&nbsp;&nbsp; 今天除了把配置文件有properties形式改为了xml形式，添加了目录拦截器外，还考虑一下文件上传拦截器，现在的InstantMVC的文件上传是在action中封装的，对于一些灵活性方面还不够，比如我上传完图片需要做几张缩略图，而每个上次action可能需要的缩略图大小或者存放文件都不一样，所以需要考虑在上次文件完毕到返回结果之间设计一个拦截器，这个拦截器可以用户定义，当然要实现一个接口，框架上传完文件后可以通过这个拦截器做进一步处理，这样更具灵活性，今天没时间来，明天来完成了吧。<br />
<br />
<img src ="http://www.blogjava.net/kingyaoo/aggbug/206374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingyaoo/" target="_blank">刹那</a> 2008-06-06 17:42 <a href="http://www.blogjava.net/kingyaoo/articles/206374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>InstantMVC--轻量级MVC框架介绍</title><link>http://www.blogjava.net/kingyaoo/articles/206149.html</link><dc:creator>刹那</dc:creator><author>刹那</author><pubDate>Thu, 05 Jun 2008 12:39:00 GMT</pubDate><guid>http://www.blogjava.net/kingyaoo/articles/206149.html</guid><wfw:comment>http://www.blogjava.net/kingyaoo/comments/206149.html</wfw:comment><comments>http://www.blogjava.net/kingyaoo/articles/206149.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingyaoo/comments/commentRss/206149.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingyaoo/services/trackbacks/206149.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; InstantMVC是我最近开发的一个j2ee轻量级MVC框架，写这个框架前刚好做完一个webwork+spring+InstantORM的项目，对于开发过程中的一些不舒服的地方，就像要改进着试试写一个框架，于是就开始写了，写这个框架的冲动主要有以下几点：<br />
&nbsp;&nbsp;&nbsp; 1.讨厌的action配置，无论是strtus还是webwork，都有一大堆的action配置文件，strtus加上bean就更多，如果webwork配合spring，那么一个action就要配置一个spring Bean，一个webwork action映射，随着项目的扩大，后来实在是让人有些受不了，再则，随着项目的扩大，action数目的增加，每次改动重新启动服务器的时间浪费就更大，所以项目越来越大，感觉越来越痛苦，虽然配置型的action，对于项目的移植有一定的好处，但是一般的项目是很少回过头去修改action映射，就算修改，在java文件中修改也是可以接受的。<br />
<br />
&nbsp;&nbsp;&nbsp; 2.关于验证，struts和webwork的验证都是基于xml配置的，就我个人而言，是比较讨厌xml配置这个东西的，所以我一直用不惯他们的验证框架，而且一旦用到验证框架，必须用到UI组件，在webwork中用freemarker作为模板的时候，UI组件是比较费资源的（可能成为潜在的性能瓶颈），如果有一个不用UI组件而且外面封装客户端和服务器端验证的MVC框架，我想会比较爽。<br />
<br />
&nbsp;&nbsp;&nbsp; 3.关于view，我比较喜欢springMVC中的那种直接在action中return的形式，webwork和struts的配置方式我也很不喜欢。<br />
<br />
&nbsp;&nbsp;&nbsp; 4.应该是性能考虑，webwork的action非单利可能导致性能问题（虽然没有被充分证明），struts2也走了这条路。<br />
<br />
&nbsp;&nbsp;&nbsp; 基于这些考虑，我打算开发自己的MVC框架，而且现在已经小有所成，基本功能已经完成，下面简单讲下InstantMVC框架的主要特征<br />
&nbsp;&nbsp;&nbsp; 1.零配置，零配置不是说没有配置，而是说不用配置action和result view，整个mvc框架只有一个整体的配置文件，所有映射关系都是通过默认规则来建立的。<br />
<br />
&nbsp;&nbsp;&nbsp; 2.类似action/form 形式，这里说是类似，因为InstantMVC可以配置让get方法是否支持form，也就是get方法可以不用form，直接通过一个Map获得请求参数，也可以配置get填充form形式，InstantMVC的action可以配置为是单利或者非单利，不过一般在action中不推荐存放非线程安全的变量，所以建议配置为单利。<br />
<br />
&nbsp;&nbsp;&nbsp; 3.action中两个参数一个是Form的Object，一个是Map，容易单元测试，不需要引入Servlet部件，但是对于一些session等操作可以通过InstantContext获得HttpSerlvetrequest操作，可以说InstantMVC对于容器无关性是介于webwork和struts之间的。<br />
<br />
&nbsp;&nbsp;&nbsp; 4.最简单的验证集成方式，所有验证代码写到action中，在view中不用配置UI组件，支持客户端和服务器端双重验证，可以单独开启一方关闭一方。<br />
<br />
&nbsp;&nbsp;&nbsp; 5.ajax View的集成，这里的集成不像dwr那样完全集成，而是一种半集成方式，客户端用到ajax框架还是需要用户自己选择，这样提供了很大的灵活性。InstantMVC的View有好几种形式，比如挑战到另一个action的view，直接返回的view，ajax的view等，InstantMVC的ajax是和普通的action一样的，只不过返回一个ajax的View就成了ajax了。ajax的view可以返回任何对象的json。在客户端很方便的获得，这一点有点像dwr的返回结果，不过dwr需要配置，InstantMVC不用。而且我们可以设置开启ajax的安全验证，开启后将不允许其他域方法ajax的action。<br />
<br />
&nbsp;&nbsp;&nbsp; 6.支持AOP拦截器，模仿webwork那样，可以自定义拦截器。<br />
<br />
&nbsp;&nbsp;&nbsp; 7.集成了上传组件，和验证一样，可以在action中配置。<br />
<br />
&nbsp;&nbsp;&nbsp; 大概就是这些特性，这些特性都很让我着迷。现在这些特性基本上都能工作，不过稳定性兼容性方面还有待提升，同时还需要大量的性能方面考虑（虽然现在的性能比其他MVC只会高不会低）。今天刚把blog搬到这里来，以后这里会主要写关于我的框架的一些问题等。<br />
<br />
<img src ="http://www.blogjava.net/kingyaoo/aggbug/206149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingyaoo/" target="_blank">刹那</a> 2008-06-05 20:39 <a href="http://www.blogjava.net/kingyaoo/articles/206149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>