Rose4J 新的WEB开发引擎

最新内容请参考www.rose4j.cn

根据我的经验,一个典型的Web应用中的代码比例如下:

页面逻辑约占50%,商业逻辑约占30%,O/R约占20%。

但事实上,页面却是最不受重视的部分,从来都被认为是脏活,累活,杂活。典型的开发过程通常是这样:

页面设计人员迅速的用Dreamweaver等生成一堆文本杂乱无章的页面,然后交给JSP程序员加入更加杂乱无章的Java代码和Taglib。

当页面布局风格需要改变的时候,页面设计人员用Dreamweaver等生成一堆新的页面。JSP程序员再重新加入更加杂乱无章的Java代码Taglib。

至于页面中的脚本逻辑调试,更是一门精深的工夫了。

根据社会规则,通常来说,工作内容越轻松,收入越高;工作内容越脏月累,收入越低;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的模板

package juan.framework;    

   

import java.util.ArrayList;    

import java.util.List;    

   

public class ValueObject {    

   private int id=0;    

   private String name="tom";    

       

   private List aList=new ArrayList();    

       

   public List getList() {    

      return aList;    

   }    

   

   public void setList(List list) {    

      aList = list;    

   }    

   

   public int getId() {    

      return id;    

   }    

   

   public void setId(int id) {    

      this.id = id;    

   }    

   

   public String getName() {    

      return name;    

   }    

   

   public void setName(String name) {    

      this.name = name;    

   }    

}    

   

   

package juan.framework;    

   

import java.util.ArrayList;    

import java.util.List;    

import java.util.Vector;    

   

import juan.framework.context.IContext;    

import juan.framework.context.impl.InnerContextImpl;    

import juan.framework.runtime.RuntimeSingleton;    

   

public class Test {    

   

   /**   

    * @param args   

    */   

   public static void main(String[] args) throws Exception{    

      String filename = "/xml/hell.html"; //要访问的模板path    

      Vector paths = new Vector();    

      paths.add("E:\\workspace\\Test\\juan");  //模板存放的path,可以有多个    

      RuntimeSingleton.init(paths);    

   

   

      IContext context=new InnerContextImpl();    

      context.put("title", "www.mobi99.cn");    

          

      ValueObject vo1=new ValueObject();    

      vo1.setId(9999);    

      vo1.setName("vovovovovov");    

          

      context.put("data", vo1);     

          

          

      List aList=new ArrayList();     

      ValueObject[] xxSet=new ValueObject[2];    

          

      ValueObject vo=new ValueObject();    

      vo.setId(100);    

      vo.setName("tony");    

          

          

      aList.add(vo);    

      xxSet[0]=vo;    

          

      vo=new ValueObject();    

      vo.setId(200);    

      vo.setName("tom");    

      aList.add(vo);    

      xxSet[1]=vo;    

          

      context.put("dataSet", aList);    

      context.put("xxSet", xxSet);    

   

      RuntimeSingleton.getTemplate(filename, "GBK").merge(context,null); //此处null为writer,demo中省掉了    

   }    

}    

  

从上面的编码中可以看出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)}">上一页a href="listContent.do?pages=${MathTool.add(iPageCurrent,1)}">下一页

 太晚了,明天再接着写

相关推荐