当前位置:文档之家› 模板:velocity和freemarker的比较

模板:velocity和freemarker的比较

模板:velocity和freemarker的比较
模板:velocity和freemarker的比较

关键字: 模板技术

/**

*作者:张荣华(ahuaxuan)

*2007-04-16

*转载请注明出处及作者

*/

模板技术在现代的软件开发中有着重要的地位,而目前最流行的两种模板技术恐怕要算freemarker和velocity了,webwork2.2对两者都有不错的支持,也就是说在webwork2中你可以随意选择使用freemarker或velocity作为view,模板技术作为view的好处是很多,尤其和jsp比较起来优点更大,众所周知jsp 需要在第一次被执行的时候编译成servlet,那么这个过程是很慢的,当然很多应用服务器都提供预编译的功能,但是在开发的时候仍然给我们程序员带来了很多痛苦,每次修改都要多几秒钟,那在一天的开发中就有很多时间浪费在jsp

的编译上了。用webwork in action的作者的话来说:“每次修改之后重新运行都要等等几秒是令人失望的,而频繁地修改jsp更是会令你的失望情绪变本加厉“。我们把模板技术引入到view中去可以带来更好的开发效率,而且模板的速度要比jsp快(虽然编译过后的jsp在速度上已经满足我的需求了,呵呵)。当然模板技术可以用在很多领域,可不只在view那里。我们可以通过模板技术来生成xml,生成jsp,生成java文件等等,说到这里,大家通常会使用模板技术用在公司的框架里,这样就可以很快速的生成添删改查的代码,需要的只是模板,其他比如还有邮件模板等等。

以上是模板的作用,当然模板还有其他领域的应用,希望能和大家多讨论,提高我们的生产效率。

那么现在开源的模板技术有好几种,多了之后就有一个选择的问题了,如何选择一个满足自己需要的模板的呢,我大概了看了一下两种模板技术,写了一个例子,我使用了几种设计模式来完成了这个例子,这个例子中,我同时使用了freemarker和velocity,这样同学们可以通过代码很直观的比较两种模板技术,通过这个例子,我认识到freemarker在功能上要比velocity强大

1在view层的时候,它提供了format日期和数字的功能,我想大家都有在页面上format日期或数字的经验,用jsp的同学可能对jstl的fmt标签很有感情,使用了freemarker之后也可以使用freemarker提供的功能来formmat日期和数据,这个功能我想是很贴心的

2通过我的使用我发现freemaker的eclipseplugin要比velocity的eclipseplugin好,如果你是用idea那很遗憾,我没有找到类似的插件。好在很多地方呢,我看到的是freemarker的插件除了支持freemarker语法也支持html语句,而velocity的插件貌似只支持velocity的语法,html就只是用普通的文本来显示了,在这一点上freemarker占上风了(不要和我说高手都是用windows记事本之类的话,这本来就违背了模板技术的初衷)

3freemarker对jsptag的支持很好,算了,不到迫不得已还是不要这样做吧。

还有就是两者的语法格式,这一点上不同的人有不同倾向

下面就介绍一下这个例子吧

Java代码

1./**

2. *

3. * @author 张荣华

4. * 转载请注明出处

5. */

6.public class TemplateTest {

7.

8. /**

9. * @param args

10. */

11. public static void main(String[] args) throws Exception{

12. /* 准备数据 */

13. Map latest = new HashMap();

14. latest.put("url", "products/greenmouse.html");

15. latest.put("name", "green mouse");

16.

17. Map root = new HashMap();

18. root.put("user", "Big Joe");

19. root.put("latestProduct", latest);

20. root.put("number", new Long(2222));

21. root.put("date",new Date());

22.

23. List listTest = new ArrayList();

24. listTest.add("1");

25. listTest.add("2");

26.

27. root.put("list",listTest);

28.

29. TemplateEngine freemarkerEngine = (TemplateEngine)Templ

ateFactory.getInstance().getBean("freemarker");

30. freemarkerEngine.run(root);//使用freemarker模板技术

31.

32. TemplateEngine velocityEngine = (TemplateEngine)Templat

eFactory.getInstance().getBean("velocity");

33. velocityEngine.run(root);//使用velocity模板技术

34. }

35.

36.}

工厂类,用来得到模板引擎

Java代码

1./**

2. *

3. * @author 张荣华

4. * 转载请注明出处

5. */

6.public class TemplateFactory {

7. private static TemplateFactory instance;

8. private Map objectMap;

9.

10. static{

11. instance = new TemplateFactory();

12. }

13.

14. public TemplateFactory() {

15. super();

16. this.objectMap = new HashMap();

17. synchronized (this) {

18. objectMap.put("freemarker", new FreemarkerTemplateE

ngine(){

19. public String getTemplatePath() {

20. return "template";

21. }

22. });

23.

24. objectMap.put("velocity", new VelocityTemplateEngin

e());

25. }

26. }

27.

28. public static TemplateFactory getInstance(){

29. return instance;

30. }

31.

32. /**

33. * 模仿spring的工厂

34. * @param beanName

35. * @return

36. */

37. public Object getBean(String beanName){

38. return objectMap.get(beanName);

39. }

40.

41.}

引擎接口

Java代码

1./**

2. *

3. * @author 张荣华

4. * 转载请注明出处

5. */

6.public interface TemplateEngine {

7.

8. void run(Map context)throws Exception;

9.

10.}

模板引擎的实现使用method template模式,因为有两个实现,这两个实现又存在公共的逻辑,所以选择了这个模式

Java代码

1./**

2. *

3. * @author 张荣华

4. * 转载请注明出处

5. */

6.public abstract class AbstractTemplateEngine implements Templat

eEngine{

7.

8. public abstract String getTemplatePath();

9.

10. public abstract String getTemplate();

11.

12. public abstract String getEngineType();

13.

14. public void run(Map context)throws Exception{

15. if(Constants.ENGINE_TYPE_FREEMARKER.equals(getEngineTyp

e()))

16. executeFreemarker(context);

17. else

18. executeVelocity(context);

19. }

20.

21. private void executeFreemarker(Map context)throws Exception

{

22. Configuration cfg = new Configuration();

23. cfg.setDirectoryForTemplateLoading(

24. new File(getTemplatePath()));

25. cfg.setObjectWrapper(new DefaultObjectWrapper());

26.

27. cfg.setCacheStorage(new freemarker.cache.MruCacheStorag

e(20, 250));

28.

29. Template temp = cfg.getTemplate(getTemplate());

30.

31. Writer out = new OutputStreamWriter(System.out);

32. temp.process(context, out);

33. out.flush();

34. }

35.

36. private void executeVelocity(Map root)throws Exception{

37.

38. Velocity.init();

39. VelocityContext context = new VelocityContext(root);

40. org.apache.velocity.Template template = null;

41.

42. template = Velocity.getTemplate(getTemplatePath()+getTe

mplate());

43.

44. StringWriter sw = new StringWriter();

45. template.merge( context, sw );

46. System.out.print(sw.toString());

47.

48. }

49.

50.}

这个是freemarker实现

Java代码

1./**

2. *

3. * @author 张荣华

4. * 转载请注明出处

5. */

6.public class FreemarkerTemplateEngine extends AbstractTemplateE

ngine{

7. private static final String DEFAULT_TEMPLATE = "FreemarkerE

xample.ftl";

8.

9. /**

10. * 这个方法应该实现的是读取配置文件

11. */

12. public String getTemplatePath() {

13. return null;

14. }

15.

16. public void run(Map root) throws Exception{

17. super.run(root);

18. }

19.

20. public String getTemplate() {

21. // TODO Auto-generated method stub

22. return DEFAULT_TEMPLATE;

23. }

24.

25. public String getEngineType() {

26. return Constants.ENGINE_TYPE_FREEMARKER;

27. }

28.}

这个是velocity实现

Java代码

1./**

2. *

3. * @author 张荣华

4. * 转载请注明出处

5. */

6.public class VelocityTemplateEngine extends AbstractTemplateEng

ine{

7.

8.private static final String DEFAULT_TEMPLATE = "VelocityExample

.vm";

9.

10. public String getTemplatePath() {

11. return "/template/";

12. }

13.

14. public void run(Map map) throws Exception{

15. super.run(map);

16. }

17.

18. public String getTemplate() {

19. // TODO Auto-generated method stub

20. return DEFAULT_TEMPLATE;

21. }

22.

23. public String getEngineType() {

24. // TODO Auto-generated method stub

25. return Constants.ENGINE_TYPE_VELOCITY;

26. }

27.}

以下是模板

1,freemarker模板

Java代码

1.freemarker template test:

2.string test-----------${user}-----------${number}-----------${l

atestProduct.url}-----------${https://www.doczj.com/doc/bc11245168.html,}

3.condition test-----------

4.<#if user == "Big Joe">

5.list iterator-----------

6.<#list list as aa>

7.${aa}

8.

9.

10.date test-----------${date?string("MMM/dd/yyyy")}

2,velocity模板

Java代码

1.***************************************************************

***************************************************

2.velocity template test:

3.string test-----------${user}-----------${number}-----------${l

atestProduct.url}-----------${https://www.doczj.com/doc/bc11245168.html,}

4.condition test-----------

5.#if ($user == "Big Joe")

6.list iterator-----------

7.#foreach( $aa in $list )

8.$aa

9.#end

10.#end

11.date test-----------${date}

至此整个例子就结束了,以上只是最简单的介绍,当然这两种技术还有待我们的深入研究。这个例子只不过是比较直观的表现两种技术的使用而已

而且如果想学习方法模板模式和工厂模式的同学可以下载代码看看

相关主题
文本预览
相关文档 最新文档