论坛首页 Web前端技术论坛

在服务器端动态生成javascript代码?

浏览 8355 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-06-17  
前段日子,搜索网络的时候,看到一个blog里,作者写了个xstream的自定以writer,能够让xstream不生成xml,而是生成javascript代码。

http://www.jroller.org/page/mrdon/20050103#java_to_javascript_serialization

I wrote JavascriptWriter which receives the serialization node events from XStream and instead of writing XML, it writes out Javascript code. Since it uses XStream, it can handle any Java object with no mappings necessary and even can handle objects of indefinite size due to its streaming orientation. Given two classes in a test driver class:

    public static class Employee {
        private String name;
        public Department department = new Department("Accounting");;
        public Employee(String name); {this.name = name;}
            
    }
    
    public static class Department {
        private String name;
        public Department(String name); {this.name = name;}
    }

This is the Javascript output using JavascriptWriter of a serialized instance of Employee:

var employee={};
employee["name"]="Bob";
var v1={};
employee.department=v1;
v1["name"]="Accounting";


当时很受启发,觉得何必多次一举生成xml让js再去想办法装配成对象,不如直接给你准备好,可是遍寻作者的代码不着,于是想自己写一个。
这才发现在xstream的writer基础上写js的生成器简直就是舍近求远,干脆,直接根据方法的返回值直接反射,用beanutils得到BeanMap然后再映射成js就简单多了。
然后,通过xmlhttp也好,通过iframe也好,或者直接输出到html也好,反正,有了js,你只要能执行js的eval就能得到远程方法的返回值结构了。
举一反三,这个应该还能生成Php,perl等其他支持动态解析语言的版本。

不知道这种方式有没有什么局限?
虽然说好像抛弃了xml感觉不太正统,却绝对不是那种把脏活累活推给界面层的做法。界面层程序员只要了解每个方法的签名和返回值的对象结构就能直接操作远程服务了。

而且这种发式其实也不局限于ajax,一些跨语言的交互方面也是能够适用的。
   发表时间:2005-06-17  
yufan_shi 写道
前段日子,搜索网络的时候,看到一个blog里,作者写了个xstream的自定以writer,能够让xstream不生成xml,而是生成javascript代码。

http://www.jroller.org/page/mrdon/20050103#java_to_javascript_serialization

I wrote JavascriptWriter which receives the serialization node events from XStream and instead of writing XML, it writes out Javascript code. Since it uses XStream, it can handle any Java object with no mappings necessary and even can handle objects of indefinite size due to its streaming orientation. Given two classes in a test driver class:

    public static class Employee {
        private String name;
        public Department department = new Department("Accounting");;
        public Employee(String name); {this.name = name;}
            
    }
    
    public static class Department {
        private String name;
        public Department(String name); {this.name = name;}
    }

This is the Javascript output using JavascriptWriter of a serialized instance of Employee:

var employee={};
employee["name"]="Bob";
var v1={};
employee.department=v1;
v1["name"]="Accounting";


当时很受启发,觉得何必多次一举生成xml让js再去想办法装配成对象,不如直接给你准备好,可是遍寻作者的代码不着,于是想自己写一个。
这才发现在xstream的writer基础上写js的生成器简直就是舍近求远,干脆,直接根据方法的返回值直接反射,用beanutils得到BeanMap然后再映射成js就简单多了。
然后,通过xmlhttp也好,通过iframe也好,或者直接输出到html也好,反正,有了js,你只要能执行js的eval就能得到远程方法的返回值结构了。
举一反三,这个应该还能生成Php,perl等其他支持动态解析语言的版本。

不知道这种方式有没有什么局限?
虽然说好像抛弃了xml感觉不太正统,却绝对不是那种把脏活累活推给界面层的做法。界面层程序员只要了解每个方法的签名和返回值的对象结构就能直接操作远程服务了。

而且这种发式其实也不局限于ajax,一些跨语言的交互方面也是能够适用的。

算找到知音了。我正做这事呢。有时间讨论讨论。
0 请登录后投票
   发表时间:2005-06-17  
http://xstream.codehaus.org/converters.html
自己写的话要重新写这些东西。
我觉得可以在xstream基础上做下去.
0 请登录后投票
   发表时间:2005-06-17  
zkj_beyond 写道
http://xstream.codehaus.org/converters.html
自己写的话要重新写这些东西。
我觉得可以在xstream基础上做下去.


不过,在xstream的基础上做得话,他的writer想个游标,只会前进,而且没有类型信息,让我头大不已。
我目前已经有一个简单版本的实现了。
能够把基本类型、基本型数组、数值型、map、list以及javabean转换成js。
不过代码还十分ugly,没有重构。
0 请登录后投票
   发表时间:2005-06-19  
目前要做个类似的东西:
一网站她的导航栏要能够动态更新,每个栏目的子栏目也要能够随意的修改增加
原本是想使用XML来存栏目的信息,但是这样做好象也不是很好做,今天看到了这个,才晓得啊 这些东西大家都为我们这些新人做好了  呵呵   将这些信息存到JS里是再方便不过了

一来少了对数据库的查询,要是不这么搞的话访问每个页面都要访问数据库
二来 要是使用XML存了相关信息,还要弄的每次更新该信息的时候要更新XML文件,而且对我来说将XML描述成首页也是个非常麻烦的事情,我想那样应该是很难做的有直接使用HTML效果好吧
好啊。。。。
要是哪儿有相关的中文介绍或简单的例子看看就好了..........

原来我把读写JS文件想的太复杂了,而你们说的这些我昨天是理解错了的,我本来是基本的文件操作都没有弄好
今天实现了把数据库的的栏目信息写到JS文件里了  呵呵
0 请登录后投票
   发表时间:2005-06-19  
建议你们看看json-rpc
0 请登录后投票
   发表时间:2005-06-19  
醒来 写道
建议你们看看json-rpc

我写的东西目前主要包含两个功能:
1、根据http的请求,自动调用某个javabean的方法,还能传参数和设置属性。
比如,http://localhost/someObject/someMethod?args_0=xxx&args_1=yyy&name=Yufan&user.gender=male
当然,这也没什么特别的,很多框架都是这么做的,有点类似zope的object publishing。其中someObject的定义可以用properties文件,就如buffalo那样的service定义文件,另外,也可以用spring作为bean的容器。
这部分是请求部分,因为是很平常的http请求(GET/POST),所以并不局限在xmlhttp里使用,也可以在任何支持发起http请求的语言里使用,一般大部分语言都是支持的。
2、上面是请求部分,然后就是如何返回结果了,一般的做法就是返回字符串,让客户端去处理,包括xml其实也是这样的。这无疑增加了客户端程序员的负担,如果有一种方式能够动态将Java的对象映射到该语言的结构就简单多了,当然这一部分一定要是动态的,而不是说要根据不同的返回结果写不同的模版,那就没有任何意义了。其实这一部分也是比较简单的,很多表现层所使用的语言都是动态解析型的,不用预先编译,包括js,php,perl等。而且,返回值都是数据,没有方法,我们也不期望能够在客户端得到一个包含逻辑的对象。所一,我写了一个接口,允许根据客户端的请求的返回方式,分别返回javascript,php,perl等版本的能再造返回值数据结构的代码。然后客户端就能动态的解析这些代码,再造对象,利用这些数据进行客户端的操作。
当然,这只是个接口,我们也能使用xstream或者其他的xml序列化方式,生成xml格式的数据,传输给客户端使用。另外,你也可以写自定义格式的实现。并不局限于动态代码的生成。
0 请登录后投票
论坛首页 Web前端技术版

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