- 浏览: 58734 次
- 性别:
- 来自: 长春
最新评论
-
qiuzhiqun0406:
写的什么啊.power还没初始化呢, 调用个圈圈啊?
子类重写父类方法访问权只能变大不能变小 -
ibio:
总结的很好。这 3 个模式确实很容易搞混淆的。对于你的最后一个 ...
工厂方法---抽象工厂之我见
学习Velocity Tools的一个例子2008年04月19日 星期六 22:36Apache官方网站Velocity Tools自带的例子(位置:\velocity-tools-1.4-src\examples\simple)。
新建一个Web Project,名称为Velocity。
在src下面实现一个ToyTool类,如下所示:
public class ToyTool
{
private String message = "Hello from ToyTool!";
public String getMessage()
{
return message;
}
public void setMessage(String m)
{
message = m;
}
/** To test exception handling in templates. */
public boolean whine() {
throw new IllegalArgumentException();
}
}
这个类实现了一个简单的JavaBean,带setter和getter,操作的属性是message。
模板文件为index.vm,内容如下所示:
<html>
<body>
I'm a velocity template.
#if( $XHTML )
#set( $br = "<br />" )
#else
#set( $br = "<br>" )
#end
$br
$br
Here we use a custom tool: $toytool.message
$br
$br
Here we get the date from the DateTool: $date.medium
</body>
</html>
在这个自带的例子中,并没有实际实现一个自己的Servlet,而是直接使用了org.apache.velocity.tools.view.servlet.VelocityViewServlet,该类位于\velocity-tools-1.4-src\src\java\org\apache\velocity\tools\view\servlet下面。
用到org.apache.velocity.tools.view.servlet.VelocityViewServlet,在该类中实现了对toolbox.xml的解析。可以在web.xml中对应的配置来了解到都配置了哪些项。
web.xml中配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>
org.apache.velocity.tools.view.servlet.VelocityViewServlet
</servlet-class>
<init-param>
<param-name>org.apache.velocity.toolbox</param-name>
<param-value>/WEB-INF/toolbox.xml</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.vm</welcome-file>
</welcome-file-list>
</web-app>
其中,toolbox.xml的内容如下所示:
<toolbox>
<xhtml>true</xhtml>
<tool>
<key>toytool</key>
<class>ToyTool</class>
</tool>
<data type="number">
<key>version</key>
<value>1.1</value>
</data>
<data type="boolean">
<key>isSimple</key>
<value>true</value>
</data>
<data type="string">
<key>foo</key>
<value>this is foo.</value>
</data>
<data type="string">
<key>bar</key>
<value>this is bar.</value>
</data>
<tool>
<key>map</key>
<class>java.util.HashMap</class>
</tool>
<tool>
<key>date</key>
<scope>application</scope>
<class>org.apache.velocity.tools.generic.DateTool</class>
</tool>
</toolbox>
将对应的jar包文件加入到CLASSPATH中,启动Tomcat Web Server ,在浏览器地址栏中键入http://localhost:8080/Velocity/index.vm就可以看到这个简单的例子运行的效果了:
I'm a velocity template.
Here we use a custom tool: Hello from ToyTool!
Here we get the date from the DateTool: 2008-4-19 21:23:50
既然,web.xml中指定了初始化参数:key为org.apache.velocity.toolbox,value为/WEB-INF/toolbox.xml文件,那么,在Web Server(这里使用Tomcat)启动的时候,就要解析/WEB-INF/toolbox.xml。
其实,这里隐藏了很多细节,需要解析的不仅仅是/WEB-INF/toolbox.xml,在解析它之前还有很多工作要做。
可以在VelocityViewServlet的源代码中看到实际的过程。VelocityViewServlet继承了HttpServlet,表现出了它是有生命周期的。其中在init方法中可以看到初始化过程:
public void init(ServletConfig config) throws ServletException
{
super.init(config);
// 根据config信息初始化Velocity,这时Web Server启动的时候要做的第一件事
initVelocity(config);
// 初始化toolbox
initToolbox(config);
// 当Velocity已经初始化完成之后,下面要做的一些事情:设置ContentType和编码等等等
defaultContentType =
(String)getVelocityProperty(CONTENT_TYPE, DEFAULT_CONTENT_TYPE);
String encoding =
(String)getVelocityProperty(RuntimeConstants.OUTPUT_ENCODING,
DEFAULT_OUTPUT_ENCODING);
// For non Latin-1 encodings, ensure that the charset is
// included in the Content-Type header.
if (!DEFAULT_OUTPUT_ENCODING.equalsIgnoreCase(encoding))
{
int index = defaultContentType.lastIndexOf("charset");
if (index < 0)
{
// the charset specifier is not yet present in header.
// append character encoding to default content-type
defaultContentType += "; charset=" + encoding;
}
else
{
// The user may have configuration issues.
velocity.warn("VelocityViewServlet: Charset was already " +
"specified in the Content-Type property. " +
"Output encoding property will be ignored.");
}
}
velocity.info("VelocityViewServlet: Default content-type is: " +
defaultContentType);
}
上面代码中,第一件事是initVelocity,即窄initVelocity方法中注册Velocity引擎
protected void initVelocity(ServletConfig config) throws ServletException
{
velocity = new VelocityEngine(); // 实例化一个VelocityEngine
setVelocityEngine(velocity); // 将已经创建的VelocityEngine设置到当前Velocity上下文中
// 注册
LogSystemCommonsLog.setVelocityEngine(velocity);
velocity.setApplicationAttribute(SERVLET_CONTEXT_KEY, getServletContext());
// 尝试读取VelocityTools 默认配置信息
try
{
/** 这里要读取Velocity的默认配置文件了,即org/apache/velocity/tools/view/servlet/velocity.properties文件,该文件默认设置如下所示:
# default to servletlogger, which logs to the servlet engines log
runtime.log.logsystem.class = org.apache.velocity.tools.view.servlet.ServletLogger
# by default, load resources with webapp resource loader
resource.loader = webapp
webapp.resource.loader.class = org.apache.velocity.tools.view.servlet.WebappLoader
*/
ExtendedProperties defaultProperties = loadDefaultProperties();
velocity.setExtendedProperties(defaultProperties);
}
catch(Exception e)
{
log("VelocityViewServlet: Unable to read Velocity Servlet configuration file: ", e);
throw new ServletException(e);
}
// velocity.properties文件是可以由用户自己根据需要配置的,如果用户自己重新设置了该文件,在这里解析
try
{
ExtendedProperties p = loadConfiguration(config);
velocity.setExtendedProperties(p);
}
catch(Exception e)
{
log("VelocityViewServlet: Unable to read Velocity configuration file: ", e);
log("VelocityViewServlet: Using default Velocity configuration.");
}
// 当velocity.properties文件加载完成,初始化VeloccityEngine
try
{
velocity.init();
}
catch(Exception e)
{
log("VelocityViewServlet: PANIC! unable to init()", e);
throw new ServletException(e);
}
}
接着就是initToolbox,开始解析/WEB-INF/toolbox.xml文件,initToolbox方法实现如下:
protected void initToolbox(ServletConfig config) throws ServletException
{
// 获取在web.xml中设置的toolbox.xml
String file = findInitParameter(config, TOOLBOX_KEY);
if (file == null)
{
// ok, look in the default location
file = DEFAULT_TOOLBOX_PATH;
velocity.debug("VelocityViewServlet: No toolbox entry in configuration."
+ " Looking for '" + DEFAULT_TOOLBOX_PATH + "'");
}
// 获取一个管理toolbox.xml的管理toolboxManager
toolboxManager =
ServletToolboxManager.getInstance(getServletContext(), file);
}
ToolboxManager是一个接口:
package org.apache.velocity.tools.view;
import java.util.Map;
public interface ToolboxManager
{
void addTool(ToolInfo info);
void addData(ToolInfo info);
Map getToolbox(Object initData);
}
它有一个实现子类XMLToolboxManager,可以完成对XML配置文件(比如toolbox.xml文件)的一些操作,其中,XMLToolboxManager类方法load实现了对XML文件的加载和解析:
public void load(InputStream input) throws Exception
{
LOG.trace("Loading toolbox...");
Digester digester = new Digester();
digester.setValidating(false);
digester.setUseContextClassLoader(true);
digester.push(this);
digester.addRuleSet(getRuleSet());
digester.parse(input);
LOG.trace("Toolbox loaded.");
}
新建一个Web Project,名称为Velocity。
在src下面实现一个ToyTool类,如下所示:
public class ToyTool
{
private String message = "Hello from ToyTool!";
public String getMessage()
{
return message;
}
public void setMessage(String m)
{
message = m;
}
/** To test exception handling in templates. */
public boolean whine() {
throw new IllegalArgumentException();
}
}
这个类实现了一个简单的JavaBean,带setter和getter,操作的属性是message。
模板文件为index.vm,内容如下所示:
<html>
<body>
I'm a velocity template.
#if( $XHTML )
#set( $br = "<br />" )
#else
#set( $br = "<br>" )
#end
$br
$br
Here we use a custom tool: $toytool.message
$br
$br
Here we get the date from the DateTool: $date.medium
</body>
</html>
在这个自带的例子中,并没有实际实现一个自己的Servlet,而是直接使用了org.apache.velocity.tools.view.servlet.VelocityViewServlet,该类位于\velocity-tools-1.4-src\src\java\org\apache\velocity\tools\view\servlet下面。
用到org.apache.velocity.tools.view.servlet.VelocityViewServlet,在该类中实现了对toolbox.xml的解析。可以在web.xml中对应的配置来了解到都配置了哪些项。
web.xml中配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>
org.apache.velocity.tools.view.servlet.VelocityViewServlet
</servlet-class>
<init-param>
<param-name>org.apache.velocity.toolbox</param-name>
<param-value>/WEB-INF/toolbox.xml</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.vm</welcome-file>
</welcome-file-list>
</web-app>
其中,toolbox.xml的内容如下所示:
<toolbox>
<xhtml>true</xhtml>
<tool>
<key>toytool</key>
<class>ToyTool</class>
</tool>
<data type="number">
<key>version</key>
<value>1.1</value>
</data>
<data type="boolean">
<key>isSimple</key>
<value>true</value>
</data>
<data type="string">
<key>foo</key>
<value>this is foo.</value>
</data>
<data type="string">
<key>bar</key>
<value>this is bar.</value>
</data>
<tool>
<key>map</key>
<class>java.util.HashMap</class>
</tool>
<tool>
<key>date</key>
<scope>application</scope>
<class>org.apache.velocity.tools.generic.DateTool</class>
</tool>
</toolbox>
将对应的jar包文件加入到CLASSPATH中,启动Tomcat Web Server ,在浏览器地址栏中键入http://localhost:8080/Velocity/index.vm就可以看到这个简单的例子运行的效果了:
I'm a velocity template.
Here we use a custom tool: Hello from ToyTool!
Here we get the date from the DateTool: 2008-4-19 21:23:50
既然,web.xml中指定了初始化参数:key为org.apache.velocity.toolbox,value为/WEB-INF/toolbox.xml文件,那么,在Web Server(这里使用Tomcat)启动的时候,就要解析/WEB-INF/toolbox.xml。
其实,这里隐藏了很多细节,需要解析的不仅仅是/WEB-INF/toolbox.xml,在解析它之前还有很多工作要做。
可以在VelocityViewServlet的源代码中看到实际的过程。VelocityViewServlet继承了HttpServlet,表现出了它是有生命周期的。其中在init方法中可以看到初始化过程:
public void init(ServletConfig config) throws ServletException
{
super.init(config);
// 根据config信息初始化Velocity,这时Web Server启动的时候要做的第一件事
initVelocity(config);
// 初始化toolbox
initToolbox(config);
// 当Velocity已经初始化完成之后,下面要做的一些事情:设置ContentType和编码等等等
defaultContentType =
(String)getVelocityProperty(CONTENT_TYPE, DEFAULT_CONTENT_TYPE);
String encoding =
(String)getVelocityProperty(RuntimeConstants.OUTPUT_ENCODING,
DEFAULT_OUTPUT_ENCODING);
// For non Latin-1 encodings, ensure that the charset is
// included in the Content-Type header.
if (!DEFAULT_OUTPUT_ENCODING.equalsIgnoreCase(encoding))
{
int index = defaultContentType.lastIndexOf("charset");
if (index < 0)
{
// the charset specifier is not yet present in header.
// append character encoding to default content-type
defaultContentType += "; charset=" + encoding;
}
else
{
// The user may have configuration issues.
velocity.warn("VelocityViewServlet: Charset was already " +
"specified in the Content-Type property. " +
"Output encoding property will be ignored.");
}
}
velocity.info("VelocityViewServlet: Default content-type is: " +
defaultContentType);
}
上面代码中,第一件事是initVelocity,即窄initVelocity方法中注册Velocity引擎
protected void initVelocity(ServletConfig config) throws ServletException
{
velocity = new VelocityEngine(); // 实例化一个VelocityEngine
setVelocityEngine(velocity); // 将已经创建的VelocityEngine设置到当前Velocity上下文中
// 注册
LogSystemCommonsLog.setVelocityEngine(velocity);
velocity.setApplicationAttribute(SERVLET_CONTEXT_KEY, getServletContext());
// 尝试读取VelocityTools 默认配置信息
try
{
/** 这里要读取Velocity的默认配置文件了,即org/apache/velocity/tools/view/servlet/velocity.properties文件,该文件默认设置如下所示:
# default to servletlogger, which logs to the servlet engines log
runtime.log.logsystem.class = org.apache.velocity.tools.view.servlet.ServletLogger
# by default, load resources with webapp resource loader
resource.loader = webapp
webapp.resource.loader.class = org.apache.velocity.tools.view.servlet.WebappLoader
*/
ExtendedProperties defaultProperties = loadDefaultProperties();
velocity.setExtendedProperties(defaultProperties);
}
catch(Exception e)
{
log("VelocityViewServlet: Unable to read Velocity Servlet configuration file: ", e);
throw new ServletException(e);
}
// velocity.properties文件是可以由用户自己根据需要配置的,如果用户自己重新设置了该文件,在这里解析
try
{
ExtendedProperties p = loadConfiguration(config);
velocity.setExtendedProperties(p);
}
catch(Exception e)
{
log("VelocityViewServlet: Unable to read Velocity configuration file: ", e);
log("VelocityViewServlet: Using default Velocity configuration.");
}
// 当velocity.properties文件加载完成,初始化VeloccityEngine
try
{
velocity.init();
}
catch(Exception e)
{
log("VelocityViewServlet: PANIC! unable to init()", e);
throw new ServletException(e);
}
}
接着就是initToolbox,开始解析/WEB-INF/toolbox.xml文件,initToolbox方法实现如下:
protected void initToolbox(ServletConfig config) throws ServletException
{
// 获取在web.xml中设置的toolbox.xml
String file = findInitParameter(config, TOOLBOX_KEY);
if (file == null)
{
// ok, look in the default location
file = DEFAULT_TOOLBOX_PATH;
velocity.debug("VelocityViewServlet: No toolbox entry in configuration."
+ " Looking for '" + DEFAULT_TOOLBOX_PATH + "'");
}
// 获取一个管理toolbox.xml的管理toolboxManager
toolboxManager =
ServletToolboxManager.getInstance(getServletContext(), file);
}
ToolboxManager是一个接口:
package org.apache.velocity.tools.view;
import java.util.Map;
public interface ToolboxManager
{
void addTool(ToolInfo info);
void addData(ToolInfo info);
Map getToolbox(Object initData);
}
它有一个实现子类XMLToolboxManager,可以完成对XML配置文件(比如toolbox.xml文件)的一些操作,其中,XMLToolboxManager类方法load实现了对XML文件的加载和解析:
public void load(InputStream input) throws Exception
{
LOG.trace("Loading toolbox...");
Digester digester = new Digester();
digester.setValidating(false);
digester.setUseContextClassLoader(true);
digester.push(this);
digester.addRuleSet(getRuleSet());
digester.parse(input);
LOG.trace("Toolbox loaded.");
}
发表评论
-
扩展Velocity
2010-09-07 10:06 3260扩展Velocity,实现模板的继承 文章分类:Java编程 ... -
Spring整合velocity
2010-08-31 13:51 6597关键字:Spring中使用Velocity模板 使用Vel ... -
Spring velocity
2010-08-31 13:34 2754默认情况下,velocity macro文件修改没有被应用服务 ... -
velocity在spring中的使用
2010-08-31 13:31 2648velocity在spring中的使用 关键字: spring ... -
Velocity 的macro(2)
2010-08-31 13:19 5436上篇举了一个比较简单得了例子,用来说明他的macro的用途,这 ... -
Velocity 的macro(1)
2010-08-31 11:52 1795Velocity 的macro(1) macro 是Veloc ... -
velocity eclipse插件
2010-08-31 09:17 1223下载地址:http://sourceforge.net/pro ... -
velocity
2010-08-30 17:06 1140Velocity教程 关键词: velocity 教程 ...
相关推荐
6. **Velocity工具箱 (Velocity Tools)**: Velocity Tools是Velocity的一个扩展库,提供了许多有用工具,如日期格式化、国际化、URL生成等。这些工具可以在Velocity模板中直接使用,增强模板的功能。 7. **模板设计...
Spring Velocity是一个将Velocity模板引擎与Spring框架集成的示例,这个例子主要展示了如何在Spring应用中使用Velocity来渲染动态内容。Velocity是一个Java模板引擎,它允许开发者将逻辑和表示分离,使得网页设计...
这个最简单的配置例子提供了一个入门级别的演示,帮助开发者快速理解如何整合这两个框架。下面我们将详细探讨SpringMVC3和Velocity的核心概念以及它们的集成过程。 **SpringMVC3** SpringMVC是Spring框架的一部分...
在IT行业中, Velocity是一款...通过以上方法,我们可以构建一个高效、可扩展的邮件发送系统,利用Velocity模板引擎的强大功能,使邮件内容更加个性化和多样化。在实际开发中,可以根据项目需求进行适当的调整和优化。
此外,还可以通过 `VelocityTools` 注册工具类,将常用的 Java 类库方法暴露给模板使用,例如日期格式化、URL编码等。 **5. 与其他技术的集成** Velocity 可以轻松地与Spring、Struts等其他Java Web框架集成,提供...
在这个例子中,`$title` 和 `$username` 是从Java上下文中获取的变量,`#formatDate()` 是Velocity Tools提供的一个函数,用于格式化日期。 总的来说,Velocity以其简洁的语法和良好的可维护性,为Java Web开发提供...
- **Velocity Tools**: 这是一个扩展库,提供了许多有用的工具,如视图辅助类,可以帮助简化模板编程。 - **Velocity模板最佳实践**: 如避免在模板中进行复杂计算,保持模板简洁,将业务逻辑留在后端代码中。 - *...
- **Velocity 工具**: 如 VelocityTools,提供了一些额外的工具,如 VelocityViewServlet,简化了 Web 应用中的整合工作。 - **模板设计原则**: 保持模板尽可能简洁,避免过多的逻辑处理,让模板专注于展示。 - **...
Velocity是Apache软件基金会的一个开源项目,它是一个基于Java的模板引擎,用于生成动态Web内容。Velocity被设计成一个轻量级的、快速的模板语言,它允许开发者将呈现逻辑从业务逻辑和视图层分离出来,实现MVC...
Velocity是Apache软件基金会的一个开源模板引擎,用于生成动态Web内容。它的设计目标是使开发者能够专注于内容,而不是HTML结构,从而提高开发效率。Velocity模板语言(VTL)简洁且易于理解,允许开发者在模板中插入...
Velocity是Apache软件基金会的一个开源项目,它是一款Java模板引擎,主要用在Web开发中,用于生成动态网页内容。Velocity通过将HTML或者XML模板与Java代码分离,使得开发者可以专注于业务逻辑,而设计师则能专注于...
这个文件通常在Velocity Tools项目中使用,它是一个配置文件,用于定义工具箱中的各种工具实例。在Vilocity中,工具是指可以方便地在模板中使用的Java对象。例如,你可能会在`toolbox.xml`中配置一个日期工具,以便...
Velocity是Apache软件基金会的一个开源项目,它是一个基于Java的模板引擎,用于生成动态内容。在Web开发中,Velocity常被用来作为HTML、XML等文档的生成工具,将静态页面模板与动态数据相结合,使得开发者可以专注于...
4. **与 Turbine 集成**:Turbine 是一个基于 Velocity 的 Web 开发框架,Velocity 作为其模板服务组件,支持构建真正遵循 MVC 模式的 Web 应用程序。 5. **自定义和扩展**:Velocity 允许用户自定义工具包...
此外,它提供了丰富的工具集,如 VelocityTools,可以与Spring、Struts等框架无缝集成,进一步提升开发效率。 总的来说,Velocity作为模板引擎,通过其简单易用的模板语言和强大的功能,为Java Web开发提供了一种更...
在这个例子中,`FileOutputStream`用于打开一个文件流,`OutputStreamWriter`用于创建一个字符输出流,而`BufferedWriter`则用于缓冲字符输出,提高写入效率。在处理完文件后,使用`close()`方法关闭流,确保资源...
- 博文链接(已提供但无法访问)可能包含了一个具体的例子或教程,介绍如何利用特定工具生成Java代码。 3. **项目结构**: - `.classpath`:这是Eclipse IDE的一个配置文件,记录了项目的类路径,包括库、源代码...