锁定老帖子 主题:fastm plus方案:)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-07-18
1、ValueSet定义 1.1、Key-Value对 任何一个简单的{"KEY","VALUE"}组合,都可以称之为一个Key-Value对。其中Key一定是一个String,而Value则可以是一个String,也可以是一个ValueObject或者一个ValueList。 1.2、ValueObject包含一组Key-Value对,其中的每一个的Key都不相同。例如: {"学生姓名","学生信息"} 学生信息就是一个ValueObject,这个对象可以是这样的: {{"年龄","20"},{"性别","男"},{"学号","129"}} 其中的每一个Key都不能相同。 1.3、ValueList也包含一组Key-Value对,其中的每一个的Key都是相同的。例如: {{"学生信息","张三学生信息"},{"学生信息","李四学生信息"},{"学生信息","王五学生信息"}} 1.4、每个页面都需要一个ValueSet,这个ValueSet可以只包含n个Key-Value对,这是ValueSet就只是一个简单的ValueObject,但是也可以包含更加复杂的ValueObject,ValueList的嵌套结构。 2、模板定义 2.1、Key的定位,可以通过a.b.c这样的点符号方式,定位到任何一个Key-Value对。也可以在一个模板内部,省略前面的定位字符串。 2.2、简单替换,在一个模板中,能够被定义的简单Key-Value对,可以通过{KEY}的方式,替换为Value的内容。 2.3、ValueObject模板。通过 <!-- BEGIN DYNAMIC OBJECT: keyname --> ...... <!-- END DYNAMIC OBJECT: keyname --> 的方式,可以定位一个ValueObject对象,在这个模板范围内的内容,只执行一遍,并且可以通过不带绝对定位符的{key}方式,取得{value}的内容。 2.4、ValueList模板。通过 <!-- BEGIN DYNAMIC LIST: keyname --> ...... <!-- END DYNAMIC LIST: keyname --> 的方式,可以定位一个ValueList对象,在这个模板范围内的内容,将会执行N遍,N取决于ValueList的length()。 3、高级属性 3.1、ChoiceName 对于同一个ValueObject或者ValueList,可以定义多个模板 <!-- BEGIN DYNAMIC OBJECT: keyname;ChoiceName: test1--> <!-- BEGIN DYNAMIC LIST: keyname ChoiceName: test2--> 以这样的方式来区分多个模板。 而在每一个ValueObject与ValueList中,都有一个隐含的变量ChoiceName,可以set和get。 3.2、ProcessName 对于任何范围的ValueSet,都可以再次甚至多次指定ProcessName。例如: <!-- BEGIN DYNAMIC LIST: keyname;ProcessName:Proc1(keyname) --> 如果是多次指定,则是: <!-- BEGIN DYNAMIC LIST: keyname;ProcessName:Proc2(Proc1(keyname)) --> ProcName,是一个java的Class中的某一个函数,可以通过package.class.method方式指定。 所有这样的Proc,都接收ValueSet对象,然后返回ValueSet对象。这些Proc也可以接收其他参数,例如: <!-- BEGIN DYNAMIC LIST: keyname;ProcessName:Proc1(keyname,"#ff03ff","#ff05ff") --> 只要具体的Proc能够支持。 4、示例 明天接着写,就是我自己出的那两个题目,在加上一个颜色交错显示的表格。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-07-18
庄表伟 写道 buaawhl,你的fastm的方案,我最近一直在思考,有些成果拿出来大家讨论一下。
1、ValueSet定义 1.1、Key-Value对 任何一个简单的{"KEY","VALUE"}组合,都可以称之为一个Key-Value对。其中Key一定是一个String,而Value则可以是一个String,也可以是一个ValueObject或者一个ValueList。 1.2、ValueObject包含一组Key-Value对,其中的每一个的Key都不相同。例如: {"学生姓名","学生信息"} 学生信息就是一个ValueObject,这个对象可以是这样的: {{"年龄","20"},{"性别","男"},{"学号","129"}} 其中的每一个Key都不能相同。 1.3、ValueList也包含一组Key-Value对,其中的每一个的Key都是相同的。例如: {{"学生信息","张三学生信息"},{"学生信息","李四学生信息"},{"学生信息","王五学生信息"}} 1.4、每个页面都需要一个ValueSet,这个ValueSet可以只包含n个Key-Value对,这是ValueSet就只是一个简单的ValueObject,但是也可以包含更加复杂的ValueObject,ValueList的嵌套结构。 2、模板定义 2.1、Key的定位,可以通过a.b.c这样的点符号方式,定位到任何一个Key-Value对。也可以在一个模板内部,省略前面的定位字符串。 2.2、简单替换,在一个模板中,能够被定义的简单Key-Value对,可以通过{KEY}的方式,替换为Value的内容。 2.3、ValueObject模板。通过 <!-- BEGIN DYNAMIC OBJECT: keyname --> ...... <!-- END DYNAMIC OBJECT: keyname --> 的方式,可以定位一个ValueObject对象,在这个模板范围内的内容,只执行一遍,并且可以通过不带绝对定位符的{key}方式,取得{value}的内容。 2.4、ValueList模板。通过 <!-- BEGIN DYNAMIC LIST: keyname --> ...... <!-- END DYNAMIC LIST: keyname --> 的方式,可以定位一个ValueList对象,在这个模板范围内的内容,将会执行N遍,N取决于ValueList的length()。 3、高级属性 3.1、ChoiceName 对于同一个ValueObject或者ValueList,可以定义多个模板 <!-- BEGIN DYNAMIC OBJECT: keyname;ChoiceName: test1--> <!-- BEGIN DYNAMIC LIST: keyname ChoiceName: test2--> 以这样的方式来区分多个模板。 而在每一个ValueObject与ValueList中,都有一个隐含的变量ChoiceName,可以set和get。 3.2、ProcessName 对于任何范围的ValueSet,都可以再次甚至多次指定ProcessName。例如: <!-- BEGIN DYNAMIC LIST: keyname;ProcessName:Proc1(keyname) --> 如果是多次指定,则是: <!-- BEGIN DYNAMIC LIST: keyname;ProcessName:Proc2(Proc1(keyname)) --> ProcName,是一个java的Class中的某一个函数,可以通过package.class.method方式指定。 所有这样的Proc,都接收ValueSet对象,然后返回ValueSet对象。这些Proc也可以接收其他参数,例如: <!-- BEGIN DYNAMIC LIST: keyname;ProcessName:Proc1(keyname,"#ff03ff","#ff05ff") --> 只要具体的Proc能够支持。 4、示例 明天接着写,就是我自己出的那两个题目,在加上一个颜色交错显示的表格。 太强了!!! |
|
返回顶楼 | |
发表时间:2004-07-18
庄表伟 写道 buaawhl,你的fastm的方案,我最近一直在思考,有些成果拿出来大家讨论一下。
3、高级属性 3.1、ChoiceName 对于同一个ValueObject或者ValueList,可以定义多个模板 <!-- BEGIN DYNAMIC OBJECT: keyname;ChoiceName: test1--> <!-- BEGIN DYNAMIC LIST: keyname ChoiceName: test2--> 以这样的方式来区分多个模板。 而在每一个ValueObject与ValueList中,都有一个隐含的变量ChoiceName,可以set和get。 3.2、ProcessName 对于任何范围的ValueSet,都可以再次甚至多次指定ProcessName。例如: <!-- BEGIN DYNAMIC LIST: keyname;ProcessName:Proc1(keyname) --> 如果是多次指定,则是: <!-- BEGIN DYNAMIC LIST: keyname;ProcessName:Proc2(Proc1(keyname)) --> ProcName,是一个java的Class中的某一个函数,可以通过package.class.method方式指定。 所有这样的Proc,都接收ValueSet对象,然后返回ValueSet对象。这些Proc也可以接收其他参数,例如: <!-- BEGIN DYNAMIC LIST: keyname;ProcessName:Proc1(keyname,"#ff03ff","#ff05ff") --> 只要具体的Proc能够支持。 4、示例 明天接着写,就是我自己出的那两个题目,在加上一个颜色交错显示的表格。 不过,高级属性部分引入了Choice逻辑。 那这段逻辑就和这段HTML绑在一起了, 就没有办法提出来重用到其他的HTML了。 Thanks Very Much. Heartily. |
|
返回顶楼 | |
发表时间:2004-07-19
先补上昨天的一点遗漏
3.3、ListInfo 在ValueList中,还包含一个隐含的ValueObject,名称就是ListInfo。ListInfo的内容是不固定的,但是存放的都是这个list的相关信息,例如条数,总条数,第几页,总共有几页之类的数据。使用方式,下面会详细讲的。 4、demo 4.1、邮编下拉框 html: <select name=zipcode> <option value="200013">200013</option> <option value="200014">200014</option> <option value="200015">200015</option> <option value="200016">200016</option> </select> ValueSet代码: ValueObject zipcode=new ValueObject();; KeyValue kv=new KeyValue();; kv.set("zip","200013");; zipcode.add(kv);; kv.set("zip","200014");; zipcode.add(kv);; kv.set("zip","200015");; zipcode.add(kv);; kv.set("zip","200016");; zipcode.add(kv);; ValueSet root=new ValueSet();; root.add("zipcode",zipcode);; Template代码: <select name=zipcode> <!-- BEGIN DYNAMIC LIST: zipcode --> <!-- BEGIN DYNAMIC OBJECT: zip --> <option value="{zip}">{zip}</option> <!-- END DYNAMIC OBJECT: zip --> <!-- END DYNAMIC LIST: zipcode --> </select> 解释,在模板方面与fastm不同之处。在于: <!-- BEGIN DYNAMIC LIST: zipcode --> <!-- BEGIN DYNAMIC OBJECT: zip --> <option value="{zip}">{zip}</option> <!-- END DYNAMIC OBJECT: zip --> <!-- END DYNAMIC LIST: zipcode --> 显得有些重复,这样的写法,属于规范形式。如果对于同一个OBJECT,可能根据ChoiceName选择不同的模板时,就需要这样来写。例如: <!-- BEGIN DYNAMIC LIST: zipcode --> <!-- BEGIN DYNAMIC OBJECT: zip;ChoiceName: normal --> <option value="{zip}">{zip}</option> <!-- END DYNAMIC OBJECT: zip --> <!-- BEGIN DYNAMIC OBJECT: zip;ChoiceName: selected --> <option value="{zip}" selected>{zip}</option> <!-- END DYNAMIC OBJECT: zip --> <!-- END DYNAMIC LIST: zipcode --> 而当一个ValueList内的Object,只有一个模板时,OBJECT的界定标记就可以省略。写成: <!-- BEGIN DYNAMIC LIST: zipcode --> <option value="{zip}">{zip}</option> <!-- END DYNAMIC LIST: zipcode --> 这样就与原来的fastm一致了。 4.2、学生成绩表格 html: <table> <tr> <td>姓名</td> <td>平均成绩</td> <td>课程</td> <td>单科成绩</td> </tr> <tr> <td>张三</td> <td>80</td> <td>语文</td> <td>80</td> </tr> <tr> <td rowspan="2">李四</td> <td rowspan="2">85</td> <td>语文</td> <td>80</td> </tr> <tr> <td>数学</td> <td>90</td> </tr> </table> ValueSet代码: ValueObject StudentScoreInfo=new ValueObject();; KeyValue kv=new KeyValue();; KeyValue kv2=new KeyValue();; ValueList StudentScoreList=new ValueList();; kv.set("name","张三");; StudentScoreInfo.add(kv);; kv.set("subject","语文");; StudentScoreInfo.add(kv);; kv.set("score","80");; StudentScoreInfo.add(kv);; kv2.set("StudentScoreInfo",StudentScoreInfo);; StudentScoreList.add(kv2);; kv.set("name","李四");; StudentScoreInfo.add(kv);; kv.set("subject","语文");; StudentScoreInfo.add(kv);; kv.set("score","80");; StudentScoreInfo.add(kv);; kv2.set("StudentScoreInfo",StudentScoreInfo);; StudentScoreList.add(kv2);; kv.set("name","李四");; StudentScoreInfo.add(kv);; kv.set("subject","数学");; StudentScoreInfo.add(kv);; kv.set("score","90");; StudentScoreInfo.add(kv);; kv2.set("StudentScoreInfo",StudentScoreInfo);; StudentScoreList.add(kv2);; ValueSet root=new ValueSet();; root.add("StudentScoreList",StudentScoreList);; Template代码: <table> <tr> <td>姓名</td> <td>平均成绩</td> <td>课程</td> <td>单科成绩</td> </tr> <!-- BEGIN DYNAMIC LIST: StudentScoreList;ProcessName:StudentInfoProc.tableCount(StudentScoreList)--> <!-- BEGIN DYNAMIC OBJECT: StudentScoreInfo;ChoiceName: first --> <tr> <td rowspan="{rowspan}">{name}</td> <td rowspan="{rowspan}">{average}</td> <td>{subject}</td> <td>{score}</td> </tr> <!-- END DYNAMIC OBJECT: StudentScoreInfo --> <!-- BEGIN DYNAMIC OBJECT: StudentScoreInfo;ChoiceName: other --> <tr> <td>{subject}</td> <td>{score}</td> </tr> <!-- END DYNAMIC OBJECT: StudentScoreInfo --> <!-- END DYNAMIC LIST: StudentScoreList --> </table> 关键在于<!-- BEGIN DYNAMIC LIST: StudentScoreList;ProcessName:StudentInfoProc.tableCount(StudentScoreList)-->中多出来的ProcessName。 tableCount代码: pubic class StudentInfoProc{ public static ValueSet tableCount(ValueSet in);{ ValueObject StudentInfo1=new ValueObject();; ValueObject StudentInfo2=new ValueObject();; KeyValue kv=new KeyValue();; StudentInfo1=(ValueObject);in.get(0);; String StudentName1=(String);StudentInfo1.get("name");; String StudentName2=""; int rows=1; float total=convert((String);StudentInfo1.get("score"););; StudentInfo1.setChoiceName("first");; for(int i=1;i<in.length();;i++);{ StudentInfo2=(ValueObject);in.get(i);; StudentName2=(String);StudentInfo2.get("name");; if(StudentName1.equals(StudentName2););{ total=total+convert((String);StudentInfo2.get("score"););; rows++; StudentInfo2.setChoiceName("other");; } else { float average=total/rows; kv.set("average",average+"");; StudentInfo1.add(kv);; kv.set("rowspan",rows+"");; StudentInfo1.add(kv);; StudentInfo1=StudentInfo2; StudentInfo1.setChoiceName("first");; total=convert((String);StudentInfo2.get("score"););; rows=1; } } return in; } } 改一下bug |
|
返回顶楼 | |
发表时间:2004-07-19
兄弟,你需要一个类似于ognl的方案。或者直接拿过来用。
|
|
返回顶楼 | |
发表时间:2004-07-19
怎么写日历
另外sunday的那一列是其他样式的 |
|
返回顶楼 | |
发表时间:2004-07-19
这个问题问得好,我会给出demo的。不但是显示日历,而且还应该像常见的BLOG日历那样,在有文章的日期下,有可以点击的Link。
|
|
返回顶楼 | |
发表时间:2004-07-19
庄表伟 写道 这个问题问得好,我会给出demo的。不但是显示日历,而且还应该像常见的BLOG日历那样,在有文章的日期下,有可以点击的Link。
牛。 fastm哪怕只起到一点启发大家思路的作用,也算没有白来世界上走一遭。 Thanks. |
|
返回顶楼 | |
发表时间:2004-07-19
多谢庄表伟 的深入思考和加强。
下面是我自己的对于fastm的可能扩展和兼容的想法。 ValueSet DOM是fastm的数据和Template的交流中枢。也是数据重用的中心。 主要的重用的想法,就是发展ValueSet DOM数据交换的方式。 (1) 比如,如何把XML数据传到ValueSet DOM中。 这样所有的XML/XSLT程序就可以直接移植到fastm,而不用维护XSL文件了。 这里fastm的引擎就替换了XSLT处理引擎。而fastm的处理引擎是非常快的。 (2) 比如,如何利用relection把一个普通bean的数据设置到ValueSet DOM。 这样,普通的MVC程序就可以直接移植到fastm上来。 只需要把以前填到request.attribute里的东西,利用数据交换接口传入到ValueSet DOM里面就可以了。 当然,这些方式都不是fastm的Best Practice。 fastm的本来用法是结构最简单,最容易的。 因为我希望fastm更加强大有用,而不是变得“可用”。我希望fastm能够创立一种新的更简洁优雅的模式,而不是兼容其它模式。 所以我还没有下决心实施这些“兼容性、可用性”方面的扩展。 相比之下,庄表伟却在思考令 fastm更加强大和有用的本质问题。惭愧... :-) |
|
返回顶楼 | |
发表时间:2004-07-19
判断一个Web框架的好坏。有以下一些标准。
1、能够准确的生成页面。如果做不到这一点,一切都免谈。 2、容易开发(简单、好懂) 3、容易修改(能够快速准确的为一个修改需求定位需要修改的文件) 4、方便重用。这是最后一个目标,而不是最重要的目标。 我在你的ValueSet和Template之外,再加上一个ViewLogic层,首先就是为了能够方便的实现Web页面。同样的,当出现了一个修改需求时,开发人员,也能更加容易的定位到需要修改的部分,因为逻辑概念更加清晰了。最后,也因为这样的划分,template和业务逻辑层产生的ValueSet,也会变得更加容易重用。 |
|
返回顶楼 | |