读书人

研讨一种兼容性框架

发布时间: 2012-11-20 09:55:43 作者: rapoo

探讨一种兼容性框架
服务器端的MVC和客户端的MVC能否一起使用?最近一直在想这个问题,看了很多帖子也没有找到比较好的解决方案。

以下是我的一些想法,首先判断客户端浏览器是否支持JS
-》当客户端浏览器支持JS的时候,利用JS当作控制层;
-》当客户端浏览器不支持JS的时候,利用Action当作控制层。

问题是需要这样的一个模版,既可以让JSP解析(赋值),也可以让JS解析。

方案1:如果这个模版是XSL写的,比较容易解决,可是大多数美工不会XSL,这样就需要模版必须为HTML的样子。

大家都知道HTML需要美工经常修改,尤其是首页。
如果美工每次修改,我们再给转化为XSL,工作应该不比JSP套版省事。

方案2:目前知道Trimpath对HTML解析比较好,如果写一个Trimpath的服务器端实现,是不是就解决这个问题了?

方案3:修改Trimpath适应Velocity或者Freemarker的语法,但是这两种翻译器明显象个二楞子,是匹配文件路径,当浏览器支持JS时也不放过。

苦恼啊!//index.html<html><head><script src="prototype.js"></script><script src="index.js"></script></head><body><div id="number_src" style="display:none;">当前有${number}人在线。</div><form method="post" action="index.do"><input type="submit" id="get_number" value="获取当前在线人数"/><div id="number_dst">当前有${number}人在线。</div></form></body></html>
到这里,美工完事了,接下来为支持js的浏览器写Control

//index.jsvar get_number = $('get_number');var number_src = $('number_src');var number_dst = $('number_dst');get_number.onclick= function(){//简化代码,如何获得connection这里不讨论    connection.getNumber(function (result) {    if(result!=null){    number_dst.innerHTML=TrimPath.processDOMTemplate(number_src.id, result);    }    });    return false; //返回false,不post到index.do}

如果浏览器不支持js怎么办呢?post到index.do
index.do怎么写?这里是我犯难的事情。
//index.doString number = someObj.getNumber();//假定返回正确的值.....

如果采用方案1,index.html是xsl的文件,可以把number变为xml的进行耦合。问题是xsl和html之间的转化比较费人力。
如果采用方案3,把number放到session里面,配置freemarker或者velocity对index.html进行填值。
问题1:第一次访问index.do的时候,id="number_src"的变量${number}也填值了,不是我所希望的。
若第一次访问不进index.do.而进入index.html,freemarker或者velocity也不会对index.html放过。
若复制一个index.html为index.htm似乎解决了,那么还有问题:Trimpath和freemarker,velocity语法类似,毕竟不一样,需要修改trimpath为Freemarker的语法(比Freemarker更容易改)。
如果采用方案2:index.do中判断request参数是否支持js(或者不判断,都post过来了,肯定不支持),如果不支持,用trimpath的服务器端把number耦合到index.html 里面进行输出。

写到这里似乎有了办法,有更好的方法么?
忘记了从哪里看到要尽量少用filter,总感觉filter比较傻,而且还需要配置。
感觉方案2和方案3的差别:前者需要写trimpath的服务器端,后者需要修改trimpath的js.
//index.html <html> <head> <script src="prototype.js"></script> <script src="index.js"></script> </head> <body> <form method="post" action="index.do"> <input type="submit" id="get_number" value="获取当前在线人数"/> <div id="number_src" style="display:none;"> 当前有${number}人在线。 </div> <div id="number_dst"></div> </form> </body> </html>
index.do中replace掉style="display:none;"

读书人网 >软件架构设计

热点推荐