`
yimlin
  • 浏览: 137306 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Template和JSP技术

阅读更多

(从csdn的blog上同步过来)
(本文发于java emag第一期)

关于 Template JSP 的起源还要追述到 Web 开发的远古年代,那个时候的人们用 CGI 来开发 web 应用,在一个 CGI 程序中写 HTML 标签。

在这之后世界开始朝不同的方向发展: sun 公司提供了类似于 CGI servlet 解决方案,但是无论是 CGI 还是 servlet 都面对同一个问题:在程序里写 html 标签,无论如何都不是一个明智的解决方案。于 sun 公司 1999年推出了JSP技术。 而在另一个世界里,以 PHP ASP 为代表的 scriptlet 页面脚本技术开始广泛应用。

不过即便如此,问题并没有结束,新的问题出现了:业务和 HTML 标签的混合,这个问题不仅导致页面结构的混乱,同时也使代码本身难以维护。

于是来自起源于 70 年代后期的 MVC 模式被引入开发。 MVC 的三个角色: Model ——包含除 UI 的数据和行为的所有数据和行为。 View 是表示 UI 中模型的显示。任何信息的变化都由 MVC 中的第三个成员来处理——控制器

在之后的应用中,出现了技术的第一次飞跃:前端的显示逻辑和后端的业务逻辑分离, COM 组件或 EJB CORBA 用于处理业务逻辑, ASP JSP 以及 PHP 被用于前端的显示。这个就是 Web 开发的 Model 1 阶段(页面控制器模式)。

不过这个开发模式有很多问题:

1.       页面中必须写入 Scriptlet 调用组件以获得所必需的数据。

2.       处理显示逻辑上 Scriptlet 代码和 HTML 代码混合交错。

3.       调试困难。 JSP 被编译成 servlet ,页面上的调试信息不足以定位错误。

这一切都是因为在 Model 1 中并没有分离视图和控制器。完全分离视图和控制器就成了必须。这就是 Model 2 。它把 Model 1 中未解决的问题——分离对组件(业务逻辑)的调用工作,把这部分工作移植到了控制器。现在似乎完美了,不过等等,原来的控制器从页面中分离后,页面所需的数据怎么获得,谁来处理页面显示逻辑?两个办法: 1. 继续利用 asp php 或者 jsp 等机制,不过由于它们是运行在 web 环境下的,他们所要显示的数据(后端逻辑产生的结果)就需要通过控制器放入 request 流中; 2. 使用新手法——模板技术,使用独立的模板技术由于脱离的 web 环境,会给开发测试带来相当的便利。至于页面所需数据传入一个 POJO 就行而不是 request 对象。

模板技术最先开始于 PHP 的世界,出现了 PHPLIB Template FastTemplate这两位英雄。不久模板技术就被引入到java web开发世界里。目前比较流行的模板技术有:XSTLVelocity JDynamiTe Tapestry等。另外因为JSP技术毕竟是目前标准,相当的系统还是利用JSP来完成页面显示逻辑部分,在Sun公司的JSTL外,各个第三方组织也纷纷推出了自己的Taglib,一个代表是struts tablib<!----><o:p></o:p>

<o:p> </o:p>

模板技术从本质上来讲,它是一个占位符动态替换技术。一个完整的模板技术需要四个元素: 0. 模板语言, 1. 包含模板语言的模板文件, 2. 拥有动态数据的数据对象, 3. 模板引擎。以下就具体讨论这四个元素。(在讨论过程中,我只列举了几个不同特点技术,其它技术或有雷同就不重复了)

模板语言包括:变量标识和表达式语句。根据表达式的控制力不同,可以分为强控制力模板语言和弱控制力模板语言。而根据模板语言与 HTML 的兼容性不同,又可以分为兼容性模板语言和非兼容性模板语言。

模板语言要处理三个要点:

1. 标量标记。把变量标识插入 html 的方法很多。其中一种是使用类似 html 的标签;另一种是使用特殊标识,如 Velocity 或者 JDynamiTe ;第三种是扩展 html 标签,如 tapestry 。采用何种方式有着很多考虑,一个比较常见的考虑是“所见即所得”的要求。

2. 条件控制。这是一个很棘手的问题。一个简单的例子是某物流陪送系统中,物品数低于一定值的要高亮显示。不过对于一个具体复杂显示逻辑的情况,条件控制似乎不可避免。当你把类似于 <IF condition=”$count < 40”><then><span class=”highlight”>count </span></then></IF> 引入,就象我们当初在 ASP PHP 中所做得一样,我们将不得不再一次面对 scriptlet 嵌入网页所遇到的问题。我相信你和我一样并不认为这是一个好得编写方式。实际上并非所有的模板技术都使用条件控制,很多已有的应用如 PHP 的以及我曾见过一个基于 ASP.NET 的应用,当然还有 Java JDynamiTe 。这样网页上没有任何逻辑,不过这样做的代价是把高亮显示的选择控制移交给编程代码。你必需做个选择。也许你也象我一样既不想在网页中使用条件控制,也不想在代码中写 html 标记,但是这个显示逻辑是无可逃避的(如果你不想被你的老板抄鱿鱼的话),一个可行的方法是用 CSS ,在编程代码中决定采用哪个 css 样式。特别是 CSS2 技术,其 selector 机制,可以根据 html 类型甚至是 element attributes apply 不同的样式。

3. 迭代(循环)。在网页上显示一个数据表单是一个很基本的要求,使用集合标签将不可避免,不过幸运的是,它通常很简单,而且够用。特别值得一提的是 PHP 的模板技术和 JDynamiTe 技术利用 html 的注释标签很简单的实现了它,又保持了“所见既所得”的特性。

下面是一些技术的比较:

Velocity

变量定义:用 $ 标志

表达式语句:以 # 开始

强控制语言:变量赋值: #set $this = "Velocity"

            外部引用: #include ( $1 )

            条件控制: #if …. #end

非兼容语言

JDynamiTe

变量定义:用 {} 包装

表达式语句:写在注释格式( <!--  à )中

弱控制语言

兼容语言

XSLT

变量定义: xml 标签

表达式: xsl 标签

强控制语言:外部引用: import include

            条件控制: if   choose…when…otherwise

非兼容语言

Tapestry

采用 component 的形式开发。

变量定义(组件定义):在 html 标签中加上 jwcid

表达式语句: ognl 规范

兼容语言

<o:p> </o:p>

模板文件指包含了模板语言的文本文件。

模板文件由于其模板语言的兼容性导致不同结果。与 HTML 兼容性的模板文件只是一个资源文件,其具有良好的复用性和维护性。例如 JDynamiTe 的模板文件不但可以在不同的项目中复用,甚至可以和 PHP 程序的模板文件互用。而如 velocity 的非兼容模板文件,由于其事实上是一个脚本程序,复用性和可维护性大大降低。

模板文件包含的是静态内容,那么其所需的动态数据就需要另外提供。根据提供数据方式的不同可以分为 3 种:

1.       Map :利用 key/value 来定位。这个是最常见的技术。如 velocity VelocityContext 就是包含了 map 对象。

Example.vm

Hello from $name in the $project project.

<o:p> </o:p>

Example.java

VelocityContext context = new VelocityContext();

context.put("name", "Velocity");

context.put("project", "<!----><st1:city w:st="on"><st1:place w:st="on">Jakarta</st1:place></st1:city>");

<o:p> </o:p>

2.       DOM :直接操作 DOM 数据对象,如 XSLT 利用 XPath 技术。

3.       POJO :直接利用反射取得 DTO 对象,利用 JavaBean 机制取得数据。如 Tapestry

模板引擎的工作分为三步:

1. 取得模板文件并确认其中的模板语言符合规范。

比如 velocity ,确定 #if 有对应得 #end 等。 Xml xslt 的模型中, xml 文件标签是否完整等。在完成这些工作后,模板引擎通常会把模板文件解析成一颗节点树(包含模板文件的静态内容节点和模板引擎所定义的特殊节点)。

2. 取得数据对象。

         该数据对象一般通过程序传递引用实现。现有的大量框架在程序底层完成,处理方式也各自不同,有两种技术分别为推技术和拉技术。推技术: controller 调用 set 方法把动态数据注入,模板引擎通过 get 方法获得,典型代表: Struts ;拉技术:模板引擎根据配置信息,找到与 view 对应的 model ,调用 model get 方法取得数据,典型代表: Tapestry

3. 合并模板文件(静态内容)和数据对象(动态内容),并生成最终页面。

         合并的机制一般如下,模板引擎遍历这颗节点树的每一个节点,并 render 该节点,遇到静态内容节点按正常输入,遇到特殊节点就从数据对象中去得对应值,并执行其表达式语句(如果有的话)。

以下详细说明:

Velocity

Template template = Velocity.getTemplate("test.wm");

Context context = new VelocityContext();

context.put("foo", "bar");

context.put("customer", new Customer());

template.merge(context, writer);

当调用 Velocity.getTemplate 方法时,将调用 ResourceManger 的对应方法。

ResourceManger 先查看该模板文件是否在 cache 中,如果没有就去获取,生成 resource 对象并调用 process() 方法,确定该模板是否有效,如果有效,则在内存中生成一个 Node 树。

当调用 template.merge() 时,遍历这颗 Node 树,并调用每个 Node render 方法。对于模板中的变量和对象 Node ,还将调用 execute() 方法,从 context 中取得 value

   注: ResourceManger runtime\resource 包下, Node runtime\parser\node 包下

Tapestry

Tapestry 比较麻烦,先介绍一下 http 请求的处理过程。

httprequest 请求到达时。该请求被 ApplicationServlet 捕获,随后 ApplicationServlet 通过 getEngine 取到对应的 Engine ,通过该 engine getService 拿到对应的 service ,调用其 service 方法执行 http 请求。

每个 service 通过 RequestCycle 对象的 getPage

分享到:
评论

相关推荐

    JSP2.0技术手册pdf(带示例源码).zip

    4-1 Elements 和 Template Data 4-2 批注(Comments) 4-3 Quoting 和 Escape 规则 4-4 Directives Elements 4-5 Scripting Elements 4-6 Action Elements 4-7 错误处理 第五章 隐含对象(Implicit Object) 5-1 属性( ...

    java开发的家居电子商城Jsp+Servlet+Druid+JDBC-Template+JQuery+Js +EL/JSTL

    Jsp+Servlet+Druid+JDBC-Template+JQuery+Js +EL/JSTL+BeanUtils 服务器:Tomcat_8.5 数据库:MySQL_5 开发工具:IDEA或eclipse 项目修复bug 1、修复保存成功后提示信息乱码的问题 2、修复商品管理时产品图片不能...

    困扰JSP的一些问题与解决方法

    实际上,由Sun发布的官方”应用开发模型”文档上说得更远: “JSP技术应该被视为标准,而servlets在多数情况下可视为一种补充。” ( Section 1.9, 1999/12/15听取意见版 )。 本文的目的在于听取对该申明的合理性的...

    ease template

    你用过Ease Template吗? ...就项目实施而言,在一些中型甚至大型的项目中,有效的将HTML(还有其他文本形式的表现层)和PHP代码分开... Ease Template 模板技术的基本概念就介绍到这里,请继续关注更加有趣的功能介绍。

    Java项目04-天天生鲜订菜管理系统云数据库&SpringTemplate;实现&Linux;演示.rar

    Java项目04-天天生鲜订菜管理系统阿里云mysql...实现并提供利用Xshell在Linux环境下答辩展示视频,这里提供源码和数据库sql备份文件及展示视频下载,另外后续还有java swing实现项目及html-js/jsp/css实现项目上线。

    Ext_3.2模板的使用示例

    本人觉得Ext.Template和Ext.XTemplate模板类非常类似.Net的母板页,或者非常类似于JSP技术中jstl标准标签和EL表达式功能;但是它是一个客户端的技术。 阅读目标:需要使用模板方式来开发web应用的人员。 前置条件:...

    jetty-springmvc-thymeleaf-template:使用嵌入 Jetty 并使用 Thymeleaf 作为视图技术的模板 Spring 应用程序

    Thymeleaf 用作视图技术,与使用带有嵌入式 Jetty 的 JSP 视图相比,大大简化了流程。 跑步 与 Maven mvn exec:java -Dexec.mainClass=ca.unx.template.Main 然后将浏览器指向 。 基本罐 默认包目标将在目标目录...

    JSP生成静态页实践及其设计思想[转]

    引子:我们以两个大型网站为例作比较:51job和智联招聘(先声明我不是为他们作广告,仅以他们为例作技术上的比较)51job采用的是比较“先进”的php技术,而智联用的是比较落后的asp.但我们可能会明显的感觉到51job的...

    基于java的敬老院运营管理系统设计与实现.doc

    本系统的开发采用现有成熟技术为参照,共享源码为模板,结合本敬老院运营管理系统 的实际需求进行分析和功能调整,探讨了利用JSP开发敬老院运营管理系统的过程。 关键词:敬老院;运营管理;系统 Nursing ...

    线上家居电子商城系统项目源码,可用作计算机毕业设计或课题作业,可实际运行

    线上家居电子商城系统源码,包含前后端代码与...Jsp+Servlet+Druid+JDBC-Template+JQuery+Js +EL/JSTL+BeanUtils 服务器:Tomcat_8.5 数据库:MySQL_5.6.46 开发工具:IDEA_2019.1.3 适用对象:计算机专业在校大学生

    spring mvc 3.2 参考文档

    您可以直接与基于呈现技术的模板 (如 JSP、 Velocity和 Freemarker )集成或直接生成 XML、 JSON、 Atom和许多其他类型的内容。模型map被转化为合适的格式,如JSP request attributes或是 Velocity template model。

    ReviewServlet

    此项目用于复习Servlet和jsp技术. Table of contents You can insert a table of contents using the marker [TOC]: [TOC] 说明 这个项目内容比较乱。复习的知识点有 cookie,session,Filter, Listener, 还有一些...

    ofbiz综合技术文档

    技术文档 5 第一部分、ofbiz表现 5 一、理解MVC模式 5 1、MVC理论描述 5 2、系统设计 6 3、OFBiz中MVC模式体现 7 二、JPublish合成表示层 8 1、经典的合成器--JPublish 8 2、template + script 9 3、JPublish和MVC 9...

    CMS轻量级系统

    view层:JSP 数据库:mysql、oracle等关系型数据库 前端 dom : Jquery 分页 : jquery.pagination UI管理 : common UI集成 : uiExtend 滚动条 : jquery.nicescroll.min.js 图表 : highcharts 3D...

    SpringMVC论坛演示系统Forum_J2EE

    (2) 超级用户授权论坛版块管理员;...二、使用技术:(1) Spring+SpringMVC+Hibernate整合框架;(2) HibernateTemplate模板;(3) DIV+CSS、HTML5、jquery;(4) JSTL、JSP tagment、分页组件; (5) Tomcat + MySQL。

    spring-boot-heroku-template:Heroku 的 Spring Boot - 模板

    技术栈构建工具数据库 网络JSP 测试 日志记录日志4j本地使用由于 Heroku 使用环境变量DATABASE_URL来指定其数据库连接,因此您需要自己在本地机器上指定它。 格式为: postgres://&lt;username&gt;:&lt;password&gt;@&lt;host&gt;:...

    Struts原理、开发及项目实施

    视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库: Html,Bean,Logic,Template等,这有利于分开表现逻辑和程序逻辑。 模型:模型以一个或多个java bean的形式存在。这些bean分为三类:...

    java 面试题 总结

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    超级有影响力霸气的Java面试题大全文档

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    ItCast-HeiMa-Travel

    技术选型 经典三层架构:web层 - service层 - dao层 1. web层 Servlet:前端控制程序 HTML:前端页面(前后端分离架构,不适用JSP) Filter:过滤器 BeanUtils:数据封装 Jackson:json 序列化工具,前后端数据通用...

Global site tag (gtag.js) - Google Analytics