﻿<?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-随笔分类-我的j2ee轻量级框架</title><link>http://www.blogjava.net/kingyaoo/category/32026.html</link><description>设计java，设计人生</description><language>zh-cn</language><lastBuildDate>Thu, 12 Jun 2008 14:11:32 GMT</lastBuildDate><pubDate>Thu, 12 Jun 2008 14:11:32 GMT</pubDate><ttl>60</ttl><item><title>IMVC框架特性详解--ajax支持</title><link>http://www.blogjava.net/kingyaoo/archive/2008/06/11/207185.html</link><dc:creator>刹那</dc:creator><author>刹那</author><pubDate>Wed, 11 Jun 2008 11:14:00 GMT</pubDate><guid>http://www.blogjava.net/kingyaoo/archive/2008/06/11/207185.html</guid><wfw:comment>http://www.blogjava.net/kingyaoo/comments/207185.html</wfw:comment><comments>http://www.blogjava.net/kingyaoo/archive/2008/06/11/207185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingyaoo/comments/commentRss/207185.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingyaoo/services/trackbacks/207185.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; IMVC对ajax有了很好的支持。主要体现在两方面。<br />
<br />
&nbsp;&nbsp;&nbsp;<span style="color: red;"> 一 ajax View类型支持。</span>Imvc的视同是通过一个View类来返回的，在action中通过return new View("/xxx.html")返回一个视图，然后IMVC会通过Value中的数据渲染这个视图。这是一般的流程，有些特殊的流程可以返回其他类型的View，我们先来看看View类的代码：<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;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;View&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Cloneable{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：普通的view，通过模板转换<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;TYPE_VIEW</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：转向，不改变url<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;TYPE_REDIRECT</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：专心&nbsp;，改变url<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;TYPE_REDIRECT2</span><span style="color: #000000;">=</span><span style="color: #000000;">3</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：直接返回string，path的值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;TYPE_AJAX</span><span style="color: #000000;">=</span><span style="color: #000000;">4</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;TYPE_EXCEPTION</span><span style="color: #000000;">=</span><span style="color: #000000;">5</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;path;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;View(String&nbsp;path){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.path</span><span style="color: #000000;">=</span><span style="color: #000000;">path;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;View(String&nbsp;path,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;type){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.path</span><span style="color: #000000;">=</span><span style="color: #000000;">path;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.type</span><span style="color: #000000;">=</span><span style="color: #000000;">type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;View(Map&nbsp;map){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSONObject&nbsp;jsono</span><span style="color: #000000;">=</span><span style="color: #000000;">JSONObject.fromObject(map);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path</span><span style="color: #000000;">=</span><span style="color: #000000;">jsono.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">TYPE_AJAX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;View(List&nbsp;array){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSONArray&nbsp;jsona</span><span style="color: #000000;">=</span><span style="color: #000000;">JSONArray.fromObject(array);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path</span><span style="color: #000000;">=</span><span style="color: #000000;">jsona.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">TYPE_AJAX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;View(Object&nbsp;bean){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSONObject&nbsp;jsono</span><span style="color: #000000;">=</span><span style="color: #000000;">JSONObject.fromObject(bean);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path</span><span style="color: #000000;">=</span><span style="color: #000000;">jsono.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">TYPE_AJAX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getPath()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;path;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setPath(String&nbsp;path)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.path&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;path;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getType()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setType(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;type)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.type&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;View&nbsp;clone(String&nbsp;path){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View&nbsp;v</span><span style="color: #000000;">=</span><span style="color: #000000;">cloneBase();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v.path</span><span style="color: #000000;">=</span><span style="color: #000000;">path;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;v;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;View&nbsp;clone(String&nbsp;path,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;type){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View&nbsp;v</span><span style="color: #000000;">=</span><span style="color: #000000;">cloneBase();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v.path</span><span style="color: #000000;">=</span><span style="color: #000000;">path;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v.type</span><span style="color: #000000;">=</span><span style="color: #000000;">type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;v;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;View&nbsp;clone(Map&nbsp;map){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View&nbsp;v</span><span style="color: #000000;">=</span><span style="color: #000000;">cloneBase();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSONObject&nbsp;jsono</span><span style="color: #000000;">=</span><span style="color: #000000;">JSONObject.fromObject(map);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v.path</span><span style="color: #000000;">=</span><span style="color: #000000;">jsono.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v.type</span><span style="color: #000000;">=</span><span style="color: #000000;">TYPE_AJAX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;v;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;View&nbsp;clone(List&nbsp;array){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View&nbsp;v</span><span style="color: #000000;">=</span><span style="color: #000000;">cloneBase();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSONArray&nbsp;jsona</span><span style="color: #000000;">=</span><span style="color: #000000;">JSONArray.fromObject(array);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v.path</span><span style="color: #000000;">=</span><span style="color: #000000;">jsona.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v.type</span><span style="color: #000000;">=</span><span style="color: #000000;">TYPE_AJAX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;v;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;View&nbsp;clone(Object&nbsp;bean){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View&nbsp;v</span><span style="color: #000000;">=</span><span style="color: #000000;">cloneBase();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSONObject&nbsp;jsono</span><span style="color: #000000;">=</span><span style="color: #000000;">JSONObject.fromObject(bean);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v.path</span><span style="color: #000000;">=</span><span style="color: #000000;">jsono.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v.type</span><span style="color: #000000;">=</span><span style="color: #000000;">TYPE_AJAX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;v;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;View&nbsp;cloneBase(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View&nbsp;v</span><span style="color: #000000;">=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(View)&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.clone();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(CloneNotSupportedException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;v;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
我们主要关注以下几个变量：<br />
<span style="color: #000000;">&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：普通的view，通过模板转换<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;TYPE_VIEW</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：转向，不改变url<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;TYPE_REDIRECT</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：专心&nbsp;，改变url<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;TYPE_REDIRECT2</span><span style="color: #000000;">=</span><span style="color: #000000;">3</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：直接返回string，path的值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;TYPE_AJAX</span><span style="color: #000000;">=</span><span style="color: #000000;">4</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;TYPE_EXCEPTION</span><span style="color: #000000;">=</span><span style="color: #000000;">5</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp; 第一个是普通的View，通过ViewFactory.getView("/tt.html")这个方法返回的是普通的view，也就是可以通过IMVC渲染的视图，而</span><span style="color: #000000;">TYPE_REDIRECT则是返回一个跳转view，可以跳转到下一个action，</span><span style="color: #000000;">TYPE_REDIRECT2也是一个跳转view，不过是改变URL地址的view。</span><span style="color: #000000;">TYPE_AJAX就是ajax试图了，也是今天要讲的主角了，至于最后一个</span><span style="color: #000000;">TYPE_EXCEPTION，是把异常返回到客户端浏览器到view，这里暂时不考虑。我们可以通过这样一个构造函数创造出ajax试图，比如new&nbsp; View("这是ajax信息",View.TYPE_AJAX),或者通过ViewFactory.getView(</span><span style="color: #000000;">"这是ajax信息",View.TYPE_AJAX</span><span style="color: #000000;">)也是一样，不过用factory创建的对象是通过对象的clone创建的，能节省一定的性能开销。当返回的是一个ajax View的时候，信息就会直接返回，而不是通过渲染试图，比如上面的就直接返回&#8220;</span><span style="color: #000000;">这是ajax信息</span><span style="color: #000000;">&#8221;给客户端，如果这个action是由客户端ajax请求的话，直接返回数据，是不是很方便呢？<br />
<br />
&nbsp;&nbsp;&nbsp; 接下来的ajx特性也许会让你觉得更方便，比如以下代码：<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: #000000;">....action前面的内如.....<br />
&nbsp;&nbsp;&nbsp; User&nbsp;u</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;User();<br />
&nbsp;&nbsp;&nbsp; u.setAge(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp; u.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">汪汪汪</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp; return</span><span style="color: #000000;">&nbsp;ViewFactory.getView(u);</span></div>
&nbsp;&nbsp;&nbsp; 这样的返回会直接在客户端打印出 {"age":1,"name":"汪汪汪"};也就是IMVC把对象映射成立JSON（一种js对象的String形式），这个返回数据在客户端直接可以调用，比如data.name就直接调用出&#8220;汪汪汪&#8221;，是不是很方便？而且IMVC还支持把List，数组，Map，还有对象相互无限级嵌套返回成JSON数据，这将大大增加AJAX开发的敏捷性和清晰性。<br />
<br />
&nbsp;&nbsp;&nbsp; <span style="color: red;">二 ajax Chain支持。</span>我们假设有一个全部ajax的网页，里面有几个div中的数据都是通过ajax的方式向服务器请求的，那么每个div都会请求一次ajax action，这样就导致了请求次数频繁，资源的浪费，IMVC提供了一种ajaxChain的概念，可以通过一个url请求多个action，然后把数据自动合并，比如下面的url<br />
http://xxx.com/ajaxChain.x?id=|one,two?id=1|<br />
这个url请请求了两个action，然后把action数据合并，比如本来one.x返回的数据是{"name":"111"},而two返回的数据是 {"name":"2222"};则现在应该返回的是{"one":{"name":"111"},"two?id=1",{"name":"2222"}}，这样，ajaxChain支持无数个action的连接。这样以后可以将多个ajax合并为一个ajax，节省服务器资源。<br />
<br />
&nbsp;&nbsp;&nbsp; 好了，IMVC的ajax支持就讲到这里。<br />
<img src ="http://www.blogjava.net/kingyaoo/aggbug/207185.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-11 19:14 <a href="http://www.blogjava.net/kingyaoo/archive/2008/06/11/207185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IMVC特性详解---非侵入性</title><link>http://www.blogjava.net/kingyaoo/archive/2008/06/10/206965.html</link><dc:creator>刹那</dc:creator><author>刹那</author><pubDate>Tue, 10 Jun 2008 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/kingyaoo/archive/2008/06/10/206965.html</guid><wfw:comment>http://www.blogjava.net/kingyaoo/comments/206965.html</wfw:comment><comments>http://www.blogjava.net/kingyaoo/archive/2008/06/10/206965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingyaoo/comments/commentRss/206965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingyaoo/services/trackbacks/206965.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 这里所谓的非侵入性，是指一定程度上的耦合性，比如IMVC和待开发项目的耦合性，servlet容器和IMVC的耦合性，IMVC内部处理的耦合性等等。<br />
&nbsp;&nbsp;&nbsp; 1.action非继承。由于java语言不允许多重继承，如果action被框架所迫需要继承类的话，那么这个action的扩展性将受到一定的限制，比如struts的继承性就设计的比较失败。<br />
<br />
&nbsp;&nbsp;&nbsp; 2.formBean的无侵入，IMVC中的formBean不需要继承人和类，甚至不需要实现任何接口，完全的一个pojo实体就能胜任。<br />
<br />
&nbsp;&nbsp;&nbsp; 3.半servlet容器相关性，之所以说是半，因为IMVC的容器无关性是间于struts和webwork之间的，struts的action接受 httpServletRequest和HttpServletResponse类实例作为参数，另测试变得避免麻烦（虽然有工具可以辅助测试），这种 servlet完全相关性的设计，让action中获取servlet数据变得容易，但是却带来了测试痛苦的后果。而反过来，webwork的 action中不需要传入任何servlet相关部件，webwork通过一个转回去把servlet中的数据拷贝到一个容器无关类。非常有利于测试，但是对于在action中获取servlet数据变得不够直观（可以获取的），而且，每次请求都拷贝数据也有碍于性能的提升。IMVC的设计则介于两者之间。在IMVC的action中没有传入servlet任何部件，但是可以通过InstantContext获得request和response（注意不是获取request的数据，而是request，不用花费拷贝到性能）。但是，在拦截器设计中，传入的却是 servlet部件，因为拦截器一般不会用于action单元测试，而且如果你对上面的action半容器无关性对于单元测试和获取cookies的数据有疑惑，那么可以在拦截器中获取你想要的cookie，然后传入拦截器的另一个参数Value，action通过Value获取cookie，这样一来，明明半容器无关性的action测试，却可以通过拦截器来实现完全容器无关的action，这样一来，既满足性能需求，又满足测试需求。<br />
<br />
&nbsp;&nbsp;&nbsp; 4 拦截器的天下。和webwork一样，IMVC中的拦截器是相当重要的组成部分。可以配置全局拦截器，路径拦截器，ajax链（这个以后会详解）拦截器，有趣的是，我们还有一个文件上传拦截器，IMVC是集成文件上传到，可以通过在action几行代码实现一个文件上传，而一般我们要更具自己的特性来处理上传完后的文件或者自定义的取名字，在或者做自己的缩略图等等。IMVC设计了一个文件上传拦截器，可以通过实例一个拦截器来实现这些功能，非常方便。<br />
<img src ="http://www.blogjava.net/kingyaoo/aggbug/206965.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-10 17:38 <a href="http://www.blogjava.net/kingyaoo/archive/2008/06/10/206965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IMVC 核心接口介绍</title><link>http://www.blogjava.net/kingyaoo/archive/2008/06/10/206944.html</link><dc:creator>刹那</dc:creator><author>刹那</author><pubDate>Tue, 10 Jun 2008 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/kingyaoo/archive/2008/06/10/206944.html</guid><wfw:comment>http://www.blogjava.net/kingyaoo/comments/206944.html</wfw:comment><comments>http://www.blogjava.net/kingyaoo/archive/2008/06/10/206944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingyaoo/comments/commentRss/206944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingyaoo/services/trackbacks/206944.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; IMVC（InstantMVC简称）有几个比较核心的接口，通过对这几个接口的了解，可以更深入的了解IMVC到核心机制。<br />
1.IAction接口<br />
&nbsp;&nbsp; action是整个MVC的核心，如果了解struts或者webwork等MVC框架的朋友应该
知道，action是一个用户处理模块，当MVC容器接受到一个请求的时候，他会通过一定的方法获得一个相应的action类，然后执行action类中
相应的方法，最后返回一个视图给客户端，这就是最普通的mvc框架的流程。和其他框架的action类似，IMVC的action接口也有一个核心方法，
如下<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;">interface</span><span style="color: #000000;">&nbsp;IAction&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：验证器，放入Map&nbsp;value&nbsp;的key<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String&nbsp;MVC_STATIC_validation</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">__validation</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：文件上传&nbsp;Map&nbsp;value中的key<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String&nbsp;MVC_STATIC_createUpload</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">__createUpload</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;属性介绍：这是编辑器<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String&nbsp;MVC_STATIC_editor</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">__editor</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;方法说明：action的核心方法<br />
&amp;
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>&lt;
span style="color: #808080;"&gt;@param<span style="color: #008000;">&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 />
&amp;
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>&lt;
span style="color: #808080;"&gt;@param<span style="color: #008000;">&nbsp;value&nbsp;&nbsp;一个map，在
action中添加内容到view都往这里添加<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;String<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&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 #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;">interface</span><span style="color: #000000;">&nbsp;Value&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getString(String&nbsp;key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String[]&nbsp;getArray(String&nbsp;key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setObject(String&nbsp;key,Object&nbsp;value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;getObject(String&nbsp;key);<br />
}</span></div>
<br />
ValueImpl 类：<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;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ValueImpl&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;HashMap&nbsp;&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Map,Value,InstantValue{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">InstantValue</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setArray(String&nbsp;key&nbsp;,String[]&nbsp;arr){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.put(key,&nbsp;arr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">user&nbsp;Value</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String[]&nbsp;getArray(String&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;(String[])</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.get(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;getObject(String&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.get(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getString(String&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;o</span><span style="color: #000000;">=</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.get(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(o</span><span style="color: #000000;">==</span><span style="color: #0000ff;">null</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(o&nbsp;</span><span style="color: #0000ff;">instanceof</span><span style="color: #000000;">&nbsp;String[]){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;((String[])o)[</span><span style="color: #000000;">0</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setObject(String&nbsp;key,&nbsp;Object&nbsp;value)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.put(key,&nbsp;value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp; </span><span>//</span><span style="color: #008000;">
以下实现clone。。提供性能</span><span style="color: #008000;">
<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;ValueImpl&nbsp;cloneBase(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValueImpl&nbsp;vimpl</span><span style="color: #000000;">=</span><span style="color: #000000;">(ValueImpl)&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.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: #0000ff;">return</span><span style="color: #000000;">&nbsp;vimpl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;ValueImpl&nbsp;valueImpl</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ValueImpl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;ValueImpl&nbsp;cloneSelf(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;valueImpl.cloneBase();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
这个类也相当简单，我们看第一句：<br />
<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ValueImpl&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;HashMap&nbsp;&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&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 #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;">interface</span><span style="color: #000000;">&nbsp;InstantValue&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setArray(String&nbsp;key,String[]&nbsp;value);<br />
}</span></div>
这个几口只有一个方法，这个方法是不会暴露给用户的，是提供IMVC内部设值用的。<br />
下面还有一个拦截器接口<br />
IInerceptor 拦截器接口：<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;">interface</span><span style="color: #000000;">&nbsp;IInterceptor&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&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; 首先，请求来了后，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/206944.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-10 16:30 <a href="http://www.blogjava.net/kingyaoo/archive/2008/06/10/206944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IMVC 框架 hello world 程序。。。。。</title><link>http://www.blogjava.net/kingyaoo/archive/2008/06/10/206942.html</link><dc:creator>刹那</dc:creator><author>刹那</author><pubDate>Tue, 10 Jun 2008 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/kingyaoo/archive/2008/06/10/206942.html</guid><wfw:comment>http://www.blogjava.net/kingyaoo/comments/206942.html</wfw:comment><comments>http://www.blogjava.net/kingyaoo/archive/2008/06/10/206942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingyaoo/comments/commentRss/206942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingyaoo/services/trackbacks/206942.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; InstantMVC框架的基本功能基本上已经完成，框架的接口设计（抽象层）也已经完
工，以后修改大概不会有很大的接口变动，这里就贴出一个比较简单的hello world程序。<br />
<br />
&amp;
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 />
&amp;
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
value.setObject(</span><span style="color: #000000;">"&lt;
/span&gt;<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></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，下面是基本的 配置：&lt;
br /&gt;
<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的世界。。。");&lt;
br /&gt;
<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/206942.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-10 16:29 <a href="http://www.blogjava.net/kingyaoo/archive/2008/06/10/206942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IMVC--j2ee轻量级MVC框架介绍</title><link>http://www.blogjava.net/kingyaoo/archive/2008/06/10/206939.html</link><dc:creator>刹那</dc:creator><author>刹那</author><pubDate>Tue, 10 Jun 2008 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/kingyaoo/archive/2008/06/10/206939.html</guid><wfw:comment>http://www.blogjava.net/kingyaoo/comments/206939.html</wfw:comment><comments>http://www.blogjava.net/kingyaoo/archive/2008/06/10/206939.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/kingyaoo/comments/commentRss/206939.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingyaoo/services/trackbacks/206939.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 />
<img src ="http://www.blogjava.net/kingyaoo/aggbug/206939.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-10 16:24 <a href="http://www.blogjava.net/kingyaoo/archive/2008/06/10/206939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>