首页

关于三种jsp、freemarker、velocity模板语言优缺点对比及示例代码演示下载

标签:jsp,freemarker,velocity,模板语言,java,模板实现技术,源码下载     发布时间:2015-06-12   

前言

在java中表现层实现技术主要分为三种:jsp、freemarker、velocity,那么我们如何区分使用呢?下面让我们分析一下它们的优缺点。

一、JSP应该是模板语言中用的最多技术,其特点属性如下:

1.支持java代码直接写入,方便易学

2.支持标签(jsp tag)及自定义标签(jstl)

3.支持表达式语言(el)

4.丰富第三方jsp标签库,如(struts-tag等)

5.性能良好,jsp最终编译为class二进制文件执行

二、Velocity设计弥补jsp模板语言的缺点的,其特点属性如下:

1.不能在其中写java代码,更容易实现mvc分离

2.性能比jsp更好,不需要引入更多依赖库,解析更高效,不支持jsp标签

3.不是官方标准,用户群体和第三方标签库没jsp多

三、freemarker特点属性分析如下:

1.不能编写java代码,对于mvc分离更准确

2.性能一般

3.对jsp标签支持比较好

4.内置大量常用功能,使用方便

5.支持宏定义(类似于jsp标签)

6.使用表达式缺点:a.不是官方标准 b.用户群体和第三方标签库没jsp多

四、对于freemarker使用分析:

1.性能,velocity是最好的,其次是jsp,业务逻辑简单freemark页面是最差,复杂页面上(大量判断、日期金额格式化)页面上,要比jsp的tag和el好

2.freemark宏定义比jsp方便好用

3.其内置大量常用功能,如html过滤,日期金额格式化等,使用方便

4.也支持jsp标签

5.可以实现严格的mvc分离

五、关于如何使用freemarker和velocity,给出了具体代码示例:

1.模板主调用入口,TemplateTest.java

import java.util.ArrayList;@b@import java.util.Date;@b@import java.util.HashMap;@b@import java.util.List;@b@import java.util.Map;@b@@b@ @b@public class TemplateTest {@b@@b@    @SuppressWarnings("all")@b@    /**  @b@     * @param args  @b@     */@b@    public static void main(String[] args) throws Exception {@b@        /* 准备数据 */@b@@b@        Map latest = new HashMap();@b@        latest.put("url", "products/greenmouse.html");@b@        latest.put("name", "green mouse");@b@@b@        Map root = new HashMap();@b@        root.put("user", "Big Joe");@b@        root.put("latestProduct", latest);@b@        root.put("number", new Long(2222));@b@        root.put("date", new Date());@b@@b@        List listTest = new ArrayList();@b@        listTest.add("1");@b@        listTest.add("2");@b@        root.put("list", listTest);@b@@b@        TemplateEngine freemarkerEngine = (TemplateEngine) TemplateFactory@b@                .getInstance().getBean("freemarker");@b@        freemarkerEngine.run(root);// 使用freemarker模板技术@b@@b@        TemplateEngine velocityEngine = (TemplateEngine) TemplateFactory@b@                .getInstance().getBean("velocity");@b@        velocityEngine.run(root);// 使用velocity模板技术@b@    }@b@@b@}

2.模板引擎工厂(TemplateFactory.ava),负责调用注入各种模板语言引擎类

import java.util.HashMap;@b@import java.util.Map;@b@@b@public class TemplateFactory {@b@    @b@    private static TemplateFactory instance;   @b@    private Map objectMap;   @b@       @b@    static{   @b@        instance = new TemplateFactory();   @b@    }   @b@       @b@    public TemplateFactory() {   @b@        super();   @b@        this.objectMap = new HashMap();   @b@        synchronized (this) {   @b@            objectMap.put("freemarker", new FreemarkerTemplateEngine(){   @b@               @b@            });   @b@               @b@            objectMap.put("velocity", new VelocityTemplateEngine());   @b@        }   @b@    }   @b@  @b@    public static TemplateFactory getInstance(){   @b@        return instance;   @b@    }   @b@       @b@    /**  @b@     * 模仿spring的工厂  @b@     * @param beanName  @b@     * @return  @b@     */  @b@    public Object getBean(String beanName){   @b@        return objectMap.get(beanName);   @b@    }   @b@@b@ @b@@b@}

3.模板引擎接口定义TemplateEngine.java

import java.util.Map;@b@@b@public interface TemplateEngine {@b@    void run(Map context)throws Exception;   @b@}

4.模板引擎基类(AbstractTemplateEngine.java),用于实现公共方法及定义公共方法

 import java.io.File;@b@import java.io.StringWriter;@b@import java.util.Map;@b@import java.util.StringTokenizer;@b@@b@import org.apache.velocity.VelocityContext;@b@import org.apache.velocity.app.Velocity;@b@@b@import freemarker.template.Configuration;@b@import freemarker.template.DefaultObjectWrapper;@b@import freemarker.template.Template;@b@@b@ @b@public abstract class AbstractTemplateEngine implements TemplateEngine {@b@    @b@    private String currPath="WebRootWEB-INFclasses"+getClassPathName("");@b@@b@    public abstract String getTemplatePath();   @b@    @b@    public abstract String getTemplate();   @b@       @b@    public abstract String getEngineType();   @b@       @b@    public void run(Map context)throws Exception{   @b@        if(Constants.ENGINE_TYPE_FREEMARKER.equals(getEngineType()))   @b@            executeFreemarker(context);   @b@        else  @b@            executeVelocity(context);   @b@    }   @b@       @b@    private void executeFreemarker(Map context)throws Exception{   @b@         System.out.println("##########freemarker111111################");@b@        Configuration cfg = new Configuration();   @b@        String path_=getTemplatePath();@b@        cfg.setDirectoryForTemplateLoading(   @b@                new File(path_));   @b@        cfg.setObjectWrapper(new DefaultObjectWrapper());   @b@        cfg.setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250));   @b@        Template temp = cfg.getTemplate(getTemplate());   @b@//        Writer out = new OutputStreamWriter(System.out);@b@        StringWriter sw = new StringWriter(); @b@//        Writer out = new OutputStreamWriter(new FileOutputStream(getPathString()+"reemark_test.html"));@b@//        temp.process(context, out);@b@        temp.process(context, sw);@b@        System.out.print(sw.toString());  @b@//        out.flush();   @b@        @b@        @b@    }   @b@       @b@    private void executeVelocity(Map root)throws Exception{   @b@        System.out.println("###########verlocity22222222###########");   @b@        Velocity.init();   @b@        VelocityContext context = new VelocityContext(root);  @b@        org.apache.velocity.Template template = null;   @b@//        template = Velocity.getTemplate(getTemplatePath()+""+getTemplate()); @b@        template = Velocity.getTemplate("/src/"+getClassPathName("/")+"/"+getTemplate());@b@        StringWriter sw = new StringWriter(); @b@        template.merge(context, sw );   @b@        System.out.print(sw.toString());   @b@  @b@    }@b@    @b@    protected  String getPathString(){@b@        return System.getProperty("user.dir")+this.currPath;@b@    }@b@    @b@    /**@b@     * getClassPathName("/") 输出:com/test/..@b@     * @param tokenizer@b@     * @return@b@     */@b@    public String getClassPathName(String tokenizer){@b@        StringTokenizer st=new StringTokenizer(this.getClass().getName(),".");@b@        StringBuffer sb=new StringBuffer("");@b@        while(st.hasMoreElements()){@b@            sb.append(st.nextElement()+tokenizer);@b@        }@b@        String temp_=sb.substring(0, sb.length()-1);@b@        temp_=temp_.substring(0,temp_.lastIndexOf(tokenizer));@b@        return temp_;@b@    }@b@     @b@@b@}

5.模板引擎接口velocity及freemarker实现类(FreemarkerTemplateEngine.java、)

import java.util.Map;@b@@b@public class FreemarkerTemplateEngine extends AbstractTemplateEngine {@b@@b@    private static final String DEFAULT_TEMPLATE = "FreemarkerExample.ftl";   @b@    @b@    /**  @b@     * 这个方法应该实现的是读取配置文件  @b@     */  @b@    public String getTemplatePath() {   @b@//        return this.getPathString()+""+DEFAULT_TEMPLATE;   @b@        return this.getPathString();@b@    }   @b@       @b@    public void run(Map root) throws Exception{   @b@        super.run(root);   @b@    }   @b@  @b@    public String getTemplate() {   @b@        // TODO Auto-generated method stub   @b@        return DEFAULT_TEMPLATE;   @b@    }   @b@  @b@    public String getEngineType() {   @b@        return Constants.ENGINE_TYPE_FREEMARKER;   @b@    }   @b@    @b@    public static void main(String[] args){@b@        @b@        System.out.println(FreemarkerTemplateEngine.class.getClassLoader().getResource("").getPath());@b@        @b@        System.out.println(FreemarkerTemplateEngine.class.getName());@b@        @b@        System.out.println(System.getProperty("user.dir")); @b@        @b@        AbstractTemplateEngine f=new FreemarkerTemplateEngine();@b@        @b@        System.out.println(f.getPathString());@b@    }@b@@b@}
 import java.util.Map;@b@ @b@public class VelocityTemplateEngine extends AbstractTemplateEngine {@b@@b@    private static final String DEFAULT_TEMPLATE = "VelocityExample.vm";   @b@      @b@    public String getTemplatePath() {   @b@//        return this.getPathString()+""+DEFAULT_TEMPLATE;   @b@        return this.getPathString();@b@    }   @b@       @b@    public void run(Map map) throws Exception{   @b@        super.run(map);   @b@    }   @b@  @b@    public String getTemplate() {   @b@        // TODO Auto-generated method stub   @b@        return DEFAULT_TEMPLATE;   @b@    }   @b@  @b@    public String getEngineType() {   @b@        // TODO Auto-generated method stub   @b@        return Constants.ENGINE_TYPE_VELOCITY;   @b@    }   @b@@b@}

6.常量公共参数定义接口(Constants.java)

public interface Constants {@b@    @b@    String ENGINE_TYPE_VELOCITY="VELOCITY";@b@    @b@    String ENGINE_TYPE_FREEMARKER="FREEMARKER";@b@@b@}

完整代码下载,请点击template.rar