前言
在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