一个静态的html文件中含有#和$等符号用来渲染后台数据的velocity语法,有人知道静态页面中这些velocity语法对应生成的代码在哪里吗?想看下对应的java代码。
velocity生成的是语法树,没有java代码
JSP文件实际上执行的是JSP对应的Java类,简单地说就是将JSP的HTML转化成out.write输出,而JSP中的Java代码直接复制到翻译后的Java类中。最终执行的是翻译后的Java类,而Velocity是按照语法规则解析成一棵语法树,然后执行这棵语法树来渲染出结果。所以它们有如下这些区别。
执行方式不一样:JSP是编译执行,而Velocity是解释执行。如果JSP文件被修改了,那么对应的Java类也会被重新编译,而Velocity却不需要,只是会重新生成一棵语法树。
执行效率不同:从两者的执行方式不同可以看出,它们的执行效率不一样,从理论上来说,编译执行的效率明显好于解释执行,一个很明显的例子在JSP中方法调用是直接执行的,而Velocity的方法调用是反射执行的,JSP的效率会明显好于Velocity。当然如果JSP中有语法JSTL,语法标签的执行要看该标签的实现复杂度。
需要的环境支持不一样:JSP的执行必须要有Servlet的运行环境,也就是需要ServletContext、HttpServletRequest和HttpServletResponse类。而要渲染Velocity完全不需要其他环境类的支持,直接给定Velocity模板就可以渲染出结果。所以Velocity不只应用在Servlet环境中。
velocity是静态模板语言,不是什么平台上,而是你要用它干什么。
我前段是用velocity开发静态网站,就是将整个页面用velocity写好后,放在数据库或干脆代替jsp或html放在程序中,通过velocity解析,将设置的标量替换为后台代码中定义的数据。
比如你在request放入了一个request.setAttribute("foo","zhangsan");在页面可以直接将$foo替换成zhangsan,当然,你再次set后,就会覆盖掉。还有必须在web.xml中配置velocity,否则没法解析的。建议你搜索下velocity的资料,很多的
导入velocity所依赖的jar文件,在WEB-INF目录下建立.vm的模板,如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
velocity |
velocity |
velocity |
velocity |
velocity |
velocity |
velocity |
实现类如下:
package com.gayngyi.velocity;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
public class CreateHtml {
public static void main(String[] args) {
try {
//初始化vm模板
Template template=Velocity.getTemplate("WebContent\WEB-INF\velocityTemp\test.vm","UTF-8");
//初始化上下文
VelocityContext context=new VelocityContext();
//添加数据到上下文中
context.put("title", "我的第一个velocity页面");
//生成html页面
PrintWriter pw=new PrintWriter("f:\myvelocity.html");
template.merge(context, pw);
//关闭流
pw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ResourceNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseErrorException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}