最新内容请参考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的模板
- >
- <html xmlns:j="http://www.mobi99.cn">
- <head>
- <title>${title}title>
-
- head>
-
- <body>
- <ul>
- <li j:foreach="${dataSet}" j:item="${data}">
- <span j:tid='${data.getName()}' id="showname">这里显示NAMEspan>
- <j:tempnode j:tid='${data.getName()}'>这里显示NAMEj:tempnode>
- <img src="http://localhost/roseforj/listImg.do?id=${data.getId()}" width="200" />
- xxx.id=${xxx.getId()}
- li>
- ul>
- <j:include path='/xml/include.html'/>
- body>
- html>
从上面模板可以看出RoseForJ只有两个TAG(tempnode、include)和3个属性(foreach、item,tid),它也是一个标记语言,写法如下 ${变量表达式} 。
其中3个属性可用于html任何标签(如用于tr ,td等),foreach、item配合使用,表示一个循环,foreach="${dataSet}" ,此时dataSet是一个集合对象或数组,item="${data}" ,data表示集合对象或数组对象中每一个成员。
${变量表达式} 的用法非常灵活,可在任何位置,如上面的用法:
1、这里作为TAG 的text的值,运行结束后将替换掉 "这里显示NAME" 这段文本
- <span j:tid='${data.getName()}' id="showname">这里显示NAMEspan>
2、此处用法是作为HTML TAG img的属性src的参数值。
- <img src="http://localhost/roseforj/listImg.do?id=${data.getId()}" width="200" />
3、xxx.id=${data.getId()} 可以直接输出。
两个TAG(tempnode、include)中include不用说一看就知道是引入外面的一个模板文件,tempnode的作用是在解析完成后,会将此tempnode节点删除,如在此处的应用
xml 代码
- <div class="dtree">
- <a href="javascript: d.openAll();">展开a> | <a href="javascript: d.closeAll();">关闭>
- <script type="text/javascript">
- d = new dTree('d');
-
- d.add(0,-1,'系统菜单','#',"showMenu",null);
- <j:tempnode j:foreach="${MenuSet}" j:item="${data}">
- d.add('${data.get("id")}','${data.get("i_parentid")}','${data.get("c_title")}','${data.get("c_target")}');
- j:tempnode>
- document.write(d);
- script>
-
我们都知道在script TAG中是不允许出现其它tag的,所以此处的运行结果为:
xml 代码
- <script type="text/javascript">
- d = new dTree('d');
-
- d.add(0,-1,'系统菜单','#',"showMenu",null);
-
- d.add('1','0','频道管理','../channel/listChannel.do','mainFrame');
-
- d.add('2','0','内容管理','../content/listContent.do','mainFrame');
-
- d.add('3','1','新增频道','../channel/editChannel.do','mainFrame');
-
- d.add('4','2','新增内容','../content/editContent.do','mainFrame');
-
- d.add('5','0','角色管理','../role/listRole.do','mainFrame');
-
- d.add('6','0','用户管理','../user/listUser.do','mainFrame');
-
- d.add('7','5','新增角色','../role/editRole.do','mainFrame');
-
- d.add('8','6','新增用户','../user/editUser.do','mainFrame');
-
- d.add('9','0','菜单管理','../menu/listMenu.do','mainFrame');
-
- d.add('10','9','新增菜单','../menu/editMenu.do','mainFrame');
-
- document.write(d);
- script>
从上面的代码可以看出tempnode 节点被删除了
在服务器端的编程则更加简单,几乎没有任何约束,你可以用hibernate,ibaits,javabean或者自己组织的任何对象,同时还可以嵌套使用,如:
java 代码
- 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 {
-
-
-
-
- public static void main(String[] args) throws Exception{
- String filename = "/xml/hell.html";
- Vector paths = new Vector();
- paths.add("E:\\workspace\\Test\\juan");
- 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);
- }
- }
-
从上面的编码中可以看出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)}">下一页
太晚了,明天再接着写
分享到:
相关推荐
"Paoding Rose" 是一个Java Web开发框架,其1.0.1版本的jar包名为"paoding-rose-1.0.1.jar"。这个框架由一系列组件组成,旨在简化Web应用程序的开发过程,提高开发效率。在描述中提到的“包含基本所需要的jar,比较...
- **JSP、Servlet、JSTL、EL**:Java服务器页面、Java Servlet、JSP标准标签库和表达式语言,用于Web开发。 - **JNDI**:Java命名和目录接口,提供查找和绑定对象的机制。 - **JMS**:Java消息服务,用于异步通信...
1. **Web开发框架**:Web开发框架如JSF、Struts2、Spring MVC等帮助简化前端开发,提供MVC模式来组织代码,提高可维护性和复用性。例如,JSF提供了丰富的UI组件,而Spring MVC则结合了Spring的强大功能,提供了灵活...
同时,它还集成了Velocity模板引擎和Log4j日志框架,表明它可能是一个用于开发Web应用或者服务的框架,注重代码的可维护性、性能监控和用户体验。由于具体实现细节未给出,要了解更多关于RoseForJ的特性和使用方法,...
7. **Web开发框架**:PaodingRose可以作为一个Web开发框架使用,它提供了MVC模式的支持,帮助开发者构建高效的Web应用。其控制器、模型和视图的分离设计,符合现代Web开发的最佳实践。 8. **扩展性**:PaodingRose...