论坛首页 Java版 Webwork

fastm plus方案:)

浏览 6978 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间: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的方案,我最近一直在思考,有些成果拿出来大家讨论一下。

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、示例
明天接着写,就是我自己出的那两个题目,在加上一个颜色交错显示的表格。


太强了!!!
   
0 请登录后投票
时间: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.
   
0 请登录后投票
时间: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代码:
[code:1]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);[/code:1] 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代码:
[code:1]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);[/code:1] 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代码:
[code:1]
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;
}
}[/code:1]

改一下bug
   
0 请登录后投票
时间:2004-07-19
兄弟,你需要一个类似于ognl的方案。或者直接拿过来用。
   
0 请登录后投票
时间:2004-07-19
怎么写日历

另外sunday的那一列是其他样式的
  • B468ee1c-4ff4-46bc-ba6e-54ca1e80c6fb-thumb
  • 描述:
  • 大小: 3.4 KB
   
0 请登录后投票
时间:2004-07-19
这个问题问得好,我会给出demo的。不但是显示日历,而且还应该像常见的BLOG日历那样,在有文章的日期下,有可以点击的Link。
   
0 请登录后投票
时间:2004-07-19
庄表伟 写道
这个问题问得好,我会给出demo的。不但是显示日历,而且还应该像常见的BLOG日历那样,在有文章的日期下,有可以点击的Link。


牛。
fastm哪怕只起到一点启发大家思路的作用,也算没有白来世界上走一遭。
Thanks.
   
0 请登录后投票
时间: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更加强大和有用的本质问题。惭愧... :-)
   
0 请登录后投票
时间:2004-07-19
判断一个Web框架的好坏。有以下一些标准。
1、能够准确的生成页面。如果做不到这一点,一切都免谈。

2、容易开发(简单、好懂)

3、容易修改(能够快速准确的为一个修改需求定位需要修改的文件)

4、方便重用。这是最后一个目标,而不是最重要的目标。

我在你的ValueSet和Template之外,再加上一个ViewLogic层,首先就是为了能够方便的实现Web页面。同样的,当出现了一个修改需求时,开发人员,也能更加容易的定位到需要修改的部分,因为逻辑概念更加清晰了。最后,也因为这样的划分,template和业务逻辑层产生的ValueSet,也会变得更加容易重用。
   
0 请登录后投票
论坛首页 Java版 Webwork

跳转论坛:
JavaEye推荐