`
k_lb
  • 浏览: 802230 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

Web页面技术综述(包括fastm)

阅读更多

Web页面技术综述(包括fastm

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

1.

Java Web Application中,页面生成部分是最繁琐、令人头痛的部分。

其它的层都可以很好的结构化,唯有页面生成部分的结构很散乱。

本文首先介绍并比较各种页面生成技术,然后具体介绍作者的一个把PHP 模板改进到Java的开源项目——fastm

我希望fastm能够帮助广大Java Web程序员从繁琐的页面开发工作中解脱出来。

2.页面生成技术综述

本文所指的页面是XMLHTMLWML等能在浏览器中显示的Web页面。

按照页面处理逻辑的位置划分,页面生成技术可以分为两大类:

1)一类是,页面本身包含逻辑(if, for, etc)。比如,JSP + TagLib, Velocity, XML + XSLT(处理逻辑在XSL文件中),Tapestry等。

这一类技术中,由于页面本身包含逻辑,页面组件的结构和可重用性都不是很好,无法使用“对象” 、“类”、“包”等面向对象的特性。

2)另一类是,页面本身不包含逻辑。比如EchoXMLCDOM + XPathEchoPHPJDynamicTe, fastm等。

这一类技术中,由于处理逻辑在Java Code里面,所以,Java程序的结构和可重用性能有多好,页面组件的结构和可重用性就能有多好。

下面分别讲解和比较这些页面生成技术:

2.1JSP + TagLib

JSP + TagLib Sun公司的页面生成技术规范。

优点:

权威,规范,使用者众多,第三方提供了大量的TagLib支持。

而且,JSP本质上是Servlet。其中的Java Code部分非常强大而且灵活,能够达到Java语言最大的灵活度。

TagLib能够达到一定程度上的页面元素重用。TagLib还能够在一定程度上,帮助驱逐JSP页面的Java Code“污染”部分。J

缺点:

JSP的缺点很明显。Java CodeHTML页面内容混杂在一起,这是让广大程序员最头疼的Java Code Pollution问题。即使用TagLib也不能完全解决这个问题。

而且,程序员和页面编辑人员无法在同一个文件上工作。每次页面编辑人员编好了HTML页面,程序员必须重新加入Java CodeTagLib

HTML页面一旦加入了Java CodeTagLib,就无法在页面编辑器(Dream Weaver, Front Page)中正确显示了。程序不跑起来,就无法看到JSP页面的页面结构、显示风格和内容。

关于效率,灵活性,结构性,可重用性,JSP + TagLib是一个两难的选择。

JSP中大量的使用TagLib,能够使得JSP的页面结构良好,更符合XML格式,而且能够重用一些页面元素。但TagLib的编译之后的代码庞大而杂乱,而且运行效率很低,严重影响响应速度。TabLib很不灵活,能完成的事情很有限。TabLib代码本身的可重用性受到TagSupport定义的限制,不是很好。TagLib的编写不是一件愉快的事情。J

如果在JSP中大量使用Java Code,那么页面的结构性会很差,难以管理。所有的代码都在同一个文件中,遇到大的HTML页面,简直如同噩梦一般。从一个左括号“{”找到对应的右括号“}”都变成很痛苦的一件事情。镶嵌在Java Code中间的HTML元素的是无法重用的。所以,除了Include file或者jsp:includeJSP中的Java Code根本就没有可重用性。

2.2Velocity

http://jakarta.apache.org/velocity/

Velocity是一种模板处理工具。Velocity模板由HTML中夹杂一些Velocity脚本语言或变量定义组成。

优点:

Velocity的脚本语言(以#开始)或变量定义(用$标志)和HTMLWMLXML等的元素定义不冲突。

简单的Velocity页面(不包含分支和循环逻辑)能够在页面编辑器(Dream Weaver, Front Page)中正确显示。

缺点:

同样,Velocity模板的页面处理逻辑和HTML元素混杂在一起。如果Velocity页面的逻辑复杂的话(比如有循环和判断分支),那么该Velocity页面同样不能在页面编辑器(Dream Weaver, Front Page)中正确显示。

遇到大的HTML页面,从一个 #if”找到对应的 #end”也是很痛苦的一件事情。镶嵌在Velocity脚本语言中间的HTML元素的是无法重用的。所以,Velocity模板中的脚本代码和HTML元素也不具有可重用性(include file除外)。

2.3XML + XSLT

http://cocoon.apache.org/

Cocoon项目采用XML + XSLT的方法。Java程序只需要输出XML数据,Cocoon框架调用XSL文件把XML数据转换成HTMLWML等文件。

优点:

程序员省事了,不用考虑页面结构和显示方式,只需要输出XML数据即可。

同一份XML数据,只要定义不同的XSL文件,就能够很方便地产生不同显示风格的页面。

在内容和显示风格分离的方面,XML + XSLT这种方法做得最好。

缺点:

慢。XSLT的速度比较慢。

由于没有HTML文件,根本看不到页面结构、显示风格和内容。只有程序跑起来,XSLT转换之后,才能

XSL语法比较难以掌握,由于没有“所见即所得”编辑工具,学习成本较高,远远高于HTML的学习成本。

2.4. Tapestry

http://jakarta.apache.org/tapestry/

Tapestry扩展了HTML元素的定义。Tapestry用这些扩展的HTML元素属性来表示处理逻辑(循环,分支等)、组件定义和变量定义。

优点:

整个Tapestry页面文件都是HTML元素,能够在页面编辑器(Dream Weaver, Front Page)中显示。但显示的样子是否正确,是另一回事,和包含的处理逻辑(循环,分支等)的复杂度相关。大致和Velocity的情况相似。

Tapestry的页面组件重用性比较高。

缺点:

复杂。Tapestry的定义和用法都很复杂。由于复杂,所以慢。

我没有实际使用Tapestry的具体经验,这里就不继续妄加评论了。J

2.5. XMLC

http://xmlc.enhydra.org/

XMLCHTMLWML等文件编译成一个DOM结构的Java类。程序员不用管页面,只需要操作这个DOM结构,就可以动态生成页面。

XMLC根据HTML元素的id定义,生成相应结点的操作方法。

优点:

页面是纯粹的HTML,没有任何逻辑。能够在页面编辑器(Dream Weaver, Front Page)中正确显示。

Java Code处理DOM结构,代码结构和可重用性良好。DOM节点即HTML元素,即页面组件,也具有很好的可重用性,你随时可以把一个DOM节点放到任何文档中的任何位置。

由于是静态编译,没有动态解析过程,文档生成的速度很快。

缺点:

每次修改HTML页面,必须重新把HTML文件编译成Java文件。而且,很多HTML都不是良好的XML结构,不能够正确地编译成DOM结构。

DOM结构不能在多线程环境中重复使用,这就意味着,每一个页面请求,都需要生成一个单独的DOM结构,占用内存空间比较大。而且,每个DOM结构使用过之后,也很难清空重置,很难提供给下一个请求使用。在HTML文件比较大的时候,内存的开销显著增大。

XMLC有些方面不够灵活。比如,我们知道,很多Java Scri<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><personname>pt</personname>方法定义在XML注释当中。比如:

<script language="">pt</st1:PersonName>" type="text/javascri<st1:PersonName>pt</st1:PersonName>"></p> <p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><!--</p> <p class="MsoNormal" style="MARGIN: 0in 0in 0pt">function aa{</p> <p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="mso-spacerun: yes">? </span>…</p> <p class="MsoNormal" style="MARGIN: 0in 0in 0pt">}</p> <p class="MsoNormal" style="MARGIN: 0in 0in 0pt">//--></p> <p class="MsoNormal" style="MARGIN: 0in 0in 0pt"></script>

如果Java Scri<personname>pt</personname>中有需要动态生成的部分,而注释部分的Java Scri<personname>pt</personname>不是XML结构,XMLC很难处理这种情况。

2.6DOM + XPath

前面讲了XMLCHTML静态编译成DOM结构。

我们也可以采用动态生成DOM结构的方法,然后用XPath定位DOM结点并操作它们。

NekoHTMLhttp://www.apache.org/~andyc/neko/doc/html/)是一个HTML文档解析工具。

NekoHTML使用Apache Xerceshttp://xml.apache.org/xerces2-j/index.html)的Xerces Native InterfaceHTML文档进行解析,能够自动补足并修正不符合XML文法的HTML元素,并生成HTML DOM文档树。

Apache XcerseXPathAPI,可以用XPath方便地定位DOM结构的结点。DOM + XPath的详细用法请参见NekoHTML的使用文档。

优点:

大致具有上述XMLC方法的优点。

没有静态编译过程,动态生成DOM结构,及时反映页面文件的变化。

缺点:

大致具有上述XMLC方法的缺点。

DOM结构的动态生成比较花时间。我们可以采用这样的方法解决这个问题,把第一个生成的DOM结构作为标准模板。我们不对标准模板操作,每次请求需要一个DOM结构的时候,我们就从这个标准模板深度拷贝(deep copy)一个新的DOM结构,然后使用这个新的DOM结构。这样每个HTML文件只需要解析一次,成为标准模板。每次HTML文件更改的时候(这种情况很少),标准模板也跟着更新。

XPath的解析和定位速度不是很快,几乎每次都要遍历整个文档树。

2.7Echo

http://sourceforge.net/projects/echo

Echo项目中不用定义模板文件。程序员按照Swing的方式写代码,Echo帮助你生成HTML结果。

优点:不用处理HTML部分。Swing是可重用性极好的真正组件。

缺点:EchoHTML屏蔽起来,自动生成了很多JavaScri<personname>pt</personname>HTML代码。对于Web程序来说,不够灵活,难以维护。

2.8. PHP

PHP模板的设计思路很好,PHP模板用XMLComment注释部分来定义动态结构,用{}来标志需要替换的变量部分。

优点:

页面编辑器(Dream Weaver, Front Page)不显示XMLComment注释部分,而且{}符号和XML元素定义不冲突。所以,PHP模板本身符合HTML语法,能在页面编辑器(Dream Weaver, Front Page)中正确显示。程序员和页面编辑人员可以在同一份页面文件上工作,所见即所得。

简单,易用,灵活(几乎和最灵活的JSP Java Code一样灵活)。具体用法见后面。本文的主要目的就是介绍PHP模板及其Java Port的用法。J

缺点:

比起其它的页面技术来说,这种技术的缺点很少。

一个需要提到的地方,也是Java Scri<personname>pt</personname>方法定义在XML注释当中的情况。比如:

<script language="">pt</st1:PersonName>" type="text/javascri<st1:PersonName>pt</st1:PersonName>"></p> <p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><!--</p> <p class="MsoNormal" style="MARGIN: 0in 0in 0pt">function aa{</p> <p class="MsoNormal" style="MARGIN: 0in 0in 0pt"><span style="mso-spacerun: yes">? </span>…</p> <p class="MsoNormal" style="MARGIN: 0in 0in 0pt">}</p> <p class="MsoNormal" style="MARGIN: 0in 0in 0pt">//--></p> <p class="MsoNormal" style="MARGIN: 0in 0in 0pt"></script>

因为PHP Template采用XML Comment来定义动态结构,所以我们不能在Java Scri<personname>pt</personname>中定义结构。但我们不需要在XML Comment中定义动态结构,我们可以用{}标志需要动态改变的地方,完全能够达到同样的目的。

2.9 JDynamiTe

https://sourceforge.net/projects/jdynamite

从各方面来说,我认为PHP是最好的页面生成技术。

我的一个同事向我介绍了PHP Template的定义和用法,我产生了浓厚的兴趣,并产生了把PHP Template移植到Java的想法。我首先到网上搜索了一下,发现了JDynamiTe (Java Dynamic Template) https://sourceforge.net/projects/jdynamite)开源项目。JDynamiTe能够把PHP模板移植到Java语言。

JDynamiTe的模板定义和PHP Template有些微小的差别,但一样简单。我阅读了JDynamiTe的例子代码,马上喜欢上了这种方法。

但我发现,JDynamiTe有一点不足。和DOM结构的处理过程一样,JDynamiTe的模板部分和参数设置部分是合在一起的。JDynamiTe的模板部分不能在多线程中同时使用。

每次JDynamiTe都需要读取并解析HTML文件,生成一个模板,设值之后,产生结果。处理过后的这个模板就不能再直接使用了(也许可以清空再使用)。

如果HTML文件很大,那么,读取并解析HTML文件要花费不少时间。

所以,我决定自己实现一个高效率的可重用的PHP Template Java Port

项目名为fastmFast Template的意思。)

2.10. fastm

http://sourceforge.net/projects/fastm

http://sourceforge.net/projects/lightweb

fastm的模板定义采用JDynamiTe的模板定义,而且我直接采用JDynamiTe的例子模板文件,作为fastm测试例子的模板文件。fastm可以说是JDynamiTe的一个Multiple Thread Port

fastm里,我把HTML的解析结果文档 Template DOM)和变量设值部分(ValueSet DOM)分开。

每个HTML文件只需要解析一次,生成一个只读的模板。既然只读,当然线程安全,任何数量的线程都可以同时使用这个模板。

以后这个模板只需要和不同的变量设值结合,就可以生成不同的结果。

模板的解析过程,采用按行读取处理的方式,解析的速度很快。

fastm的速度会比JSP + TagLib快。fastm的速度可能会比纯粹的JSP慢,也可能更快一些。JSP(即Servlet)把整个页面一行一行地写到Response里面,网络传输的效率不高(当然,也有可能用到HTTPResponsebuffer)。而fastm把整个页面或者整块页面,一次写到Response里面,网络底层协议尽可以优化分块,达到最好的网络传输效率。

fastm支持动态生成JavaScri<personname>pt</personname>。这是PHPJDynamiTe无能为力的地方。

fastm支持JavaScri<personname>pt</personname>的注释定义。比如,

// BEGIN DYNAMIC: special_code

…..

// END DYNAMIC: special_code

这一块将被标志为动态块。

fastm的页面定义完全仿照JDynamiTePHP页面定义。我的思路来源是PHP TemplateJDynamiTe。我自己原创的东西是fasm的实现,和使用方法。fastm的代码量很小,采用的技术也很简单,没有用任何第三方的软件,只用了JDK1.4本身的类。

fastmDOM & PHP思路上的又一次飞跃——Template DOM ValueSet DOM的分离。

在我目前所知的Java页面生成技术中,我相信,fastm从各方面来说,是最好的方法——快,易用,灵活,强大。我期望fastm这种页面生成方式,能够较好地解决页面生成技术这个令人头痛的问题,能够在全世界的程序员中流行起来。

分享到:
评论

相关推荐

    fastm

    这是一个开源的java技术,懂php的人知道php生成页面可以通过模版技术来实现,在java的web开发中,jsp,taglib,jstl等等都是动态的页面技术,因此有人就在开源社区写了个javaweb开发的模版工程,从此java web开发...

    fastm.jar

    fastm.jar fastm.jar

    lightweb-开源

    lightweb-轻量级Web框架一个非常简单,快速的Web框架,具有DispatchServlet,Action接口和Config Reading部分。 映射一个网址-&gt;一个动作实例。 lightweb非常适用于模板技术,例如Velocity,fastm。

    bbs论坛源码项目1.zip

    CWBBS的模板技术受启发于Fastm及国内外知名的模板系统,着重于CWBBS社区的应用,并且通过plugin的方式,可以对模板进行扩展。模板目前主要应用于CMS和博客的首页。 通用模板通常是将模板文件预先解析,并以树的形式...

    毕业设计基于STC12C5A、SIM800C、GPS的汽车防盗报警系统源码.zip

    STC12C5A通过GPS模块获取当前定位信息,如果车辆发生异常震动或车主打来电话(主动请求定位),将通过GSM发送一条定位短信到车主手机,车主点击链接默认打开网页版定位,如果有安装高德地图APP将在APP中打开并展示汽车当前位置 GPS模块可以使用多家的GPS模块,需要注意的是,当前程序对应的是GPS北斗双模芯片,故只解析 GNRMC数据,如果你使用GPS芯片则应改为GPRMC数据即可。 系统在初始化的时候会持续短鸣,每初始化成功一部分后将长鸣一声,如果持续短鸣很久(超过20分钟),建议通过串口助手查看系统输出的调试信息,系统串口默认输出从初始化开始的所有运行状态信息。 不过更建议你使用SIM868模块,集成GPS.GSM.GPRS,使用更加方便

    基于tensorflow2.x卷积神经网络字符型验证码识别.zip

    基于tensorflow2.x卷积神经网络字符型验证码识别 卷积神经网络(Convolutional Neural Networks, CNNs 或 ConvNets)是一类深度神经网络,特别擅长处理图像相关的机器学习和深度学习任务。它们的名称来源于网络中使用了一种叫做卷积的数学运算。以下是卷积神经网络的一些关键组件和特性: 卷积层(Convolutional Layer): 卷积层是CNN的核心组件。它们通过一组可学习的滤波器(或称为卷积核、卷积器)在输入图像(或上一层的输出特征图)上滑动来工作。 滤波器和图像之间的卷积操作生成输出特征图,该特征图反映了滤波器所捕捉的局部图像特性(如边缘、角点等)。 通过使用多个滤波器,卷积层可以提取输入图像中的多种特征。 激活函数(Activation Function): 在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持特征的空间层次结构。 常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。 全连接层(Fully Connected Layer): 在CNN的末端,通常会有几层全连接层(也称为密集层或线性层)。这些层中的每个神经元都与前一层的所有神经元连接。 全连接层通常用于对提取的特征进行分类或回归。 训练过程: CNN的训练过程与其他深度学习模型类似,通过反向传播算法和梯度下降(或其变种)来优化网络参数(如滤波器权重和偏置)。 训练数据通常被分为多个批次(mini-batches),并在每个批次上迭代更新网络参数。 应用: CNN在计算机视觉领域有着广泛的应用,包括图像分类、目标检测、图像分割、人脸识别等。 它们也已被扩展到处理其他类型的数据,如文本(通过卷积一维序列)和音频(通过卷积时间序列)。 随着深度学习技术的发展,卷积神经网络的结构和设计也在不断演变,出现了许多新的变体和改进,如残差网络(ResNet)、深度卷积生成对抗网络(DCGAN)等。

    【三维装箱】遗传和模拟退火算法求解三维装箱优化问题【含Matlab源码 031期】.zip

    【三维装箱】遗传和模拟退火算法求解三维装箱优化问题【含Matlab源码 031期】.zip

    自己编写的python 程序计算cpk/ppk

    cpk&ppk python 小程序,品友点评

    基于Springboot开发的分布式抽奖系统.zip

    基于springboot的java毕业&课程设计

    课设毕设基于SpringBoot+Vue的影城管理系统 LW+PPT+源码可运行.zip

    课设毕设基于SpringBoot+Vue的影城管理系统 LW+PPT+源码可运行.zip

    MC教育版(免登录版)

    MC教育版(免登录版)

    农作物叶片病害分类和分割数据集【数据集+标签】

    包含13993张数据和对应的13993张mask分割模版,数据集用不同目录保存,也可以用作分类数据集 类别包含:桃子、辣椒、覆盆子、大豆、南瓜、草莓

    基于vue+springboot二手交易网站.zip

    基于springboot的java毕业&课程设计

    【三维装箱】遗传算法求解三维装箱优化问题【含Matlab源码 3408期】.zip

    【三维装箱】遗传算法求解三维装箱优化问题【含Matlab源码 3408期】.zip

    基于javaspring 开发框架的培训教程 TP1.zip

    基于javaspring 开发框架的培训教程 TP1.zip

    信号和系统 MATLAB 代码:探索信号生成、系统建模、傅立叶分析、滤波器设计、采样和控制系统仿真.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    医院网上预约系统设计与开发/毕业设计

    医院网上预约系统设计与开发/毕业设计 JSP基于SSM网上医院预约挂号系统 科室信息: 科室id,科室名称,科室介绍,成立日期,负责人 医生信息: 医生工号,登录密码,所在科室,医生姓名,性别,医生照片,出生日期,医生职位,工作经验,联系方式,擅长,医生介绍 病人信息: 病人id,医生,病人姓名,性别,身份证号,联系电话,病人病例,登记时间 预约信息: 预约id,预约用户,预约医生,预约日期,时段,联系电话,下单时间,处理状态,医生回复 新闻信息: 新闻id,新闻标题,新闻图片,新闻内容,新闻日期,新闻来源 留言: 留言id,留言标题,留言内容,留言人,留言时间,管理回复,回复时间 用户: 用户名,登录密码,姓名,性别,出生日期,用户照片,联系电话,邮箱,家庭地址,注册时间

    企业数据治理之数据质量治理方案.pptx

    企业数据治理之数据质量治理方案

    MySQL8.4.0 LTS(mysql-8.4.0-10.fc38.x86-64.rpm-bundle.tar)

    MySQL8.4.0 LTS(mysql-8.4.0-10.fc38.x86_64.rpm-bundle.tar)适用于Linux Fedora 38 (x86, 64-bit)

    1659 jsp游乐园管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目源码

    一、源码特点 java 医疗数据管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了数据模型进行区块链设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用java语言开发。 二、功能介绍 如博客中介绍 三、注意事项 1、管理员账号:admin 密码:admin 数据库配置文件DBO.java ,权限包括管理员,用户 2、开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用java语言开发。 3、数据库文件名是jspyly 系统名称yly 4、地址:http://127.0.0.1:8080/yly/qt/index.jsp

Global site tag (gtag.js) - Google Analytics