- 浏览: 29342 次
- 性别:
- 来自: 二次元世界
文章分类
最新评论
在基于WEB的应用中,通常大多数情况下是在servlet里使用Velocity。在servlet里的Velocity基本应用是非常简单的,只需通过两个必要步骤就可以实现:
1. 继承org.apache.velocity.servlet.VelocityServlet抽象类:
public class SampleServlet extends VelocityServlet
2. 仅需实现VelocityServlet类的一个方法handleRequest():
public Template handleRequest(HttpServletRequest req, HttpServletResponse resp, Context context)
创建一个web工程,在webroot下建立templates文件夹以存放模板文件。
在src下建立velocity.properties配置文件,内容如下:
file.resource.loader.path = templates ##指定模板文件存放目录
runtime.log = log/velocity.log ##指定日志文件位置
关于Velocty中出现中文乱码问题,可以在velocity.properties文件中加入下面的三行就可以解决:
default.contentType=text/html; charset=UTF-8
input.encoding=UTF-8
output.encoding=UTF-8
在templates文件夹中建立名为sample.vm的模板,内容如下:
接着我们需要开发自己的Servlet,这个Servlet继承VelocityServlet。
然后在web.xml中配置这个Servlet,如下:
部署并启动工程,之后执行这个Servlet,浏览器便会显示使用vm模板展示的页面。
org.apache.velocity.servlet.VelocityServlet继承了HttpServlet,因此它继承了HttpSetvlet的对生命周期的管理,而且,只要我们在实现自己velocity servlet的时候,继承org.apache.velocity.servlet.VelocityServlet,然后继承它的一些重要的方法就可以完成实际的业务。
当web工程启动时,系统会先执行SampleServlet的父类VelocityServlet中的init()方法。
VelocityServlet源代码:
在执行VelocityServlet类的initVelocity方法时,因为SampleServlet类继承并重写了其中所调用的loadConfiguration方法,故系统会执行SampleServlet类的loadConfiguration方法。该过程获取了自行设置velocity日志文件的位置和自行设置模板的位置。
在这个过程中,Velocity会自行访问velocity.properties配置文件,以读取其中的信息。如果不配置该配置文件,或者不配置key为file.resource.loader.path的项,在执行Template outty = getTemplate("sample.vm");语句或Template outty = getTemplate("/templates/sample.vm");时,会发生无法找到模板的错误。
至此,Velocity在容器启动初始化完毕。
当在浏览器中输入http://localhost:8080/Mixele_Velocity/SampleServlet时,Velocity的处理过程为:
从执行SampleServlet父类VelocityServlet的doGet开始 --> doRequest --> createContext --> setContentType --> chooseCharacterEncoding --> handleRequest(SampleServlet继承) --> getTemplate(String name) --> mergeTemplate(将模板和嵌入模板中的值合并) --> requestCleanup
1. 继承org.apache.velocity.servlet.VelocityServlet抽象类:
public class SampleServlet extends VelocityServlet
2. 仅需实现VelocityServlet类的一个方法handleRequest():
public Template handleRequest(HttpServletRequest req, HttpServletResponse resp, Context context)
创建一个web工程,在webroot下建立templates文件夹以存放模板文件。
在src下建立velocity.properties配置文件,内容如下:
file.resource.loader.path = templates ##指定模板文件存放目录
runtime.log = log/velocity.log ##指定日志文件位置
关于Velocty中出现中文乱码问题,可以在velocity.properties文件中加入下面的三行就可以解决:
default.contentType=text/html; charset=UTF-8
input.encoding=UTF-8
output.encoding=UTF-8
在templates文件夹中建立名为sample.vm的模板,内容如下:
<html> <head><title>Sample velocity page</title></head> <body bgcolor="#ffffff"> <center> <h2>Hello Velocity</h2> <table width="100" cellpadding="5" cellspacing="1" bordercolor="#333333"> <tr><td bgcolor="#eeeeee" align="center">Names</td></tr> #foreach ($name in $theList) <tr><td bgcolor="#6666FF" align="center">$name</td></tr> #end </table> </center> </body> </html>
接着我们需要开发自己的Servlet,这个Servlet继承VelocityServlet。
public class SampleServlet extends VelocityServlet { private static final long serialVersionUID = 1L; /** for setting up the Velocity runtime 在系统启动时执行该方法 * Loads the configuration information and returns that information as a Properties, * which will be used to initialize the Velocity runtime. */ protected Properties loadConfiguration(ServletConfig config) throws IOException, FileNotFoundException { String propsFile = config.getInitParameter(INIT_PROPS_KEY); //读取配置文件 Properties p = new Properties(); if (propsFile != null) { String realPath = getServletContext().getRealPath(propsFile); if (realPath != null) { propsFile = realPath; } p.load(new FileInputStream(propsFile)); } String log = p.getProperty(Velocity.RUNTIME_LOG); //设置velocity日志文件的位置 if (log != null) { log = getServletContext().getRealPath(log); if (log != null) { p.setProperty(Velocity.RUNTIME_LOG, log); } } String path = p.getProperty(Velocity.FILE_RESOURCE_LOADER_PATH); //设置模板的位置 if (path != null) { path = getServletContext().getRealPath(path); if (path != null) { p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path); } } return p; } /** Implement this method to add your application data to the context, * calling the getTemplate() method to produce your return value. */ public Template handleRequest(HttpServletRequest request, HttpServletResponse response, Context ctx) { String p1 = "Hoffman"; String p2 = "Song"; Vector personList = new Vector(); personList.addElement(p1); personList.addElement(p2); ctx.put("theList", personList); //将模板数据 list放置到上下文环境context中 Template outty = null; try { outty = getTemplate("sample.vm"); } catch (ParseErrorException pee) { System.out.println("SampleServlet : parse error for template " + pee); } catch (ResourceNotFoundException rnfe) { System.out.println("SampleServlet : template not found " + rnfe); } catch (Exception e) { System.out.println("Error " + e); } return outty; } }
然后在web.xml中配置这个Servlet,如下:
<servlet> <servlet-name>SampleServlet</servlet-name> <servlet-class>com.mixele.velocity.SampleServlet</servlet-class> <init-param> <param-name>org.apache.velocity.properties</param-name> <param-value>/WEB-INF/classes/velocity.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SampleServlet</servlet-name> <url-pattern>/SampleServlet</url-pattern> </servlet-mapping>
部署并启动工程,之后执行这个Servlet,浏览器便会显示使用vm模板展示的页面。
org.apache.velocity.servlet.VelocityServlet继承了HttpServlet,因此它继承了HttpSetvlet的对生命周期的管理,而且,只要我们在实现自己velocity servlet的时候,继承org.apache.velocity.servlet.VelocityServlet,然后继承它的一些重要的方法就可以完成实际的业务。
当web工程启动时,系统会先执行SampleServlet的父类VelocityServlet中的init()方法。
VelocityServlet源代码:
/** 初始化Veocity */ public void init(ServletConfig config) throws ServletException { super.init(config); initVelocity(config); //初始化Velocity /* Velocity初始化时修改部分配置 */ defaultContentType = RuntimeSingleton.getString(CONTENT_TYPE, DEFAULT_CONTENT_TYPE); System.out.println("defaultContentType = "+defaultContentType); } /** Velocity在运行时初始化,读取Velocity配置文件 */ protected void initVelocity(ServletConfig config) throws ServletException { try { Properties props = loadConfiguration(config); //读取velocity.properties Velocity.init(props); //初始化Velocity } catch (Exception e) { throw new ServletException("Error initializing Velocity: " + e, e); } }
在执行VelocityServlet类的initVelocity方法时,因为SampleServlet类继承并重写了其中所调用的loadConfiguration方法,故系统会执行SampleServlet类的loadConfiguration方法。该过程获取了自行设置velocity日志文件的位置和自行设置模板的位置。
在这个过程中,Velocity会自行访问velocity.properties配置文件,以读取其中的信息。如果不配置该配置文件,或者不配置key为file.resource.loader.path的项,在执行Template outty = getTemplate("sample.vm");语句或Template outty = getTemplate("/templates/sample.vm");时,会发生无法找到模板的错误。
至此,Velocity在容器启动初始化完毕。
当在浏览器中输入http://localhost:8080/Mixele_Velocity/SampleServlet时,Velocity的处理过程为:
从执行SampleServlet父类VelocityServlet的doGet开始 --> doRequest --> createContext --> setContentType --> chooseCharacterEncoding --> handleRequest(SampleServlet继承) --> getTemplate(String name) --> mergeTemplate(将模板和嵌入模板中的值合并) --> requestCleanup
发表评论
-
Velocity在Struts 2框架下的应用
2010-06-03 16:46 994Struts 2更是提供了对Velocity和FreeMark ... -
Velocity与Struts 1.* -- 静态页生成
2010-06-02 15:36 1340在Struts中有两种使用Velocity的方法,一种是利用V ... -
Velocity与Struts 1.* -- VM展示
2010-05-27 17:46 2272在Struts中有两种使用Velocity的方法,一种是利用V ... -
FreeMarker表达式
2010-05-11 10:53 2455表达式是FreeMarker模板的核心功能,表达式放置在插值语 ... -
FreeMarker模板文件
2010-05-11 10:44 1137FreeMarker模板文件主要由如下4个部分构成: 1. 文 ... -
FCKeditor 2.6控制上传文件的大小
2010-05-10 15:34 2128对于上传文件的大小,FCKeditor并没有提供限制,可以通过 ... -
Fckeditor 2.6上传中文问题
2010-05-10 11:04 1168在web.xml中配置FCKeditor提供的上传Servle ... -
OSCache - 在Hibernate中使用
2010-05-04 11:28 1455创建一个Java工程OSCacheTe ... -
OSCache - CacheFilter工作原理
2010-05-04 11:16 2628系统启动 – CacheFilter OS ... -
OSCache - 缓存标签
2010-05-04 11:10 1028<cache:cache>是OSCache提供的标 ...
相关推荐
**示例源码解析** 在提供的压缩包`struts2+velocity`中,可能包含了以下内容: 1. `struts.xml`: Struts2的配置文件,定义了Action、Result和Interceptor等。 2. `Action类`: 实现特定业务逻辑的Java类,继承自...
- **模板解析**:Velocity 首先会解析模板文件,将模板中的指令(如`#if`, `#foreach`, `#set`等)识别出来,形成抽象语法树(AST)。 - **数据绑定**:在运行时,通过`VelocityContext`将Java对象绑定到模板中,...
Spring Velocity是一个将Velocity模板引擎与Spring框架集成的示例,这个例子主要展示了如何在Spring应用中使用Velocity来渲染动态内容。Velocity是一个Java模板引擎,它允许开发者将逻辑和表示分离,使得网页设计...
以下是一个简单的Velocity模板示例: ```html $title <h1>Welcome, $name! <p>Today is $date. ``` 在这个例子中,`$title`、`$name`和`$date`都是来自上下文的变量。 ** 实战开发 ** 在实际开发中,...
深入研究Velocity的源码有助于理解其工作原理,例如如何解析模板、如何执行指令、如何处理上下文对象等。这不仅可以帮助优化模板设计,还能为自定义扩展提供基础。 ### 学习资源 - 博文链接:...
《Qt6 QML图形效果与粒子参数:源码解析》 Qt6是Qt框架的最新版本,它在图形渲染和用户界面设计方面有着显著的提升。QML(Qt Meta Language)是Qt提供的一种声明式语言,用于构建丰富的、动态的用户界面。在QML中,...
4. 使用Velocity模板引擎,将解析出的信息填入模板,生成Java源码。 5. 编译生成的Java文件,添加到Spring Boot项目中。 在`demo`这个文件中,可能包含了上述步骤的示例代码或者配置文件。通过学习和理解这个示例,...
以下是一个简单的示例: ```java VelocityContext context = new VelocityContext(); context.put("name", "张三"); Template template = Velocity.getTemplate("template.vm"); String output = template.merge...
此外,Spring还提供了一个`SimpleMailMessage`类,用于创建简单的邮件消息对象,包括收件人、主题、正文等内容。 接下来,我们引入Velocity。Velocity模板引擎允许我们将动态数据插入到静态的HTML模板中。例如,你...
3. **Velocity Engine**: 这是 Velocity 的核心组件,负责解析模板,合并上下文数据,并生成最终的输出。 **三、Velocity模板语言** 1. **变量(Variable)**: 变量以`$`开头,如`$name`。当Velocity渲染模板时,它...
在"Velocity003"这个压缩包中,可能包含了一些关于如何在Struts2项目中集成和使用Velocity模板的示例代码或教程。例如,可能有Action类的实现,展示了如何设置和返回结果对象;还有Velocity模板文件,演示了如何在...
**源码解析** Velocity 的源码结构清晰,易于理解和扩展。主要包含以下几个关键组件: 1. **`VelocityContext`**:这是模板和 Java 代码之间的桥梁,用于存放所有要在模板中使用的变量。你可以将 Java 对象放入上...
在Velocity中,View就是模板文件(.vm),它包含静态文本和Velocity指令,Model则是Java对象,Controller的工作由Velocity Engine完成,它解析模板,将Java对象的数据嵌入到模板中,生成最终的HTML或其他格式的输出...
- **运行示例**: 包括一些简单的示例来演示Velocity的基本用法。 ### 知识点六:构建Hello World示例 - **无上下文模板**: 介绍了一个简单的模板示例,该示例不使用任何外部数据。 - **使用上下文的模板**: 展示了...
Velocity 示例 ```html $title <h1>Welcome, $user.name! <p>Today is #if($isWeekday)"weekday"#else"weekend"#end. #foreach($item in $list) $item #end ``` 在这个例子中,`$title`、`$user.name` ...
3. **Velocity Examples**:示例代码,帮助开发者理解和学习如何使用Velocity。 4. **Documentation**:包括用户手册、开发者指南、API文档等,帮助开发者更好地了解和使用Velocity。 **使用Velocity** - **安装**...
- 构建工具:在构建过程中生成源码、类文件等。 总的来说,Velocity是一个强大且灵活的模板引擎,它简化了Java应用中的视图层开发,让非编程人员也能参与,提高了协作效率,并且提供了丰富的语法结构以满足各种需求...
这个压缩包“NVelocity1.1版及示例Demo(全源码)”包含了NVelocity 1.1版本的所有源代码以及相关的示例和Demo,对于学习和理解NVelocity的工作原理以及如何在实际项目中应用是非常有价值的。 NVelocity的核心功能...
Velocity通过使用简单的模板语言(VTL,Velocity Template Language)来实现这一目标,它的设计灵感来源于Perl和Python等脚本语言,但更强调可读性和可维护性。 在提供的压缩包文件中,我们可以看到以下几个关键...