Send As SMS

2005-08-26

Another JSP: Javascript Page

基于 XML javascript技术,我准备设计一个全新的 模板语言,以带来一些全新的体验:

1
、足够简单。如果还需要编写一个复杂的词法分析、模板语言的话,至少会花去我1周以上的时间。我希望这个模板语言能够在1-2天内就开发完成,而且足够强大。
2
、容易学习。应该只有近可能少的规则,很容易学习。
3
、良好的可视化编辑能力,因为,主要希望提供 HTML + WEB 的开发,而传统的JSP实际上已经很难进行Visual编辑和预览了。新的模板语言应尽可能支持预览能力。

我想我已经找到了一个满意的答案,我会在尽可能短的时间内(呵呵自能在Overtime的时间内了)

基本的规则:
1
、源文件必须是XML,因此,在WEB上,只能支持XHTML。(原因:我不想编写烦人的词法分析)
2
、脚本语言选择JavaScript。不定义自己的脚本语言。

在任何属性中,可以使用${expr},替换成js表达式

翻译成:

out.print(“”)

${book.name}

文本节点中的${expr}替换成js表达式

var strings = [ “hello”, “world” ];

中的子文本节点(不包括子element及其子孙)被当作javascript执行。

这个例子直接相当于:

var strings = [“hello”, “world”];

for(var it in strings){

$it

}

这个被翻译成为:

for(var it in strings){

out.print(“” + it + “)

}

for(var it in strings){

$it

}

标记相似,但同时输出,等同于:

out.print(“”);

for(var it in strings){

out.print(“” + it + “)

}

out.print(“”)

for(var arg in args){

out.print(“contents”;

}

或许还会扩展新的规则,目前没有

基本思路:

1、parse XHTML in DOM

2、process each nodes

a) Text Node

i. With ${..} expression – replace with print(expr)

ii. Without ${..} expression

b) xs:script element or element has xs:script=”true”

i. text node as script

ii. process child elements

c) element has xs:wrapper

其它:

1、 JavascriptPageServlet – process .jsp file, compile to javascript and then evaluation it.

2、 Only if the .jsp modified, should the servlet recompile the script, otherwise reuse the compilation unit

3、 Prepare the varibles such as “request, response, session, application etc.” and a funtion print(), println(). That can be called in the script.

2005-08-25

Ideas on JavaScript 2.0

动态语言毫无疑问会成为接下来的一个热点,在这方面,JavaScript有很不错的优势:语言简洁,语法与Java相似,rhino的实现已经证明了 JavaScript与Java的结合能力,更为有意思的是,Java 6中已经预备了对脚本语言支持的能力,看来下一个趋势就是,在Java的平台上,充分的发挥这些动态语言的灵活性。

JavaScript 2.0 在 JS1.5的基础上更进一层,提供了很多有价值的增强,这些相信都能大幅度的提高软件的质量。

1、首次提出了Class的概念。基于模板的Class与基于Prototype的Class相比,更符合OO(我们的大部分人都习惯了基于模板的OO的 思维模式)习惯,而且Class由于模板的限制,而更为稳定,否则,行为变化过于动态,反而影响整个应用的易于理解的能力。
2、引入了namespace、package的概念,使得,使用JavaScript来开发大型应用更为便捷。
3、JS1.5中仅支持动态类型检查,而JS2.0中同时也支持静态的类型检查,这可以大大提高编译器所能发挥的作用。毕竟,在很多时候,类型是可预见的、固定的。

我觉得,JavaScript还应该从其他语言那里来学习一些东西,包括:
1、有一个定义良好的虚拟机。实际上,更多的语言成分,非常的复杂,但抽象到虚拟机上,则能返本归真,语义更为清晰。同时,可以在核心的基础上更为容易的 进行扩展。实际上,在基于Java的平台上,考虑JS的虚拟机,应该不是一个很复杂的事情。包括GC之类的可以建立在Java的基础之上。
2、对XML的内置支持。这个已经有一个E4X的规范。基本上,也可以理解只是一个语法层面上的扩展,对JSVM并没有什么特别的东西。
3、学习Java5,加入元信息的支持。虽然最近在WEB上出现了对annotation的批评,但个人仍然认为这是一种很好的描述语义的手段。JS2.0的规范中好像缺乏这样的东西。

在跟Java的结合上,可以考虑直接使用JS2.0来开发Java的类。JS2.0的class可以直接编译成为Java的Class,作为Java的类 的子类、接口实现而在Java中透明的访问。一些动态的机制,比如说动态的对象属性,则编译成为动态行为,否则,可以编译成为对应的Java字段和方法。

当编译成为JavaClass时,还有一个优势,就是可以利用Java的调试机制,所要做的,只是进行一个源代码-执行吗之间的映射就可以了。

2005-08-24

从RubyOnRails学习

使用GmailWEB来写东西,结果写了一大段,却丢失了,想重新写出来,却兴致全无。

 

只好写一些没写完的内容。

 

1、   动态的对象模型与静态的对象模型相结合。

JDOEJB3HibernateOR框架均试图把关系模型映射到Java的对象世界中,并且取得了不错的进步,但是,这种强类型的对象模型,却并适合于进行框架性的、动态的处理,比如说,自动的产生对表的CRUD操作、维护等。在这种领域,动态的对象更具优势。

但是,在这方面,由于缺乏一个统一的、定义良好的面向关系数据库的元对象模型,因此,更多的操作只能在JDBC这一层次上进行,JDBC而且缺乏了对于表之间关系的概念。

 

想法:

a)         基于 EJB3 POJO模型,定义一个关系数据库的元对象模型,比如说,包括:

Database

Table

Field

         Constraint

Relation

Constraint

         PK

         FK

可以通过 EJB3 annotation 来构造这个元模型,或者直接从数据库、XML中构造。

b)         基于该元模型,提供类似ADO.NET的访问API,包括查询、数据操作等,尤其是一个功能强大的DataSet表达能力。

c)         可以实现JavaADOEJB POJO之间的转换。但一般的JavaADO是建立在JDBC基础之上的,或许也可以建立在EJB3 POJO之上。

 

2、   数据模型驱动。

基于元信息,我们可以很方便的构造动态的Controller

 

3、   View的处理上,如果是基于Ajax模型,实际上更多的处理会在浏览器端,以更对象化的形式来进行。

 

2005-08-22

应用程序中的多语言支持

Java提供了对多语言的支持,一般的,是通过采用 ResourceBundle的技术,把字符串资源化。但是,对于Web网站来说,则存在一些特变之处。

1、页面。如果把一个页面中的文字常量采用ResourceBundle来管理的话,那么随便一个中等规模的页面,都会有上百个的字符串常量,但为其提供 一个惟一的名字,就非常的头痛了,更别提对这么多的字符串进行管理了。而且,页面的源文件也基本上不再具有可读性,可维护性了。
2、数据资源。很多时候,一些存储在数据库中的数据项也是具有多语言的,比如说:地址,中文的地址、英文的地址,这些数据根本不是在程序中指定的,而是运行中的一些动态资源。

解决方案:
1、页面以整个的Page为单位,对每一个语言直接进行翻译重写,但尽量将一些可以数据化的字符串以资源的形式保存,这样,既可以让每一个页面都可读性高。
2、在数据库中引入这样的一种字段: LocalizedString,可以使用 VARCHAR、甚至Text等类型,映射到Java时,则生成这样的一个字段,但这个字段并不直接面向客户,而是建立一个访问别名,在get方法中,根据当前的Locale返回指定的值。

中文字符串
English String
繁體中文

2005-08-17

AJAX:Javascript模板处理技术

AJAX 应用中,用户界面更多的使用Javascript动态的生成,尤其是根据服务器端返回的数据动态的构造一个用户界面,结合我在上一个Blog中的技术《XML数据处理》,我们已经把服务器端传输的XML数据转换成未了Javascript可以直接访问的对象,那么接下来,如何在这个数据的基础上构造一个动态的用户界面呢?

 

1、   XML + XSLT:标准的技术,采用XML + XSLT,我们可以把XML转换成为另外的一个XML,或者HTML,从而利用element.innerHtml技术构造出动态的用户界面来。

Google提供了基于浏览器的XSLT(http://goog-ajaxslt.sourceforge.net/),这是一个简化的,完全使用Javascript编写的XSLT转换程序,大小大约为70K左右。应该说,基于goog-ajaxslt技术,可以使用标准的XSLT技术来动态的构造用户界面,是一个很好的候选方案。

缺点:对浏览器的支持,好像IE5.0不支持

2、   采用如下的Javascript的模板技术

function JsTransform(jsObj, template);

 

JsTransform(pollDef, '<div id="poll_$(arg.id)">

    <div name="header">

       $(arg.description)

    </div>

    <div name="body">

       ${ this.foreach(pollDef.options,

           "<div> $(arg.name} ${arg.description}</div>" )

       }$

    </div>

    <div name="action">

   

    </div>

    </div>');

这种模式应用标准的Javascript技术。详细的规范我会进一步的设计。

3、   基于DOM的动态生成。

从某种角度而言,上述的模板完全可以转换成为等效的DOM操作,但代码量较大,而且,维护和可读性相对要困难得多。

 

AJAX开发的一些想法

由于在接下来的项目中考虑采用AJAX+J2EE的开发技术,因此,最近对相关的技术考虑得比较多,这里将一些想法收集下来,作为余下研发的一个参考。

 

1、   XML数据处理

AJAX技术中,浏览器和服务器之间更多的交换是数据而不是传统的页面,这是Ajax的一个最重要的特性,那么,表示数据的最佳形式是XML,主要的优势在于:

l          XML具有很强的数据表示能力,尤其是表示复杂的数据结构。实际上,取决于你的抽象能力,XML可以表示任何的数据。

l          XML已经非常成熟,有精确定义的规范,并且已经作为通用的数据交换语言,在BrowserJava以及几乎所有的与Intenet关联的环境之中。

l          Java中,JAXB2技术使得XMLJava可以以一种很友好的方式进行映射,可以使用Java的对象模型来简单、强类型的访问XML数据

但是在浏览器中,要处理XML,虽然现有的浏览器大部分支持XMLHTTP,可以将XML转换成为DOM来进行访问,但是,仍然存在一些问题就是,使用DOM来访问XML并不是一种很好的面向对象的方式,而如果能够类似于JAXB2,将XML映射成为Javascript对象,那么,使用Javascript来处理XML将更为便捷。经过研究,这完全是可行的,而且会潜在的带来很多的优点。

以一个例子来表述:

 

<?xml version="1.0" encoding="UTF-8"?>

<PollDefinition xmlns="http://www.macaufly.com/web">

 

    <id>10</id>

    <name>Favorate Programming Language</name>

    <description>What is your favorate programming language,

    VB/Delphi/C++/C#/PHP/Java?

    </description>

   

    <options>

       <option>

           <name>VB</name>

           <label>Visual Basic</label>

           <description>Microsoft Visual Basic

           </description>

       </option>

       <option>

           <name>JAVA</name>

           <label>Java</label>

           <description>Java

           </description>

       </option>

      

    </options>

 

</PollDefinition>

这段XML完全可以映射成为如下的Javascript对象(而且符合JSON规范):

{ pollDefintion:

    {

       $xmlns: "http://www.macaufly.com/web",

       id: 10,

       name: "Favorate Programing Language";

       description: "What is your favorate programming language,VB/Delphi/C++/C#/PHP/Java?";

       options: {

           option : [

              {   name: "VB",

                  label: "Visual Basic",

                  description: "Microsoft Visual Basic"

              }

              {   name: "JAVA",

                  label: "Java",

                  description: "Java"

              }

           ]

       }

    }

}

映射规则如下:

<name>text</name>

name: “text” or

name: number  // (如果text是数字的话)

<option>

   <name>VB</name>

   <label>Visual Basic</label>

</option>

option: {

   name: “VB”,

   label: “Visual Basic”

}

<option id=”10”></option>

option: {

   $id: 10    // 属性被编译为 $打头

}

<option id=”10”>text value</option>

option: {

   $id: 10,

   $$text: “text value” // text 节点编译成为 $$text

}

<options>

  <option></option>

  <option></option>

</options>

options: [

  __innertag: “option”; // 表示这包含一个内部类型。

  { option1 },

  { option2 }

]

// 当外部标记 = 内部标记+s 并且,内部标记中都包含相同类型时,进行自动的简化。

<name>name</name>

<option>option1</option>

</option>option2</option>

name: “name”,

option: [ “option1”, “option2”]

采用了如上的映射规则时,我们实现一种双向的映射,即实现从Javascript表示映射到等效的XML,或从XML映射成为Javascript

通过这种双向的映射,我们可以建立这样的一种通信技术:

l          Server端使用JAXB2来映射XML,商业逻辑处理类直接面向POJO,而无需关心XML

l          服务器端通信桥(servlet)负责把POJO转换成为XML,并返回给浏览器

l          浏览器端的Ajax引擎负责把XML编译成为Javascript,供后续的代码进行处理。

l          浏览器向Ajax引擎发送Javascript对象请求,Ajax引擎负责把其转换成为XML,并发送给服务器

l          服务器接Ajax桥接收到XML请求,使用JAXB2将其自动转换成为POJO,并调用商业逻辑的代码

 

通过这样的一种模式,我们使用了XML作为数据交换的标准,但在浏览器端和服务器端都使用了XML-对象映射的技术,使得两端开发的代码亮都最小化。

 

相关的代码开发:

l          function JSON2XML(json) // javascript方法,实现将json对象转换成为XML

l          function XML2JSON(xml) // javascript方法,实现将XML转换成为json对象。

l          function JSON2String(json) // json 对象转换成为 json 文本

准备相关的单元测试代码

 

2、   客户端模板处理技术(待续,在下一个blog中)

 

2005-08-05

Graphviz: the DOT language

一个简单的graph描述文件,可以用文本来描述类似于VISIO的东西,要是有一个对应的编辑器就更好了。

www.graphviz.org 可以在javadoc中嵌入我们的一些示意图片。

2005-08-01

属性关联与可视化开发

在进行可视化开发时,为了提供良好的交互能力,常常需要使用脚本、或者事件处理来进行定制。但这样实际上会构成一个矛盾:可视化设计的目的是让UI更为直观、简洁,避免更多的代码开发,而且也可以降低对技术人员的技术要求。更少的代码开发同时也意味着更好的维护性。

一种很常见的场景是:某一个组件的一些属性是根据其他组件的属性相关联的,例如,根据某个条件,隐藏某个显示等。向这样的一种情况,如果采用申明的方式,则可以大大的简化对脚本的开发工作。

<comp1 enable="$(comp2.enable)/>
这样当comp2的enable属性发生变化时,comp1也会自动地跟着变化。

如果跟XML结合起来,可以让一个组件的属性跟XML的xpath属性发生关联,当xml.xpath的值发生变化时,自动更新属性。一个潜在的技术问题 是:如果高效的处理这种变化呢?最好的还是通过事件处理的方式来进行,可以让Document支持对xpath的属性跟踪。

但是在基于JavaScript的浏览器中,要实现这些还是有些复杂的。
json = // represents xml as json objects
当 json 对象中的值发生变化时,如何自动捕获,从而产生事件呢?这个可以借助于object.watch方法。当object中的某个属性发生变化时,它会产生一个notify事件。