论坛首页 Java企业应用论坛

新一代的Web表现层开发方法(欢迎讨论)

浏览 16645 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-16  

    目前基于javaweb开发框架数不胜数,而且其核心的功能都集中在web表现层的开发上,在这里我不打算对这些框架进行详细的分析和评论(因为针对这些框架的评论文章已经很多了),而是从另外一个角度提出一个新的Web表现层开发方法。

Web开发的大都有这样的体会,页面与逻辑总是纠缠不清,没有一个清楚地界限。有一些开发方法虽然可以将程序逻辑与网页分离开来,但是却带来的另外的复杂性,不是需要借助特定的tag,就是需要创建附加的模板文件,目前还没有一种框架(我所见到的,也许已经有了),能够真正实现页面与程序逻辑的完全分类,只是将这种关系转移了而已。

我所要描述的这种新的Web表现层开发方法的灵感来自于ORM技术。对象/关系映射技术将java对象映射至数据库,由ORM框架自动完成数据的crud操作。同样的,我们也可以将java对象映射至html文档,由框架来完成html文档的填充,开发人员只需要操作普通的java对象,即可实现以前由脚本或者模版完成的工作。我将这种技术称为odm(对象/文档映射)。之所以称之为odm而不是ohm(对象/html映射),是因为这种技术还可以应用于更广泛的场景,比如,java对象到xml的映射,到wml的映射等。大家可能会认为这并不是真正的新的技术,其实很多使用taglib和模版的框架中都在使用这样的方法。但是我所要描述的方法与这些方法在实现上很大的不同,主要在以下几个方面:

1 Java对象属性与html文档中的节点通过java对象属性名和html中节点的ID属性对应.

  使用这种方法保证了这种新的web开发方法不需要创建额外的模版,也不需要定义特定的taglib,最为主要的是将java对象,javascript脚本,css这几方统一命名,使得web开发的这几方面实现有机的统一,也使得这3个方面的相互操作成为可能。

2 程序开发人员所操作的只有java对象,没有任何的关于显示的循环、判断逻辑等。 

3 开发人员与美工完全可以独立的、并行的工作,不会出现垮领域操作。

<o:p> </o:p>关于如何将java对象属性影射到html文档节点,这里面有一套完整但却不需要特别记忆的映射规则,以后再写。

这个框架完成后将具有以下主要特性:

1 基于POJO

2 事件驱动;

3 原生的AJAX;

4 容易与现有的基于POJO的持久化框架集成,且更方便。

5 真正的所见即所得的页面开发

6 搜索引擎友好

7 无需复杂的配置文件,甚至不需要配置文件即可工作;

8 支持组件式开发;

9 真正的代码与页面分离。

……

还有更多的特性,比如可以将java属性映射到cooki,或者session变量甚至application级变量等,可以最大限对的简化web开发中的方方面面,可以说这个框架在开发效率以及可维护性方面将超越目前的其他所有的框架(有点说大了~_~)

   系统中一个html页面,对应一个页面类,它们通过一个约定来对应,不需要配置。

整个系统的模型有点像Delphi,熟悉delphi的朋友可能比较熟悉,在开发delphi GUI程序时,一个窗口对应一个dfm文件,而代码则放在pas文件中,dfm文件中的内容描述了窗口的gui组件的位置、颜色等显示信息,pas文件中则是事件处理代码。在webpilot中,html页面文件相当于delphi中的dfm文件,页面java类相当于delphi中的pas文件,页面java类中的事件处理函数相当于delphipas文件中的事件处理过程。

    

今天就写这么多了,写的比较零散,请大家见谅。这个方法我已经考虑了两年多了,已经有一个完整的实现思路,也已经有一个可运行的实现。工作一直比较忙,工作也与java不沾边,而且发现现在变懒了(^_^)。不过我还是希望能够实现一个真正可用东西。

文笔不好,有些地方可能说的不太清楚,请原谅。有什么疑问请提出,欢迎大家讨论。

   发表时间:2007-01-16  
愿闻其详
0 请登录后投票
   发表时间:2007-01-16  
听起来是不错的主意,不过最好还是有例子展开一下
0 请登录后投票
   发表时间:2007-01-16  
对于一大堆的理论通常不感兴趣,我最喜欢看到实例,源代码后,再去看一下别人说得理论是否确实如此....
0 请登录后投票
   发表时间:2007-01-16  
我很少写Web页面, 不过在 URL 映射方面有些可能和楼主类似的想法, 比如用
/Book/byISBN/13-978-0201485677

代替
/showProducts.do?class=Book&qn=ISBN&qv=13-978-0201485677


/TShirt/bySize/XL

代替
/showProducts.do?class=TShirt&qn=size&qv=XL


这样就可以直接映射到处理类的方法上, 比如:
public class Product implements WebModel
{
  public WebModel create(Env env, WebPath path, WebParams params)
  {
     String type = path.head();
     return env.getFactory().create(type, params);
  }
}

public class Book extends Product
{
  public WebModel byISBN(Env env, WebPath path, WebParams params)
  {
     List<Book> books = env.getDAO().query(this.getClass(), 
                        "ISBN = ?", Integer.parseInt(path.head()));
     return books.size() > 0 ? books.iterator().next() : null;
  }
}

public class TShirt extends Product
{
  public WebModel bySize(Env env, WebPath path, WebParams params)
  {
     List<TShirt> shirts = env.getDAO().query(this.getClass(), 
                           "size = ?", path.head());
     return books.size() > 0 ? shirts.iterator().next() : null;
  }
}



好像现在的JE(JavaEye)就是类似的形式, 不知道是RoR的传统还是JE自创, 反正觉得这样会比Servlet传统的模式要好.


楼主说已经有可以实现的例子了, 希望能贴一些简单直观的片段出来看看.
0 请登录后投票
   发表时间:2007-01-16  
complystill 写道
好像现在的JE就是类似的形式, 不知道是RoR的传统还是JE自创, 反正觉得这样会比Servlet传统的模式要好.

楼主说已经有可以实现的例子了, 希望能贴一些简单直观的片段出来看看.


JE是啥...就这么两个字母,google都难...
0 请登录后投票
   发表时间:2007-01-16  
你说的这个我怎么感觉和基于组件编程有些象呢?比如普元EOS这样的东西,就是把一个对象实体映射到数据库、xml还有网页,只不过它用的是source code生成,而你现在用别的?

我觉得所有现在所谓的新开发方法,比如GWT,当然还有你提出的这个模型,都有一个问题,就是如何与现有的技术集成。你说所有的东东(除了美工)都在Java中写,那我要用一些第三方的Ajax库怎么办?比如我要用dhtmlXGrid和DWR,怎么办呢?当然,如果你足够牛,能在你的框架内提供所有第三方类库的替代品或以Java为表现形式的整合方式,那倒是可以考虑使用你的模型。

其实我一直在关注GWT类似的东西,很多人都说它好,从编程模型上看确实也挺新鲜的,但是我怎么把它和其他类库一起使用呢?这个是所有新编程模型都要面对的问题。

另外,还有一个恶心的遗留代码问题。你的新模型只能用来开发新程序,不能用来改善遗留系统,除非你提供一个从HTML到Java的转换工具(或类似的机制)。当然,用恶心的遗留代码来刁难新模型,本身就不是太应该的,哈哈。
0 请登录后投票
   发表时间:2007-01-16  
如果遗留系统都只能保留, 不知道现在还有多少人在写 COBOL ...

BTW. JE = JavaEye
0 请登录后投票
   发表时间:2007-01-16  
Book/byISBN/13-978-0201485677
这种方式也有一个缺陷,该参数key必须是双方协定好的!
0 请登录后投票
   发表时间:2007-01-16  
galaxystar 写道
Book/byISBN/13-978-0201485677
这种方式也有一个缺陷,该参数key必须是双方协定好的!

key是指哪一部分?
用参数的话就不需要协定了么?
0 请登录后投票
论坛首页 Java企业应用版

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