欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAVA velocity模板引擎使用实例

程序员文章站 2023-11-13 19:00:34
velocity使用1.7版本。 在win7下使用intellij idea建立一基于tomcat的web app项目,命名为todo_web,设置path为/todo,导...

velocity使用1.7版本。 在win7下使用intellij idea建立一基于tomcat的web app项目,命名为todo_web,设置path为/todo,导入velocity相关jar包。只导入velocity-1.7.jar这个包可能会报错,根据提示再导入velocity自带的其他包。 项目结构如下:

JAVA velocity模板引擎使用实例

测试tomcat

index.jsp内容如下:

复制代码 代码如下:

<%-- created by intellij idea. --%>
<%@ page contenttype="text/html;charset=utf-8" language="java" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
           <%
               out.print("hi,todo");
           %>
  </body>
</html>

helloworld.java内容如下:
复制代码 代码如下:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;   
public class helloworld extends httpservlet {
    /**
     *
     * @param request
     * @param response
     * @throws ioexception
     * @throws servletexception
     */
    @override
    public void doget(httpservletrequest request, httpservletresponse response)
            throws ioexception, servletexception {
        response.setcontenttype("text/html");
        printwriter out = response.getwriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>hi!</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>hello world!!!</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

在web.xml中加入以下内容:
复制代码 代码如下:

<servlet>
    <servlet-name>hi</servlet-name>
    <servlet-class>helloworld</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>hi</servlet-name>
    <url-pattern>/hi</url-pattern>
</servlet-mapping>

运行项目,在http://localhost:8080/todo和http://localhost:8080/todo/hi中可以看到效果。


使用velocity

下面开始使用velocity模板引擎,在src下建立目录templates,在templates目录下建立文件test.vm,内容如下:

复制代码 代码如下:

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body>
#set( $this = "velocity")
$this is great!  <br/>
$name  <br/>
hi  , i am letian
<h1>你好</h1>
</body>
</html>

在src目录下新建java文件myvelocity01.java:
复制代码 代码如下:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.velocity.app.velocity;
import org.apache.velocity.app.velocityengine;
import org.apache.velocity.velocitycontext;
import java.util.properties;
public class myvelocity01 extends httpservlet {
    @override
    public void doget(httpservletrequest request, httpservletresponse response)
            throws ioexception, servletexception {
        request.setcharacterencoding("utf-8");
        response.setcontenttype("text/html;charset=utf-8");
        printwriter out = response.getwriter();
        properties properties=new properties();
        properties.setproperty("resource.loader", "class");
        properties.setproperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.classpathresourceloader");
        //properties.setproperty("input.encoding", "utf-8");
        //properties.setproperty("output.encoding", "utf-8");
        properties.setproperty(velocity.encoding_default, "utf-8");
        properties.setproperty(velocity.input_encoding, "utf-8");
        properties.setproperty(velocity.output_encoding, "utf-8");
        velocityengine velocityengine = new velocityengine(properties);
        velocitycontext context=new velocitycontext();
        context.put("name", "test");
        stringwriter sw = new stringwriter();
        velocityengine.mergetemplate("templates/test.vm", "utf-8", context, sw);
        //velocityengine.mergetemplate("templates/test.vm", "utf-8", context, sw);      //这样就会出现两次
        out.println(sw.tostring());
    }
}

配置web.xml:

复制代码 代码如下:

<!--myvelocity-->
<servlet>
    <servlet-name>ve</servlet-name>
    <servlet-class>myvelocity01</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ve</servlet-name>
    <url-pattern>/ve</url-pattern>
</servlet-mapping>

重新部署,浏览器访问可以看到效果。

简单介绍velocity

velocity是一个基于java的模板引擎,有三种文件加载模板方式: 1、从文件路径加载 2、从类路径(myvelocity01.java使用该方法) 3、从jar文件加载 开始接触velocity时可能会在加载模板上遇到问题。

如何向模板文件传递变量: 模板本身可以定义变量,例如在test.vm中定义了变量$this,java代码也可以给模板传递变量,例如test.vm中的变量$name便是velocitycontext实例传递过去的。同时velocity也支持迭代对象,例如: 我们在myvelocity01.java中导入java.util.vector,将代码:

复制代码 代码如下:

context.put("name", "test");

改为:
复制代码 代码如下:

vector v = new vector(); 
v.addelement("harry"); 
v.addelement("john"); 
string[] names = {"harry", "john"};
context.put("names1", v);
context.put("names2", names);

将test.vm内容改为:
复制代码 代码如下:

<h1>hello</h1>
#foreach($name in $names1)
    $name   <br/>
#end
#foreach($name in $names2)
    $name   <br/>
#end

velocity还支持map容器,支持使用#include("")引入静态模板,#parse("模板名")引入动态模板。

如果想不开要用java mvc写网站的话,使用servlet + velocity是一个小巧灵活的选择。