(从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开发世界里。目前比较流行的模板技术有:XSTL,Velocity,
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
|
分享到:
相关推荐
JSP元素中的Template data(HTML标签)直接传递到客户端,而JSP元素(如`<%...%>`,`<%=...%>`)由JSP引擎处理。JSP引擎会将这些元素转换为Servlet代码,并在服务器端执行。 总的来说,JSP结合了HTML的静态展示和...
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 属性( ...
JSP技术可以将Java代码和HTML代码混合在一起,方便开发者快速开发网页应用程序。 JSP结构 JSP文件由两部分组成:模板数据(Template Data)和JSP元素(JSP Elements)。模板数据是指JSP引擎不处理的部分,即标记...
JSP模板引擎则是JSP技术的一种扩展,它允许开发人员以更高效、灵活的方式处理JSP页面的生成。本项目是一个开源的JSP模板引擎,它的主要目标是简化JSP的使用,特别是对于生成非HTML格式的文件,如电子邮件、XML文档或...
JSP页面由两部分组成:模板数据(Template Data)和JSP元素。模板数据是指不被JSP引擎处理的部分,通常是HTML、CSS或JavaScript等静态内容,它们直接传递到客户端浏览器。而JSP元素则包括注释、指令、脚本元素和动作...
JSP(JavaServer Pages)是一种服务器端的动态网页技术,它允许开发者将HTML代码与Java代码结合起来,以实现更强大的功能。其中,JSP标签是JSP的重要组成部分,提供了丰富的功能,包括调用JavaBeans组件、处理用户...
File fileLoad = new File(request.getRealPath("") + "/shipment/template", fileName); ``` 3. **设置响应头长度**: - 获取文件大小,并将其设置为响应头的长度。 ```jsp long fileLength = fileLoad....
通过以上详细解析,我们可以看到,JSP教程中的新闻发布实现不仅涉及前端页面的设计与交互,还包括后台数据处理和模板引擎的应用,充分体现了JSP技术在构建动态网站中的灵活性和强大功能。这一系列文件的协作,共同...
### jsp动态生成html 3种方法 在Web开发领域,动态页面技术是十分重要的一个环节,其中JSP(Java Server Pages)作为一种广泛使用的服务器端脚本语言,它能够...选择合适的方法取决于具体项目的需求和技术栈的选择。
自定义JSP标签是JavaServer Pages (JSP) 技术的一个强大特性,它允许开发者扩展JSP语言,创建自己的可重用组件。这在构建大型Web应用程序时尤其有用,因为它提高了代码的可读性和可维护性。在JSP中,自定义标签的...
6. **JSP元素和Template Data**:JSP文件由两部分组成:JSP引擎处理的元素(如Java代码、指令和动作标签)和不处理的Template Data(如HTML、CSS和JavaScript)。Template Data直接传递给客户端,而JSP元素则在...
JSP标签库是JSP技术的一个重要组成部分,极大地提升了开发效率和代码可维护性。 **什么是自定义标签库(Tag Library)?** 自定义标签库(Tag Library,简称taglib)是JSP中用于扩展标准JSP标记功能的一种机制。...
在给定的“template-engine”项目中,我们可以看到它主要服务于代码生成,特别是针对Java类和JSP(JavaServer Pages)页面。接下来,我们将深入探讨模板引擎的基本概念、工作原理以及在Java开发中的应用。 **模板...
6. **模板引擎(Template Engine)**:虽然JSP自身具备模板功能,但现代Web开发中,人们更倾向于使用如FreeMarker、Velocity这样的模板引擎,它们提供了更强大和灵活的模板语法,有助于分离视图和逻辑。 7. **MVC...
在IT行业中,JSP页面静态化是一种常见的优化技术,它将动态生成的JSP页面转换为静态的HTML页面,以提高网站的加载速度和搜索引擎的友好性。以下是JSP页面静态化最常用的三种方法的详细解释: 1. 模板替换法 这种...
Tomcat是Apache的一个子项目,它是用于运行Java Servlets和JavaServer Pages(JSP)的服务器。Nginx是一个高性能的Web服务器和反向代理服务器,常用于处理静态内容的高并发场景。IIS(Internet Information Services...
JSP 语法是 JSP 的核心部分,包括 JSP 元素和 Template data 两类。JSP 元素是指将由 JSP 引擎直接处理的部分,这一部分必须符合 JSP 语法,否则会导致编译错误。 JSP 语法可以分为三种不同的类型:编译器指令、...
Jsp+Servlet+Druid+JDBC-Template+JQuery+Js +EL/JSTL+BeanUtils 服务器:Tomcat_8.5 数据库:MySQL_5 开发工具:IDEA或eclipse 项目修复bug 1、修复保存成功后提示信息乱码的问题 2、修复商品管理时产品图片不能...
5. **渲染模板**:使用Velocity的`Template`和`VelocityContext`对象,将数据合并到模板中,生成新的Word文档。 6. **保存或输出文件**:最后,将生成的Word文档保存到服务器磁盘或直接作为HTTP响应发送给客户端。 ...
JSP文件主要由两部分组成:Template Data(模板数据)和JSP元素。模板数据是JSP引擎不处理的部分,比如HTML标签和文本,这些内容会被直接传递到客户端浏览器。而JSP元素则是引擎处理的部分,包括编译器指令、脚本...