精华内容
下载资源
问答
  • NULL 博文链接:https://jetway.iteye.com/blog/569436
  • jsp、freemarkervelocity简介和对比。---如果你已经开发Java Web应用程序一段时间,那么对于 JVM 的 PermGen 问题可能并不陌生。由于 FreeMarker 模板不编译成类,它们不占用 PermGen 空间,并不需要一个新的类...
  • (2)freemarker; (3)velocity; (4)thymeleaf; 2、jsp 优点: 1、功能强大,可以写java代码 2、支持jsp标签(jsp tag) 3、支持表达式语言(el) 4、官方标准,用户群广,丰富的第三方jsp标签库 5、性能良好。...

    1、概述

    在java领域,表现层技术主要有三种,

    (1)jsp;

    (2)freemarker;

    (3)velocity;

    (4)thymeleaf;

    2、jsp

    优点:

    1、功能强大,可以写java代码

    2、支持jsp标签(jsp tag)

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

    4、官方标准,用户群广,丰富的第三方jsp标签库

    5、性能良好。jsp编译成class文件执行,有很好的性能表现

    缺点:

    jsp没有明显缺点,非要挑点骨头那就是,由于可以编写java代码,如使用不当容易破坏mvc结构。

    3、freemarker

    FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。

    目前企业中:主要用Freemarker做静态页面或是页面展示

    优点:

    1、不能编写java代码,可以实现严格的mvc分离

    2、性能非常不错

    3、对jsp标签支持良好

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

    5、宏定义(类似jsp标签)非常方便

    6、使用表达式语言

    缺点:

    1、不是官方标准

    2、用户群体和第三方标签库没有jsp多

    选择freemarker的原因:

    1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。

    2、宏定义比jsp tag方便

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

    4、支持jsp标签

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

    4、velocity

    优点:

    1、不能编写java代码,可以实现严格的mvc分离

    2、性能良好,据说比jsp性能还要好些

    3、使用表达式语言,据说jsp的表达式语言就是学velocity的

    缺点:

    1、不是官方标准

    2、用户群体和第三方标签库没有jsp多。

    3、对jsp标签支持不够好

    5、thymeleaf

    Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非Web应用。

    Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板。相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可。接下来,这些标签属性就会在DOM(文档对象模型)上执行预先制定好的逻辑。Thymeleaf的可扩展性也非常棒。你可以使用它定义自己的模板属性集合,这样就可以计算自定义表达式并使用自定义逻辑。这意味着Thymeleaf还可以作为模板引擎框架。

    thymeleaf优点:静态html嵌入标签属性,浏览器可以直接打开模板文件,便于前后端联调。springboot官方推荐方案。thymeleaf缺点:模板必须符合xml规范,就这一点就可以判死刑!太不方便了!js脚本必须加入

    展开全文
  • freemarker&velocity的使用

    2019-05-31 01:26:19
    NULL 博文链接:https://longzhun.iteye.com/blog/1055208
  • 1.Freemarker public void message(String mark, String type, Orderform orderform, String userId, String shouhouleixing) { if (shouhouleixing.equals("0")) { shouhouleixing = "仅退款"...

    1.Freemarker

        public void message(String mark, String type, Orderform orderform, String userId, String shouhouleixing) {
            if (shouhouleixing.equals("0")) {
                shouhouleixing = "仅退款";
            } else if (shouhouleixing.equals("1")) {
                shouhouleixing = "退货退款";
            } else if (shouhouleixing.equals("2")) {
                shouhouleixing = "退货退款";
            }
            Map<String, Object> map = new HashMap<>();
            StringWriter writer = new StringWriter();
            try {
       			Template templates = this.templateService.getByMark(mark);
                // File file=new File("./src/main/resources/templates/freemarker/index.ftl");
                String path1 = this.getClass().getClassLoader().getResource("").getPath() + "templates/freemarker/index.ftl";
                System.out.println(path1);
                PrintWriter pwrite = new PrintWriter(new OutputStreamWriter(new FileOutputStream(path1)));
                pwrite.print(templates.getContent());
                pwrite.flush();
                pwrite.close();
                FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
                Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
                //加载模板
                ClassTemplateLoader ctl = new ClassTemplateLoader(getClass(), "/templates/freemarker");
                //cfg.setDirectoryForTemplateLoading(new File("./src/main/resources/templates/freemarker"));
                TemplateLoader[] loaders = new TemplateLoader[]{ctl};
                MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);
                cfg.setTemplateLoader(mtl);
                cfg.setDateFormat("yyyy-MM-dd HH:mm:ss");
                cfg.setEncoding(Locale.CHINA, "utf-8");
                cfg.setDefaultEncoding("utf-8");
                freeMarkerConfigurer.setConfiguration(cfg);
                Map<String, Object> context = new HashMap<>();
                context.put("send_time", new Date());
                context.put("shouhouleixing", shouhouleixing);
                context.put("orderForm", orderform);
                //获取模板
                Template template = cfg.getTemplate("index.ftl", "utf-8");
                template.process(context, writer);
                String content = writer.toString();
    
                String userName = "admin";
                IUser admin = this.userService.getUserByUserName(userName);
                Message msg = new Message();
                msg.setAddTime(new Date());
                msg.setContent(content);
                msg.setFromUserId(admin.getId());
                msg.setTitle(templates.getTitle());
                msg.setToUserId(Long.parseLong(userId));
                msg.setDeleteStatus(false);
                msg.setActivityType(0);
                msg.setStatus(0);
                msg.setReplyStatus(0);
                msg.setImportantStatus(false);
                if (type.equals("4")) {
                    msg.setType(4);
                } else if (type.equals("5")) {
                    msg.setType(5);
                }
                msg.setAuditStatus(1);
                msg.setActId(0);
                Integer save = this.messageService.save(msg);
                if (save > 0) {
                    map.clear();
                    map.put("message", "发送成功");
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TemplateException e) {
                e.printStackTrace();
            }
        }
    
    

    2.Velocity

    private void launchedAfterSale_template(String mark,TuiKuanShouHou tuiKuanShouHou,String type) throws Exception {
           Template template = this.templateService.getObjByProperty("mark", mark);
            if (template.isOpen()){
                String path = System.getProperty("********") + "vm" + File.separator;
                PrintWriter pwrite = new PrintWriter(
                        new OutputStreamWriter(new FileOutputStream(path + "msg.vm", false), "UTF-8"));
                pwrite.print(template.getContent());
                pwrite.flush();
                pwrite.close();
    
                Properties p = new Properties();
                p.setProperty("file.resource.loader.path", System.getProperty("****") + "vm" + File.separator);
                p.setProperty("input.encoding", "UTF-8");
                p.setProperty("output.encoding", "UTF-8");
                Velocity.init(p);
                org.apache.velocity.Template blank = Velocity.getTemplate("msg.vm", "UTF-8");
                VelocityContext context = new VelocityContext();
                context.put("tuiKuanShouHou", tuiKuanShouHou);
                context.put("config", this.configService.getSysConfig());
                context.put("send_time", CommUtil.formatLongDate(new Date()));
                context.put("webPath", this.configService.getSysConfig().getAddress());
                StringWriter writer = new StringWriter();
                blank.merge(context, writer);
    
                String content = writer.toString();
    
                User admin = this.userService.getObjByProperty("userName", "admin");
                Message msg = new Message();
                msg.setAddTime(new Date());
                msg.setContent(content);
                msg.setFromUser(admin);
                msg.setTitle(template.getTitle());
                msg.setToUser(tuiKuanShouHou.getOrderForm().getStore().getUser());
                if (type.equals("4")){
                    msg.setType(4);
                }else if (type.equals("5")){
                    msg.setType(5);
                }
                msg.setAuditStatus(1);
                this.messageService.save(msg);
                CommUtil.deleteFile(path + "msg.vm");
                writer.flush();
                writer.close();
            }
        }
    
    orderForm
        ${(send_time?string("yyyy-MM-dd HH:mm:ss"))!}
    
    展开全文
  • VelocityFreeMarker区别 对于大部分的应用来说,使用 FreeMarkerVelocity 更简单,因为 Velocity 还必须编写一些自定义的
  • 最近在写几个基于websocket的监控页面,改来改去(无产品参与,无PRD)到现在,产品希望用原来的模板(基于velocity),而我本身倾向于thymeleaf,(Velocity此前压根没用过啊而且1.5版本之后的spring boot是不支持...

    前言:
    最近在写几个基于websocket的监控页面,改来改去(无产品参与,无PRD)到现在,产品希望用原来的模板(基于velocity),而我本身倾向于thymeleaf,(Velocity此前压根没用过啊而且1.5版本之后的spring boot是不支持的)。而刚刚又收到上级通知,出一份前端框架的比较的文档。
    PS:
    由于本人是后台出身,对前端研究甚浅,以下分析内容均为认真拜读他人博客后的总结.
    先引用我偶像,那个很nb的开源中国秃顶创始人红薯老大的一句话:
    这里写图片描述
    一、简介
    FreeMarker:
    FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。
    所谓模板,就是一份已经写好了基本内容,有着固定格式的文档,其中空出或者用占位符标识的内容,由使用者来填充,不同的使用者给出的数据是不同的。在模板中的占位符,在模板运行时,由模板引擎来解析模板,并采用动态数据替换占位符部分的内容。
    FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 文等。
    Velocity:
    Velocity 是一个基于java 的模板引擎(template engine). 它可以让视图的设计者在web 页面中引用java 代码中定义的数据对象和命令。从而使Web designers 和java 开发者依照MVC 思想(Model-View-Controller )开发系统,这意味着Web designers 只须将精力注用于良好表现力的视图外观设计,而Java程序员则只要关心着如何写出高效简洁的java 对象以实现业务逻辑—–Velocity 会将他们组装到一起.

    二、功能区别

    日期和数字的支持
    FreeMarker可以对任意数量的类型执行运算和比较,包括任意精度类型,而不仅仅是整数。
    FreeMarker可以比较和显示(格式化)日期/时间值。
    国际化
    FreeMarker可以基于各种各样的内置和自定义数字或者日期格式,来格式化数字区域或者日期地区时区等。
    循环处理
    FreeMarker支持退出循环 ,可以在内部循环体去访问外部循环的变量
    并且可以得知当前是否到了循环的结束位置
    支持模版级别的数组处理
    可以用[i]的语法来访问数组元素,可以获取到数组的长度
    内置数据类型的操作
    FreeMarker能提示模版中的拼写错误以及其他错误。当访问一个不存在的变量时,FreeMarker 在执行时会报错,并且支持通过配置来指定 FreeMarker 在碰到此类错误的行为,同时会在日志中记录此错误信息; 如果输入错误的指令,FreeMarker将抛出一个异常。
    更高级的文本输出工具
    支持所有的Java字符串转义如:\ b,\ t,\ n,\ f,\ r,\“,\’,\,也支持\ xXXXX用UNICODE代码指定字符。
    高级的空格清除
    FreeMarker 可以自动的删除一些多余的空格、跳格、换行等字符
    也支持提供指令来删除多余的空格
    与其他技术的集成
    提供JSP 标签库以便在 JSP 中嵌入 FreeMarker 模版 可以直接跟 Python 对象一起工作
    三、选型:
    纵观各大国内外博客文章,几乎清一色的倒向FreeMarker这边。除了使用标签的性能更高,更多的还是FreeMarker支持功能多,以及更多的框架支持吧。
    PS:1.5及以上版本的spring boot已经不支持velocity。
    四、 常见语法比对:

    1.变量定义与赋值:
    Freemarker:
    <#assign x=”freemarker”>
    Velocity:
    <#set($x=”velocity”)>
    2.逻辑运算符
    FreeMarker和velocity一致:&& ;|| ; !
    3.逻辑判断:
    Freemarker:
    <#if condition><#elseif condition><#else></#if>
    <#switch value><#case refValue1><#break><#defalut></#switch>
    Velocity:
    if(condition)…#elseif(condition)…#else#end
    4.循环体
    FreeMarker:
    <#list list as item></#list>
    Velocity:
    #foreach($item in $list)
    5.属性引用:
    Freemarker和velocity一致,均为通过“.”来获取对象的属性值

    五、 整体比对
    这里写图片描述

    展开全文
  • java模版引擎freemarkervelocity的对比

    千次阅读 2016-09-06 19:33:12
    1.Freemarkerfreemarker的官网中看到,fm在2015-7-1后就托管给apache基金会了,后面的bug修改都来自于git。最近的一次更新在2016年6月,顺便值得一提的是,这个版本是最后一个版本了。 Around 2015-07-01, ...

    **

    一、是否维护

    **
    1.Freemarker
    在freemarker的官网中看到,fm在2015-7-1后就托管给apache基金会了,后面的bug修改都来自于git。最近的一次更新在2016年6月,顺便值得一提的是,这个版本是最后一个版本了。
    Around 2015-07-01, FreeMarker was voted in into the Apache Incubator, and the project (all code from which the releases and the Web site are created, along with the right for using the “FreeMarker” product name) was granted to the Apache Software Foundation by the earlier owners. The license remains Apache License, Version 2.0. In 2015-09-02, the main code base was imported from GitHub into the Apache Software Foundation infrastructure, where development continues.

    2.Velocity
    Velocity早在几年前的时候就已经托管给apache了,在git上我们可以看到,最新的更新是2010年的11月,说明velocity很多最新的bug已经没有人处理了,

    当然我们一定要用的话,还是有很多大神对velocity的bug进行了修改并提交了git,所以实质上我们要用的话,可以对git上的版本进行打包到我们的私服上。当然,如果大神改出了新bug也是有可能的。

    **

    二、性能对比。

    **
    1.针对10W条数据的模版生成对比
    生成的时间单位都是ms,fm用是2.3.25-incubating,vm用的是1.7
    Fm vm
    1 195 229
    2 121 223
    3 122 221
    4 120 733
    5 120 232
    6 150 396
    7 150 326
    8 273 198
    平均
    可以从数据中很轻易的看出fm的性能和稳定性都比vm好。
    下面是测试的代码
    vm:

    public void test(){
            VelocityEngine engine = new VelocityEngine();
            Properties p = new Properties();
            p.setProperty(VelocityEngine.RESOURCE_LOADER,"class");
            p.setProperty("class.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
            engine.init(p);
    
            Template template = engine.getTemplate("vm/test.vm","UTF-8");
    
            VelocityContext context = new VelocityContext();
    
            context.put("name","陈善奔");
            context.put("age","18");
            List<String> list = Lists.newArrayList();
            for (int i = 0; i < 100000; i++) {
                list.add(UUID.randomUUID().toString());
            }
            context.put("list",list);
    
            long one = System.currentTimeMillis();
            StringWriter writer = new StringWriter();
            System.out.println(one);
            template.merge(context,writer);
            System.out.println(System.currentTimeMillis() - one);
            //System.out.println(writer.toString());
        }
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>测试</title>
    
    </head>
    
    <body>
    <div class="main">
        <h2>测试</h2>
        <div>
            ${name},年龄${age}
            #foreach($uuid in ${list})
                <div>${uuid}</div>
            #end
        </div>
    </div>
    </body>
    
    </html>  

    freemarker的代码:

    public void test() throws TemplateException {
            Configuration cfg = new Configuration();
            ClassTemplateLoader ctl = new ClassTemplateLoader(getClass(),"/ftl");
    //        cfg.setDirectoryForTemplateLoading("ftl/");
            TemplateLoader[] loaders = new TemplateLoader[]{ctl};
            MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);
            cfg.setTemplateLoader(mtl);
            cfg.setEncoding(Locale.CHINA,"utf-8");
            cfg.setDefaultEncoding("utf-8");
    
            Map<String,Object> context = new HashMap<>();
            context.put("name","陈善奔");
            context.put("age","18");
            List<String> list = Lists.newArrayList();
            for (int i = 0; i < 100000; i++) {
                list.add(UUID.randomUUID().toString());
            }
            context.put("list",list);
            try {
                StringWriter sw = new StringWriter();
                Template template = cfg.getTemplate("test.ftl", "utf-8");
                long one = System.currentTimeMillis();
                System.out.println(one);
                template.process(context,sw);
                System.out.println(System.currentTimeMillis()-one);
                //System.out.println(sw);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>测试</title>
    </head>
    
    <body>
    <div class="main">
        <h2>测试</h2>
        <div>
        ${name},年龄${age}
            <#list list as uuid>
            <div>${uuid}</div>
            </#list>
        </div>
    </div>
    </body>
    
    </html>

    总结

    1.针对维护性来说,fm比vm来得更可靠一些。
    2.针对性能来说,fm比vm更稳定,更快,但实质上,两者还是在同一个数量级上。如果是对并发量特别高的还是采用fm吧。

    展开全文
  • (2)freemarker; (3)velocity; (4)thymeleaf; 2、jsp 优点: 1、功能强大,可以写java代码 2、支持jsp标签(jsp tag) 3、支持表达式语言(el) 4、官方标准,用户群广,丰富的第三方jsp标签库 5、性能良好...
  • freemarkervelocity、jsp的比较

    千次阅读 2017-01-17 19:32:19
    在java领域,表现层技术主要有三种:jsp、freemarkervelocity。 jsp是大家最熟悉的技术 优点: 1、功能强大,可以写java代码 2、支持jsp标签(jsp tag) 3、支持表达式语言(el) 4、官方标准,用户群广...
  • (2)freemarker;(3)velocity;(4)thymeleaf;(5)Enjoy; 1.JSP 优点: 1、功能强大,可以写java代码 2、支持jsp标签(jsp tag) 3、支持表达式语言(el) 4、官方标准,用户群广,丰富的第三方jsp标签库 5、...
  • FreeMarkerVelocity的区别

    万次阅读 2016-07-24 22:27:37
     相比较FreeMarker而言,Velocity更加简单、轻量级,但它的功能却没有FreeMarker那么强大。依据评测的结论, freemarker 稍快一些。差别在毫秒级别,对用户而言可以忽略不计,若超大流量,考虑负载时,较倾向后者...
  • freemarker Velocity获取request,session

    千次阅读 2017-04-13 09:11:54
    freemarker Velocity获取request,session
  • jsp freemarker velocity

    2018-06-04 10:15:37
    jsp是大家最熟悉的技术优点:1、功能强大,可以写java代码2、支持jsp标签(jsp tag)3、支持表达式语言(el)4、官方标准,用户群广,丰富的第三方jsp标签...velocity是较早出现的用于代替jsp的模板语言优点:1、不...
  • } else if(renderType.equals(ConstantRender.sql_renderType_freeMarker)){ if(log.isDebugEnabled()) log.debug("FreeMarker解析sql"); sql = ToolFreeMarker.render(sqlTemplete, param); } else if(renderType...
  • 模板技术-freemarkervelocity

    千次阅读 2015-07-25 19:36:37
    模板技术在现代的软件开发中有着重要的地位,而目前最流行的两种模板技术恐怕要算freemarkervelocity了,webwork2.2对两者都有不错的支持,也就是说在webwork2中你可以随意选择使用freemarkervelocity作为view,...
  • SpringBoot 推荐使用Thymeleaf 来代替JSP,那么Spring为什么会推荐使用Thymeleaf呢? Thymeleaf使用了自然的...Thymeleaf相比freemarkervelocity: Thymeleaf会在运行期替换掉静态值,freemaker和velocity则是连...
  • 在java领域,表现层技术主要有三种:jsp、freemarkervelocity。 jsp:是大家最熟悉的技术 优点: 1、功能强大,可以写java代码 2、支持jsp标签(jsptag) 3、支持表达式语言(el) 4、官方标准,用户群广,...
  • 在java中表现层实现技术主要分为三种:jsp、freemarkervelocity,那么我们如何区分使用呢?下面让我们分析一下它们的优缺点。 一、JSP应该是模板语言中用的最多技术,其特点属性如下: 1.支持java代码直接写入,...
  • Velocity静态模板引擎。类似的jsp语法,能多级编译,但文件名必须为vm。配置麻烦。层次级别不太好看。适合从事过jsp人员的使用。Freemarker静态模板引擎。类似标签语法,强力建议使用。不支持多级编译(这是硬伤,同时...
  • FreeMarkervelocity 原理 在Struts2框架下,Struts2框架充当了之前的Servlet角色,只要浏览器的请求经过Struts2处理后,Struts2都会自动加载FreeMarker模板, 并使用数据模型来填充该模板,再调用servlet的 " ...
  • I updated the POM to reflect the latest releases of Freemarker (2.3.23). I considered the beta release of Thymeleaf as they claim a significant performance boost. Velocity & JSP are the same as be...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,969
精华内容 8,787
关键字:

freemarkervelocity