论坛首页 Java企业应用论坛

fastm plus方案:)

浏览 12242 次
精华帖 (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代码:
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
0 请登录后投票
   发表时间:2004-07-19  
兄弟,你需要一个类似于ognl的方案。或者直接拿过来用。
0 请登录后投票
   发表时间:2004-07-19  
怎么写日历

另外sunday的那一列是其他样式的
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企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics