`
longyw
  • 浏览: 5555 次
文章分类
社区版块
存档分类
最新评论

关于web开发的思考-java脚本代替spring

阅读更多
    从web后端编程的发展来看经历了几个阶段:
1 CGI编程
2 由于编写CGI不方便,所以形成了很多脚本的开发,例如asp/jsp/php
3 功能强化,形成asp+COM,jsp+bean
4 进一步升级采用框架,后台代码形成bean+配置(spring的核心)

    本人觉得更高级的阶段应该是抛弃spring,返朴归真,后台代码bean+java脚本。
spring的核心思想是在xml中配置url到bean的映射,再根据xml的配置生成java bean并调用。好处是实现所谓的控制反转(也叫依赖注入),配置编程。由此带来的问题是配置很随意,逻辑不好理解,生生把整体后端处理流程割成了小块,并隐藏了小块间的联系,对新人来说难以理解,对高手来说太零碎。特别是3.0之后的注释代替配置,虽然减少了xml的量,但对于读代码的人来说简直是灾难,简简单单的url映射,要翻遍所有的bean代码才知道在哪里映射!

    既然spring的核心就是通过反射从xml配置生成java类,达到配置灵活的特点,但配置文件中体现不出程序运行流程,java本身就是动态语言,为什么不直接使用java脚本来实现呢?
用java代码代替框架+xml,用java代码的解释执行代替spring这种过度设计的垃圾框架。而且可以将java代码类编译成class载入serverlet直接运行,速度更快。

    本人已经用这种方法实现了简单的web项目,深深感觉到spring这方面的愚蠢,是该抛弃的时候了!

if (url_key == "A_B")
{
    // 处理前
    Request request = new Request_A_B();   // Request是接口,Request_A_B是子类,类似Structs的Action
    request.process(url, pos);           // 通过反射对字段赋值

    // 处理中
    Handle handle = new Handle_A_B();      // Handle是接口,HandleAB是子类
    String s = handle.process(request);  // 输出后续的jsp文件名

    // 处理后
    Response response = new Response();   // 非特例
    response.process(s + ".jsp", handle); // 模板替换
    return response.ToHtml();
}
进一步
if (url_key.at(0) = 'A')
{
    // 处理前
    Request request = (Request)Class.forName("Request_" + url_key).newInstance();   // Request是接口,RequestAB是子类,类似Structs的Action
    request.process(url, pos);           // 通过反射对字段赋值

    // 处理中
    Handle handle = (Handle)Class.forName("Handle_" + url_key).newInstance();      // Handle是接口,HandleAB是子类
    String s = handle.process(request);  // 输出后续的jsp文件名

    // 处理后
    Response response = new Response();   // 非特例
    response.process(s + ".jsp", handle); // 模板替换
    return response.ToHtml();
}

下面是serverlet中调用脚本的代码,使用BeanShell(参考http://jiasudu.iteye.com/blog/105761)作为java脚本引擎。示例代码等本人有空会整理奉上。

import bsh.Interpreter;

    bsh.Interpreter i = new bsh.Interpreter();
    try
    {
        i.set("this", this.getServletContext());
        i.set("request", request);
        i.set("response", response);
        i.source("C:\\a.txt");
    }
    catch (EvalError e)
    {
        e.printStackTrace();
    }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics