分离Web表示层的数据处理和展现逻辑是目前企业级的Web运用系统开拓中表现层组件开拓实现中的基本实现目标。为此,软件运用系统的设计和开拓实现职员必须要探求到一种能够减少软件开拓职员重复劳动的方法,让程序员将更多的精力放在业务逻辑以及其它更加具有创造力的事情上。
因此,读者在课程设计的项目开拓中,不应该在Web页面中涌现包含大量的做事器端脚本程序代码的Web页面状况,这样的Web运用系统在后期的系统掩护、升级中都会比较困难。
如下示图所示的程序代码示例是不良好的Web表示层程序实现的代码示例,由于不仅在Web页面(.jsp)中包含有大量的Java程序脚本的代码,而且在JSP页面中直接访问数据库(没有合理地进行分层设计)和运用System.out.print掌握台信息的输出语句(此语句只能将信息打印输出到做事器主机的系统掌握台上而不能输出到Web浏览器中,前端用户根本就无法浏览到干系的信息)。
希望读者在学习和阅读作者的《软件项目实训及课程设计辅导》系列文章的内容时,重点节制目前比较主流的分离Web表示层的数据处理和展现逻辑的技能实现方法——比如,采取CSS+Div分离Web表示层数据和表现、运用XML+XSLT技能彻底分离数据和样式、运用Velocity模板技能实现开拓职责分离,并能够在课程设计的项目开拓中运用作者在本系列文章中先容的各种方法。
当然,分离Web表示层的数据处理和展现逻辑目前实在有多种不同的实现办法,不仅仅局限于作者在上文中所提及和先容过的方法,比如同样很精良的 Freemarker 也得到了非常广泛的运用。因此,读者在项目开拓实现中该当要根据项目的详细须要和自己对详细技能实现的熟习程度合理地选用。
作者不才文中将为读者先容如何在J2EE 系统平台中的Web运用系统表示层开拓实现中运用Velocity模板技能。但作者考虑到Velocity模板技能以及随后几篇文章中将要先容的Struts和Struts2运用框架等技能在目前高校的教室传授教化中一样平常都不会涉及,因此部分读者可能在阅读本系列文章的内容时对Velocity模板技能和Struts2运用框架会觉得比较陌生,给读者的学习和理解会带来一定的难度。
作者建议读者在课程设计的项目开拓中能够运用Velocity模板技能,经由一段韶光的项目开拓和运用的实践,也就能够逐步地熟习和节制Velocity模板技能和Struts2运用框架等运用技能。
2、什么是J2EE 系统平台中的Velocity模板技能
Velocity是Apache 基金会的一个开源的模板引擎(Template Engine)项目,其初始开拓的紧张目标是分离 基于MVC 体系架构设计模式的运用系统的持久化层和业务层,但目前被广泛地运用于J2EE Web运用系统中的表示层组件开拓中。它能够许可Web开拓者在不该用传统的JSP页面的运用情形下,可以用 Velocity模板让HTML页面也能够具有动态内容的特性。
如下示图为Apache Velocity的官方网站页面中对Velocity模板干系技能特性和运用先容的笔墨局部截图。
读者可以从Velocity的官方网站高下载Velocity的系统运行包文件和技能参考文档等系统库和资料,然后再解包该系统库的运行包文件,请见下图所示的下载页面。
Velocity是一种基于Java系统平台的模板引擎,它许可软件运用系统的开拓职员利用大略而强大的模板措辞来引用哪些定义在Java程序代码中的工具。而且Velocity运器具有简洁的语法和采取类似脚本措辞的办法引用目标数据工具。
Velocity模板引擎本身不是采取标准的模型视图掌握器(MVC)体系构造设计,它只是Web运用系统中的"模型组件"和"视图组件"之间的桥梁。并为Web页面的前端开拓和制作职员供应了一种清晰而又大略的模板语法,而且模板和程序代码是分离的。
以是Web运用系统的开拓职员可以分别独立地开拓和掩护它们,Web前端开拓职员可以和后端Java 程序开拓职员同步开拓一个遵照 MVC体系架构的Web运用系统。而且目前的Velocity 模板引擎也很随意马虎能够集成到J2EE Web容器的运行环境中——如Servlet容器中,也很随意马虎能够与Struts运用框架和Struts2运用框架相互集成。
由于Velocity 模板引擎的强大之处在于它严格地区分Web运用系统项目开拓中的职员职责划分——页面开拓职员只须要把精力和关注点放在数据的显示功能实现部分,而Java程序员更多地只须要关注如何编程运用系统中的掌握层程序和商业业务逻辑、系统中数据库表中数据的访问掌握和管理等方面的功能实现。
Velocity 模板是一个目前比较盛行的JSP页面技能的替代物,并且能够实现把 Java 程序代码从Web页面等分离出来。
3、Velocity 模板措辞VTL
Velocity 模板利用的脚本措辞称为 Velocity 模板措辞(VTL,Velocity Template Language),但它和其它形式的脚本措辞(如JavaScript等)比较,Velocity 模板措辞的语法相对而言比较大略。
在Velocity 模板措辞中供应有变量定义、指令、注释、工具的引用和各种运算符、宏定义等,也还供应了许多的内置工具。比如下面的代码语句是设置变量someVarable的值为"Velocity":#set( $someVarable= "Velocity" )。
在上面的代码中读者可以看到很多以"#"和"$"字符开头的内容,这些都是 Velocity 模板措辞的语法。在 Velocity模板措辞中所有的关键字都因此"#"开头的,而所有的变量则因此"$"开头。Velocity 模板措辞的语法类似于 JSP 技能中的 JSTL(JSP标准的标签库)。
作者考虑到本文章的篇幅有限,在此文中不能详细地为读者先容Velocity 模板措辞的语法,读者有兴趣可以参考 和阅读Velocity 的官方文档,个中供应了Velocity 语法干系的详细内容。
4、Velocity模板系统库中的VelocityServlet组件类
虽然大多数基于Velocity模板的Java运用都是基于J2EE Servlet的Web运用系统,但实在Velocity模板是可以运用于J2SE的运用程序和J2EE Web运用程序的两种不同的开拓环境中。但作者在本文中紧张先容在J2EE Web运用程序的开拓环境中如何运用Velocity模板。
但由于Velocity模板只是一个模板引擎,读者如果须要在J2EE Web运用系统项目中运用Velocity模板,还须要在项目中添加一个HTTP框架以便能够处理HTTP要求(request)和转发(response)。
为此,在Velocity模板所供应的系统程序包中,供应有一个VelocityServlet组件类(org.apache.velocity.servlet.VelocityServlet),Web运用系统只须要继续并扩展它便可以很快地创建一个基于Velocity模板功能处理的Servlet程序,也便是通过继续VelocityServlet 组件类以产生出自己的Servlet组件。
由于Velocity 模板的系统库不断地在更新和升级,如果读者通过继续VelocityServlet 组件类以产生出自己的Servlet组件时涌现如下的提示信息:"the type VelocityServlet is deprecated",解释读者所下载的Velocity 模板系统库中已经将VelocityServlet升级更换为org.apache.velocity.tools.view.VelocityViewServlet类,读者只须要将VelocityServlet类修正为VelocityViewServlet类。
如下示图为Velocity官方网站页面中对新版本的Velocity 模板系统库中的VelocityViewServlet类的定义解释局部截图。
在自己派生出的Servlet组件中可以得到与HTTP要求干系的request、session与application等工具,从而也可以直接得到通过Servlet容器保存在这几个域工具中的值或者返回业务处理后的结果值。
因此,运用Velocity 模板技能可以分离Web运用系统中的业务处理逻辑和数据显示风格掌握逻辑。
5、在Web表示层开拓实现中运用Velocity模板的基本步骤
Velocity 的任何模板都可以被VelocityServlet利用、并且能够支配在做事器上,也相比拟较大略。只须要采取以下的开拓实现步骤:
(1)Web运用系统的开拓职员首先通过继续 org.apache.velocity.servlet.VelocityServlet 类(或者org.apache.velocity.tools.view.VelocityViewServlet类)并派生出自己的Servlet 程序类;
(2) 其次,在所派生出的Servlet 程序类中,重写并实现个中的一个handleRequest()方法,在 handleRequest() 的方法实现中,从文件或资源(如JAR文件)中取得模板文件并返回该模板;
如下示图为Velocity官方网站页面中对handleRequest()的方法定义及功能、返回参数的解释局部截图。
(3)末了,在重写的handleRequest() 的方法实现中,添加希望在模板中作为高下文属性利用的数据或Velocity工具,并且由VelocityServlet向浏览器相应输出——可以由它在向HttpServletResponse的OutputStream 流工具发送之前天生要相应输出的 HTML标签。
表示在Web表示层开拓实现中运用Velocity模板的基本步骤干系的程序代码示例如下,读者可以根据自己的运用项目的须要进行修正和扩展。
public class VelocityServletDemo extends VelocityViewServlet { @Override protected Template handleRequest(HttpServletRequest request, HttpServletResponse response, Context ctx) { / 在Context高下文环境容器工具实例中存放指定名称的变量值 / ctx.put("someVarableName","someVarableValue"); / 也可以在request域工具实例中存放指定名称的变量值 / request.setAttribute("someVarableName","someVarableValue"); … … 其它的程序代码,在此省略 … / 在业务处理完毕后再 forward转发到指定模板 / return getTemplate("myVelocityTemplate.html"); }}
Velocity 模板文件是文本格式的文件,并且它可以是HTML、XML等类型的文件(上面的程序代码示例中的模板文件名称为myVelocityTemplate.html)。但在模板文件中一样平常包括有如下几个不同部分的内容:
1)照原样合并的静态部分
2)将被要合并的数据替代的占位符
3)脚本措辞中的指示符和指令。
如下页面代码为上面程序代码中终极转发到的myVelocityTemplate.html模板文件代码示例,它与标准的HTML页面差别在于个中包含有黑体标识的数据获取表达式,如$userName、$userPassword等。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>一个大略的VelocityWeb运用页面</title></head><body> <center> <h2>下面为Servlet处理后的结果</h2></center> <table cellspacing="0" cellpadding="5" width="200" align="center"> <tr><td >用户名称</td><td >用户密码</td></tr> <tr><td>$userName</td><td>$userPassword</td></tr> </table></body></html>
其余,myVelocityTemplate.html页面为静态的HTML页面而不是动态的做事器真个JSP页面,因此页面的相应速率将会大大地提高,从而运用Velocity 模板技能的Web页面可以是非JSP类型的Web页面——达到"动态内容静态化"的运用效果。
6、如何在派生的Servlet程序中向相应输出的目标页面通报数据
J2EE Web运用系统的开拓职员只须要把数据放置到Velocity的高下文工具中(org.apache.velocity.context.Context),然后Velocity引擎利用Velocity高下文工具中的数据、并运用到模板文件中,末了按照模板文件的格式输出数据。在上面的示例代码中的如下语句则是在模板文件中得到保存在Velocity高下文工具中的指定名称的数据值,然后在表格行中显示。
<tr><td>$userName</td><td>$userPassword</td></tr>
7、与Velocity模板干系的两个主要的观点
(1)Velocity模板(Template类)
它是遵守Velocity VTL模板措辞的语法规则定义的一个文本格式的文件,该文件采取Velocity措辞定义模板文件。比如下面的程序示例代码是得到指定文件名称为VelocityTemplate.vm的模板文件,并指定所运用的编码格式为中文GB2312编码:
Template oneTemplateObject =oneVelocityObject.getTemplate("VelocityTemplate.vm","gb2312");
在默认的情形下,Velocity模板引擎的系统程序会在Web运用系统资源根路径下搜索.vm文件,以是开拓职员直接将.vm文件放在Web运用系统资源根路径下即可(当然,也可以通过配置velocity.properties文件中的配置项目来指定加载的路径)。
(2) Velocity高下文(VelocityContext类)
它是Velocity模板引擎系统的一个容器,用于保存干系的业务数据。开拓职员可以把Velocity模板高下文VelocityContext类看作是导入 Java 工具并在 Velocity 模板内部访问的一种方法。
比如下面的程序代码是创建一个VelocityContext类的工具,并在个中保存须要向Web表示层页面通报的参数——参数的名称为userName,而对应的参数值为"张三"。
VelocityContext oneContextObject = new VelocityContext();oneContextObject.put("userName", "张三");
因此,只须要通过创建 org.apache.velocity.context.Context 类型的工具实例就可以得到 Velocity 的高下文VelocityContext工具,然后利用高下文工具中的 put方法,把要导入到模板文件中的工具附加到高下文中。
当然,如果是采取继续VelocityViewServlet类而派生出自己的Servlet程序类,并在自己的Servlet程序类中重写handleRequest()方法的办法的程序中,不须要自行再创建出VelocityContext 类的工具实例,而直接应用handleRequest()方法中所携带的Context接口类型的工具实例(参看如下示例代码中的黑体标识的代码)。
protected Template handleRequest(HttpServletRequest request, HttpServletResponse response, Context ctx) { … … 其它的程序代码,在此省略 …}
运用XML+XSLT技能分离Web运用表示层数据和样式的实例
如何运用“XML+XSLT”技能分离Web表示层数据和样式
如何运用CSS+Div分离Web表示层数据处理逻辑和展现逻辑
如何精确运用Web MVC架构模式分离表示层和模型层耦合关系
如何运用策略设计模式分离JDBC数据库连接中的外部环境信息