现在更多的网站制作采用一种 MVC 模式,也就是将网站制作工作分工,分别为M(Model, 模型),V(View 视图),C(Controller
控制器).
C(Controller 控制器). 在视图和模型之间传递控制,并根据要求调用相应的视图显示模型返回的数据,主要负责调度工作。
这种职责的分工到底有什么好处呢,它简化了软件开发过程中所有相关人员的工作,
使得不同的部分的修改通常不会影响的其他部分的工作,比如,我修改了后台某些程序的算法,并不影响前台的页面显示,前台页面修改不影响后台程序的开发。这种分工合作比起
jsp 混淆代码逻辑和显示层的做法要好的多。
所以越来越多的国外程序员在不断提出替代 jsp 的方案,在众多方案中, 一种基于 java 模板引擎的技术脱颖而出,最为著名的是 Velocity 和
Webmacro 两种模板技术。
模板引擎的设计思想最早是有 webmacro 提出的, 后来应用在一个著名的搜索引擎 www.altavista.com
上, 这种思想渐渐被 Apache
开发小组所采用,并作为一个子项目被提出来,这就是现在的 Velocity。模板引擎与MVC中视图这一部分的关系更为密切。它是经常作为一种 jsp
的替代技术出现在国外的一些论坛上的。但是 Velocity 可以应用在任何需要格式化数据显示的 java 程序中。
那么 Velocity 到底是什么呢?它的官方解释是:
"Velocity 是一种基于 java
的模板引擎,它允许任何人使用简单而强大的模板语言来引用定义在 java 代码中的对象"
你可能因为下面几种原因而使用
Velocity:
1:它很容易集成在各种各样的程序领域中。
2:它为网页制作人员提供了一种清晰而又简单的语法
3:因为模板和代码是分离的,所以你可以分别独立的开发和维护它们。
4:Velocity
引擎可以很容易的集成到一些 Java 运行环境,特别是 Servlet.
5:Velocity 使得模板可以访问任何环境对象中的共有方法。
Velocity 的强大之处在于它严格的区分程序开发功能的职责划分。
它限制模板可能访问的对象(也就是后台程序允许它得到的对象)来实现这一点。这意味着,网页设计人员可以只把精力放在数据的显示部分(View
视图)而程序员则只要关注如何写好程序的控制层(Controller,控制器)和商业逻辑和数据管理(模型 Model), 这就是 MVC 开发模式。MVC
现在已经是广泛接受的一种开发模式,它简化了开发和日益复杂的应用和维护工作。
Velocity 最擅长做哪些方面的工作呢?
1: 基于 servlet 的网站制作
2: Java 和 Sql
代码生成
3: XML 处理和转换
4: 文字处理,比如生成 TRF 文件。
不过 Velocity 用的最多的还是在基于 Java servlet 的网页程序中作生成网页的引擎,以替代 JSP 等技术。 除了比较容易使用外,
它提供了强大的模板语言以显示和操作数据,但是不是生成数据,这点很重要, 因为这个工作应该是程序逻辑的部分。 Velocity 非常适合在 J2EE (Java
2 Platform, Enterprise Edition) 的网站开发中充当替代 jsp 做输出页面的技术工作,虽然 JSP 包含在 j2ee
的规范中,其实 j2ee 本身并不需要 jsp .
Velocity 是如何工作的呢? 虽然大多 Velocity 的应用都是基于 Servlet
的网页制作。但是为了说明 Velocity 的使用,我决定采用更通用的 Java application 来说明它的工作原理。
似乎所有语言教学的开头都是采用 HelloWorld 来作为第一个程序的示例。这里也不例外。
任何 Velocity 的应用都包括两个方面:
第一是: 模板制作,在我们这个例子中就是
hellosite.vm:
它的内容如下(虽然不是以 HTML 为主,但是这很容易改成一个 html 的页面)
Hello $name! Welcome to $site world!
第二是 Java 程序部分:
下面是 Java 代码
import java.io.StringWriter;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;public class HelloWorld
{
public static void main( String[] args )
throws Exception
{
/* first, get and initialize an engine */
VelocityEngine ve = new VelocityEngine();
ve.init();
/* next, get the Template */
Template t = ve.getTemplate( "hellosite.vm" );
/* create a context and add data */
VelocityContext context = new VelocityContext();
context.put("name", "Eiffel Qiu");
context.put("site", "http://www.eiffelqiu.com");
/* now render the template into a StringWriter */
StringWriter writer = new StringWriter();
t.merge( context, writer );
/* show the World */
System.out.println( writer.toString() );
}
}
将两个文件放在同一个目录下,编译运行,结果是:
Hello Eiffel Qiu! Welcome to http://www.eiffelqiu.com
world
为了保证运行顺利,请从 Velocity 的网站 http://jakarta.apache.org/velocity/
上下载 Velocity 的运行包,将其中的 Velocity Jar 包的路径放在系统的 Classpath 中,这样就可以编译和运行以上的程序了。
这个程序很简单,但是它能让你清楚的了解 Velocity 的基本工作原理。程序中其他部分基本上很固定,最主要的部分在以下代码
这里 Velocity 获取模板文件,得到模板引用
/* next, get the Template */
Template t = ve.getTemplate( "hellosite.vm" );
这里,初始化环境,并将数据放入环境
/* create a context and add data */VelocityContext context = new VelocityContext();
context.put("name", "Eiffel Qiu");
context.put("site", "http://www.eiffelqiu.com");
其他代码比较固定,但是也非常重要,但是对于每个应用来说写法都很相同:
这是初始化 Velocity 模板引擎
/* first, get and initialize an engine */VelocityEngine ve = new VelocityEngine();
ve.init();
这是用来将环境变量和输出部分结合。
StringWriter writer = new StringWriter();
t.merge( context, writer );
/* show the World */
System.out.println( writer.toString() );
记住,这在将来的 servlet 应用中会有所区别,因为网页输出并不和命令行输出相同,如果用于网页输出,将并不通过 System.out
输出。这会在以后的教程中给大家解释的。
那让我来总结一下 Velocity 真正的工作原理
:
Velocity 解决了如何在 Servlet 和
网页之间传递数据的问题,当然这种传输数据的机制是在 MVC 模式上进行的,也就是View 和 Modle , Controller
之间相互独立工作,一方的修改不影响其他方变动,他们之间是通过环境变量(Context)来实现的,当然双方网页制作一方和后台程序一方要相互约定好对所传递变量的命名约定,比如上个程序例子中的
site, name 变量,它们在网页上就是 $name ,$site 。 这样只要双方约定好了变量名字,那么双方就可以独立工作了。
无论页面如何变化,只要变量名不变,那么后台程序就无需改动,前台网页也可以任意由网页制作人员修改。这就是 Velocity 的工作原理。
你会发现简单变量名通常无法满足网页制作显示数据的需要,比如我们经常会循环显示一些数据集,或者是根据一些数据的值来决定如何显示下一步的数据,
Velocity 同样提供了循环,判断的简单语法以满足网页制作的需要。Velocity
提供了一个简单的模板语言以供前端网页制作人员使用,这个模板语言足够简单(大部分懂得 javascript 的人就可以很快掌握,其实它比 javascript
要简单的多),当然这种简单是刻意的,因为它不需要它什么都能做, View 层其实不应该包含更多的逻辑,Velocity
的简单模板语法可以满足你所有对页面显示逻辑的需要,这通常已经足够了,这里不会发生象 jsp 那样因为一个无限循环语句而毁掉系统的情况,jsp
能做很多事情,Sun 在制定 Jsp 1.0 标准的时候,没有及时的限定程序员在 jsp 插入代码逻辑,使得早期的jsp 代码更象是 php
代码,它虽然强大,但是对显示层逻辑来说,并不必要,而且会使 MVC 三层的逻辑结构发生混淆。
相关推荐
stm32+esp8266+mqtt/onenet智能家居
Android开发不用存储权限进行拍照,得到拍照后的图片效果。有一点难度,关键是存储路径的定义。
j
反向Lora提高画面细节。
小秘书(凤凰电话管理系统)【纽曼声卡版小秘书】,主要用来做为来电自动录音功能。
基于SpringBoot的疫情居家检测管理系统,系统包含三种角色:管理员、用户、医生,主要功能如下。 【用户功能】 1. 首页:获取系统信息。 2. 论坛:参与居民讨论和分享信息。 3. 公告:查看社区发布的各类公告。 4. 医保信息:了解医疗保障相关信息。 5. 个人中心:管理个人信息,查看预约和就诊历史。 【管理员功能】 1. 首页:查看系统整体。 2. 个人中心:管理管理员的个人信息。 3. 管理员管理:维护系统管理员的账户信息。 4. 医生管理:添加、编辑和删除医生信息。 5. 用户管理:查看和管理系统用户的信息。 6. 预约管理:审核和管理用户对医生的预约服务。 7. 就诊历史管理:查看和管理用户的就诊历史记录。 8. 健康信息管理:记录和查看用户的健康信息。 9. 药品管理:管理系统内的药品种类。 10. 药品入库管理:记录和管理药品的入库情况。 11. 药品使用管理:记录和管理药品的使用情况。 12. 医保信息管理:管理医保相关信息。 13. 论坛管理:审核和回复用户在论坛上的帖子。 14. 公告管理:发布、编辑和管理公告信息。 15. 基础数据管理:管理系统的基础数据。 16. 轮播图信息:管理系统首页的轮播图展示。 【医生功能】 1. 首页:查看医生个人信息。 2. 个人中心:管理医生的个人信息。 3. 预约管理:查看和管理用户对医生的预约服务。 4. 就诊历史管理:查看和管理用户的就诊历史记录。 5. 健康信息管理:记录和查看用户的健康信息。 6. 药品管理:管理系统内的药品种类。 7. 药品入库管理:记录和管理药品的入库情况。 8. 药品使用管理:记录和管理药品的使用情况。 9. 医保信息管理:管理医保相关信息。 10. 论坛管理:审核和回复用户在论坛上的帖子。 11. 公告管理:发布、编辑和管理公告信息。 12. 轮播图信息:管理系统首页的轮播
基于python的Opencv项目实战.zip
鸿蒙开发画廊效果功能,中间大,两边小的浏览效果,难度不小,进行了一定的封装。很好看的画廊效果
win32汇编环境,网络编程入门之十九
linux
【HD-RK3576-PI】定制用户升级固件
内容概要:本文是关于大规模L1正则化线性分类优化方法和软件比较的补充材料,由台湾大学计算机科学系的研究团队撰写。文章详细介绍了GLMNET算法的核心公式推导及其具体实现步骤,包括如何计算L¯j(0; X˜),以及如何维护关键变量以减少计算量。此外,文中对比了多种求解器(如CDN、IPM、TRON等)在不同数据集上的性能,涵盖达到特定停止准则所需时间、迭代次数及每次迭代的平均成本。研究结果显示,在大多数数据集上,CDN方法表现最优,但在极严格的条件下,IPM方法表现更好。对于L1和L2正则化的逻辑回归,文中指出L1正则化在某些数据类型上可能提供更好的准确性,但训练时间较长,因此推荐先尝试L2正则化用于分类任务,而L1正则化更适合特征选择。 适合人群:对机器学习算法尤其是正则化技术有一定了解的数据科学家和研究人员。 使用场景及目标:①需要进行大规模线性分类问题的优化;②比较不同优化方法和工具包在实际应用中的效果;③理解L1和L2正则化在逻辑回归中的区别及其适用情况。 其他说明:本文提供了详细的数学推导和实验结果分析,有助于深入理解各种优化方法的工作原理及其优劣。读者可以通过这些内容选择最适合自身需求的算法和工具包。
西电A测或通院微控温度仿真控制系统的proteus文件
华为ONT使能2.0工具
basalt_top
无极调速数控车床主轴箱装配CAD图.rar
乳液涂料生产流程图.rar
训练集数据
674322 Docker基础与实战.pdf
覆盖到自己的WTF→Account→战网名→SavedVariables,游戏内打开NDUI设置,左边配置,选择第2行共用配置