锁定老帖子 主题:Rose4J 新的WEB开发引擎
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-29
最新内容请参考www.rose4j.cn
根据我的经验,一个典型的Web应用中的代码比例如下: 于是就有了研发RoseForJ的想法,希望有前台页面与后台java程序能完全分开,当程序员拿到页面嵌入java代码后,在Dreamweaver中不会影响页面排版效果,当页面需要修改时,页面设计人员用Dreamweaver进行修改时不影响现有的页面。 wicket、xmlc 、Tapestry 等已有此项功能,wicket在服务器端的编程过于复杂,Freemarker, Velocity在view层和html混合在一起,嵌入代码后的页面在Dreamweaver中一般会乱掉。 RoseForJ的思路是 Velocity在XML DOM领域的扩展。 如果说,Fastm = JDynamiTe + Wicket;DOMPlus = XMLC + Wicket,那么RoseForJ=xmlc+wicket+velocity 下面我们来看看RoseForJ的模板
其中3个属性可用于html任何标签(如用于tr ,td等),foreach、item配合使用,表示一个循环,foreach="${dataSet}" ,此时dataSet是一个集合对象或数组,item="${data}" ,data表示集合对象或数组对象中每一个成员。 ${变量表达式} 的用法非常灵活,可在任何位置,如上面的用法: 1、这里作为TAG 的text的值,运行结束后将替换掉 "这里显示NAME" 这段文本
2、此处用法是作为HTML TAG img的属性src的参数值。
两个TAG(tempnode、include)中include不用说一看就知道是引入外面的一个模板文件,tempnode的作用是在解析完成后,会将此tempnode节点删除,如在此处的应用 xml 代码
xml 代码
在服务器端的编程则更加简单,几乎没有任何约束,你可以用hibernate,ibaits,javabean或者自己组织的任何对象,同时还可以嵌套使用,如: java 代码
从上面的编码中可以看出RoseForJ对数据的要求几乎是没有任何要求的,可以是pojo 如可以这样用${data.getName()},也可以是个集合类,则可以这样取值${data.get("c_author")} ,还可以嵌套调用如:${ChannelFactory.get(data.get("c_channelid"))} ,data.get("c_channelid")运行的结果作为ChannelFactory.get(...)的参数,另外RoseForJ还提供了格式化输出等工具,如日期输出${DateTool.format("yyyy-MM-dd",data.get("t_starttime"))} ,数学运算 a href="listContent.do?pages=${MathTool.sub(iPageCurrent,1)}">上一页 太晚了,明天再接着写
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-08-30
问几个小问题
1、权限控制是不可避免的问题,怎么处理才能简单呢 2、如何复用 其实我个人感觉这种思路其实并没有超出Velocity或者FreeMarker 但是Tapestry也好,Wicket,甚至是ASP.NET想的不一样 他们考虑的更全面一些 如果是小项目,无所谓 大的项目,考虑的哪怕少一点点,带来的后果都很严重。 |
|
返回顶楼 | |
发表时间:2007-09-10
hi wl95421 :
很高兴你能看我写的东西,在这里我就你的问题说说我的想法 你的第一个问题谈到了权限控制,我第一个想到roseforj模板引擎应该不会处理权限问题,于是我我想你的权限控制可能指的是功能级的(你要实现的可能是具体到某个按钮),roseforj只是个模板引擎,跟逻辑没什么关系,所以不会处理这些东西,实际上这是你的方案问题,我建议你用js进行处理,当权限不够时,可以通过JS将按钮从页面中删除,这样或许能满足你的目地。 你的第二个问题是如何复用,这个问题我还是觉得奇怪,我觉得这也是你的设计问题,在服务器端,roseforj没有任何要求和约束,所以如何复用应该是设计人员要想的问题,wicket也是一样,所有的东西都在服务器端处理,要怎么复用我想roseforj比wicket更简单灵活。 |
|
返回顶楼 | |
发表时间:2007-09-11
这个模板语言的语法看起来不错,把语句嵌入了普通的html tag,倒似乎有一点点类似Tapstry呵呵。但是我看你的网站上发布的文档,怎么又是一个Web框架呢,而且使用了velocity作的模板?
|
|
返回顶楼 | |
发表时间:2007-09-11
hi fyting:
很高兴你能看我写的东西,最近公司比较忙,所以roseforj网站一直没更新,roseforj 1.0.8版本以前view层用的一直是velocity,但麻烦的是我的网站是DIV+CSS风格的,所以在Dreamweaver里只要嵌入velocity代码,页面就乱成一团,没办法调整,所以就自己写了这个东西,它不会影响在Dreamweaver中的排版,过几天我会把这个框架的源码开放出来,希望对大家有些帮助。 |
|
返回顶楼 | |
发表时间:2007-11-09
怎么做if的操作呢?
|
|
返回顶楼 | |
发表时间:2007-11-12
当初在设计view层时,并不想在view层放入太多的逻辑,但对于常规的应用还是有考虑的,roseforj有个remove属性 当它为true时就会保留到页面,为false时则会动态地删除,也就是说在运行时会删除这个节点,而remove可以写死(如:remove=true等),也可以由后台控制(remove=${java表达式}),由此功能实现if操作,这样一来在view层的代码也是最少的,页面也是最干净的
|
|
返回顶楼 | |
发表时间:2007-11-12
RoseForJ只有两个TAG(tempnode、include)和4个属性(foreach、item,tid,remove)
|
|
返回顶楼 | |
发表时间:2007-11-12
remove用法说明:
假设我们要完成这样一个功能,当变量(int) a>1时我们需要显示<input name="old.id" value="this is old value"/>,当 a<=1时我们需要显示<input name="id" value="this is new value"/>,那么我们就可以这样实现: 1、在java端编写一个功能类 public class XXUtil{ public static boolean isOld(int a){ if(a>1)return true; return false; } public static boolean isNew(int a){ if(a<=1)return true; return false; } } 并将这个类放入context中 然后view层就可以这样描述: <input name="old.id" value="this is old value" j:remove="${XXUtil.isOld(a)}"/> <input name="id" value="this is new value" j:remove="${XXUtil.isNew(a)}"/> 这相当于jstl里的 <c:if test="a>1"> <input name="old.id" value="this is old value" j:remove="${XXUtil.isOld(a)}"/> <c:else> <input name="id" value="this is new value" j:remove="${XXUtil.isNew(a)}"/> </c:if> 在运行时其中一个input肯定会被删除掉,这样就完成了if的功能,在这里我只是举例说明,你也可以将这两个(或多个)input合并成一个,需要变化的部分全用变量代替(如下)。这样一来所有的逻辑(包括界面逻辑)全在服务器端实现,界面仍然非常简洁。 <input name="${xxx.name}" value="${xxx.value}" j:remove="${XXUtil.isOld(a)}"/> 此时这一行就代表了多个if else,当然XXUtil这个类的逻辑也要做相应的修改了。 |
|
返回顶楼 | |
浏览 6624 次