精华内容
下载资源
问答
  • java模板引擎
    2021-03-05 21:13:35

    目前功能已经全部完成了,暂定名字为ayada.

    Ayada是一个java版的模板引擎, 支持jstl语法, 支持el表达式. 支持自定义标签.

    1. 基本使用

    // webapp代表应用根目录

    // 如果页面使用了t:include指令, 则根目录必须指定

    // TemplateContext对模板进行管理, 默认情况下模板在修改5分钟之后重新编译,

    // 因此TemplateContext对象在应用中应该是单粒.

    TemplateContext templateContext = new TemplateContext("webapp");

    Template template = templateContext.getTemplate("/user/userList.tml");

    StringWriter writer = new StringWriter();

    PageContext pageContext = JspFactory.getPageContext(writer);

    List

    userList = UserHandler.getUserList(16);

    pageContext.setAttribute("userList", userList);

    DefaultExecutor.execute(template, pageContext);

    System.out.println(writer.toString());

    2. 自定义标签

    在classes目录下建taglib.tld文件, 内容如下:

    ## ---- compile tag ----

    t:taglib com.skin.ayada.jstl.core.LibTag

    ## ---- jstl.core ----

    ## default tag support

    c:if com.skin.ayada.jstl.core.IfTag

    c:set com.skin.ayada.jstl.core.SetTag

    c:out com.skin.ayada.jstl.core.OutTag

    c:each com.skin.ayada.jstl.core.ForEachTag

    c:forEach com.skin.ayada.jstl.core.ForEachTag

    c:choose com.skin.ayada.jstl.core.ChooseTag

    c:when com.skin.ayada.jstl.core.WhenTag

    c:otherwise com.skin.ayada.jstl.core.OtherwiseTag

    c:comment com.skin.ayada.jstl.core.CommentTag按照该格式添加自定义标签即可.

    自定义标签支持两种引入方式.

    全局引入: 在taglib.tld文件中定义的都是全局标签

    局部引入: 在页面中引入, 使用

    局部引入的方式要求必须全局引入t:taglib(t:taglib可以在taglib.tld文件中修改为其他名字)

    建议使用全局引入的方式.

    3. el表达式

    el表达式解析采用的是ognl, ognl在对不存在的对象进行解析的时候会抛异常, 为了避免在页面中有过多的null检查

    因此对这种异常进行了屏蔽, 屏蔽的方式请参看ExpressionContext:

    // 此处覆盖了OgnlContext的get方法

    @Override

    public Object get(Object key)

    {

    Object value = this.pageContext.getAttribute(key.toString());

    // 如果此处拿到的对象为空, 则返回一个空的Map对象

    if(value == null)

    {

    return new HashMap();

    }

    return value;

    }

    4. 模板页面示例

    ------------------------------------------------------------

    test

    c:cout test

    ${user.userName}

    c:if test

    1 == 1

    c:each test

    ${varValue}

    my:hello test

    新添加了filter支持,这样不需要把模板渲染的代码写到servlet了,只需要配置一个filter即可

    TemplateFilter

    com.skin.ayada.filter.TemplateFilter

    home

    /template

    TemplateFilter

    /template/*

    FORWARD

    servlet示例

    public class HelloServlet extends HttpServlet{

    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{

    List userList = null; // userManager.getUserList();

    request.setAttribute("userList", userList);

    // forward之后会被TemplateFilter拦截进行模板渲染

    request.getRequestDispatcher("/template/user/userList.html").forward(request, response);

    }

    }

    下载地址: https://code.google.com/p/ayada/

    更多相关内容
  • 主要为大家详细介绍了Java实现简单的模板渲染的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Java后端模板引擎对比

    2021-03-15 11:45:02
    其工作模式如下: 二、java常用的模板引擎有哪些jsp:是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。Thymeleaf : 主要渲染xml,HTML,HTML5而且与springboot整合。Velocity:不仅可以用于...

    模板引擎是为了解决用户界面(显示)与业务数据(内容)分离而产生的。他可以生成特定格式的文档,常用的如格式如HTML、xml以及其他格式的文本格式。其工作模式如下:

    0e616bf8e1eeb9df1bedef67eb8de2a8.png

    二、java常用的模板引擎有哪些

    jsp:是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。

    Thymeleaf : 主要渲染xml,HTML,HTML5而且与springboot整合。

    Velocity:不仅可以用于界面展示(HTML.xml等)还可以生成输入java代码,SQL语句等文本格式。

    FreeMarker:功能与Velocity差不多,但是语法更加强大,使用方便。

    三、常用模板引擎对比

    由于jsp与thymeleaf主要偏向于网页展示,而我们的需求是生成java代码与mybatis配置文件xml。顾这里只对Velocity与FreeMarker进行对比。

    示例:1万次调用动态生成大小为25kb左右的mybatisxml文件

    1、Velocity 模板文件

    #foreach($map in $methodList)

    #if(${map.sqlType} == "select")

    ${map.desc}

    #elseif(${map.sqlType} == "insert")

    ${map.desc}

    #else

    #end

    #end

    2、Velocity java执行代码

    public class VelocityTest {

    public static void main(String[] args) {

    //得到VelocityEngine

    VelocityEngine ve = new VelocityEngine();

    //得到模板文件

    ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, "/Users/huhaiquan/project/database-proxy/database-proxy-server/src/test/resources");

    ve.init();

    Template template = ve.getTemplate("velocity.vm", "UTF-8");

    VelocityContext data = new VelocityContext();

    // Map data = new HashMap<>();

    data.put("mapperName", "com.xxx.mapperName");

    List methodList = DataUtils.createData(200);

    data.put("methodList", methodList);

    //

    try {

    //生成xml

    //调用merge方法传入context

    int num = 1;

    int total=10000;

    for (int i=0;i

    StringWriter stringWriter = new StringWriter();

    long curr = System.currentTimeMillis();

    template.merge(data, stringWriter);

    long end = System.currentTimeMillis();

    // stringWriter.flush();

    total+=(end-curr);

    }

    System.out.println("total="+total+",vag="+(total*1f/num));

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    }

    3、FreeMarker 模板文件

    ${method.desc}

    ${method.desc}

    #if>

    #list>

    4、FreeMarker 执行代码

    public class FreeMTest {

    public static Template getDefinedTemplate(String templateName) throws Exception{

    //配置类

    Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);

    cfg.setDirectoryForTemplateLoading(new File("/Users/huhaiquan/project/database-proxy/database-proxy-server/src/test/resources/"));

    cfg.setDefaultEncoding("UTF-8");

    cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);

    return cfg.getTemplate(templateName);

    }

    public static void main(String[] args){

    Map data = new HashMap<>();

    data.put("mapperName", "com.xxx.mapperName");

    List methodList =DataUtils.createData(200);

    data.put("methodList", methodList);

    try {

    Template template = getDefinedTemplate("freemarker.ftl");

    long total = 0;

    int num = 10000;

    for (int i=0;i

    StringWriter stringWriter = new StringWriter();

    long curr = System.currentTimeMillis();

    template.process(data,stringWriter);

    long end = System.currentTimeMillis();

    total+=(end-curr);

    // stringWriter.flush();

    // System.out.println(stringWriter.toString());

    }

    System.out.println("total="+total+",vag="+(total/num));

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    }

    四、特性对比

    项目名称版本10000次执行耗时社区支持文件语法功能Velocity2.112833ms较差较少简单,接近java一般FreeMarker2.3.284599ms较好较多简单强大,在日期、数字,国际化方面有健全的处理机制。

    结果:虽然网上对比结果一致为Velocity的性能高于FreeMarker,但是我的测试结果却完全相反,可能跟版本有关。语法方面,Velocity更接近java语法,学习成本低,FreeMarker本身提供的语法也相对简单。FreeMarker在社区支持,功能方面要比Velocity强大的多。

    展开全文
  • java渲染字符串模板,也就是说在java字符串模板中设置变量字符串,使用变量去渲染指定模板中设置好的变量字符串。下面介绍4种替换模板方式:1、使用内置String.formatString message = String.format("您好%s,晚上...

    java渲染字符串模板,也就是说在java字符串模板中设置变量字符串,使用变量去渲染指定模板中设置好的变量字符串。下面介绍4种替换模板方式:

    1、使用内置String.format

    String message = String.format("您好%s,晚上好!您目前余额:%.2f元,积分:%d", "张三", 10.155, 10);

    System.out.println(message);//您好张三,晚上好!您目前余额:10.16元,积分:10

    2、使用内置MessageFormat

    String message = MessageFormat.format("您好{0},晚上好!您目前余额:{1,number,#.##}元,积分:{2}", "张三", 10.155, 10);

    System.out.println(message);//您好张三,晚上好!您目前余额:10.16元,积分:10

    3、使用自定义封装

    。。。。。

    private static Matcher m = Pattern.compile("\\$\\{\\w+\\}").matcher(template);

    。。。。。

    public static String processTemplate(String template, Mapparams){

    StringBuffer sb= newStringBuffer();while(m.find()) {

    String param=m.group();

    Object value= params.get(param.substring(2, param.length() - 1));

    m.appendReplacement(sb, value==null ? "": value.toString());

    }

    m.appendTail(sb);returnsb.toString();

    }public static voidmain(String[] args){

    Map map= newHashMap();

    map.put("name", "张三");

    map.put("money", String.format("%.2f", 10.155));

    map.put("point", 10);

    message= processTemplate("您好${name},晚上好!您目前余额:${money}元,积分:${point}", map);

    System.out.println(message);//您好张三,晚上好!您目前余额:10.16元,积分:10

    }

    4、使用模板引擎freemarker

    首先引入freemarker.jar,这里以2.3.23版本为例,如果使用maven的配置pom.xml

    org.freemarker

    freemarker

    2.3.23

    try{

    map= newHashMap();

    map.put("name", "张三");

    map.put("money", 10.155);

    map.put("point", 10);

    Template template= new Template("strTpl", "您好${name},晚上好!您目前余额:${money?string(\"#.##\")}元,积分:${point}", new Configuration(new Version("2.3.23")));

    StringWriter result= newStringWriter();

    template.process(map, result);

    System.out.println(result.toString());//您好张三,晚上好!您目前余额:10.16元,积分:10

    }catch(Exception e){

    e.printStackTrace();

    }

    importfreemarker.template.Configuration;importfreemarker.template.Template;importfreemarker.template.Version;importjava.io.StringWriter;importjava.text.MessageFormat;importjava.util.HashMap;importjava.util.Map;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/*** Created by cxq on 2018-01-07.*/

    public classTpl {public staticConfiguration cfg;static{

    cfg= new Configuration(new Version("2.3.23"));

    }public static voidmain(String[] args) {

    Object[] obj= new Object[]{"张三", String.format("%.2f", 10.155), 10};

    System.out.println(processFormat("您好%s,晚上好!您目前余额:%s元,积分:%d", obj));

    System.out.println(processMessage("您好{0},晚上好!您目前余额:{1}元,积分:{2}", obj));

    Map map= newHashMap();

    map.put("name", "张三");

    map.put("money", String.format("%.2f", 10.155));

    map.put("point", 10);

    System.out.println(processTemplate("您好${name},晚上好!您目前余额:${money}元,积分:${point}", map));

    System.out.println(processFreemarker("您好${name},晚上好!您目前余额:${money}元,积分:${point}", map));

    }/*** String.format渲染模板

    *@paramtemplate 模版

    *@paramparams 参数

    *@return

    */

    public staticString processFormat(String template, Object... params) {if (template == null || params == null)return null;returnString.format(template, params);

    }/*** MessageFormat渲染模板

    *@paramtemplate 模版

    *@paramparams 参数

    *@return

    */

    public staticString processMessage(String template, Object... params) {if (template == null || params == null)return null;returnMessageFormat.format(template, params);

    }/*** 自定义渲染模板

    *@paramtemplate 模版

    *@paramparams 参数

    *@return

    */

    public static String processTemplate(String template, Mapparams) {if (template == null || params == null)return null;

    StringBuffer sb= newStringBuffer();

    Matcher m= Pattern.compile("\\$\\{\\w+\\}").matcher(template);while(m.find()) {

    String param=m.group();

    Object value= params.get(param.substring(2, param.length() - 1));

    m.appendReplacement(sb, value== null ? "": value.toString());

    }

    m.appendTail(sb);returnsb.toString();

    }/*** Freemarker渲染模板

    *@paramtemplate 模版

    *@paramparams 参数

    *@return

    */

    public static String processFreemarker(String template, Mapparams) {if (template == null || params == null)return null;try{

    StringWriter result= newStringWriter();

    Template tpl= new Template("strTpl", template, cfg);

    tpl.process(params, result);returnresult.toString();

    }catch(Exception e) {return null;

    }

    }

    }

    综合,完整示例:

    http://www.weizhixi.com/user/index/article/id/53.html

    /*** 简单实现${}模板功能

    * 如${aa} cc ${bb} 其中 ${aa}, ${bb} 为占位符. 可用相关变量进行替换

    *@paramtemplateStr 模板字符串

    *@paramdata 替换的变量值

    *@paramdefaultNullReplaceVals 默认null值替换字符, 如果不提供, 则为字符串""

    *@return返回替换后的字符串, 如果模板字符串为null, 则返回null*/@SuppressWarnings("unchecked")public static String simpleTemplate(String templateStr, Mapdata, String... defaultNullReplaceVals) {if(templateStr == null) return null;if(data == null) data =Collections.EMPTY_MAP;

    String nullReplaceVal= defaultNullReplaceVals.length > 0 ? defaultNullReplaceVals[0] : "";

    Pattern pattern= Pattern.compile("\\$\\{([^}]+)}");

    StringBuffer newValue= newStringBuffer(templateStr.length());

    Matcher matcher=pattern.matcher(templateStr);while(matcher.find()) {

    String key= matcher.group(1);

    String r= data.get(key) != null ?data.get(key).toString() : nullReplaceVal;

    matcher.appendReplacement(newValue, r.replaceAll("\\\\", "\\\\\\\\")); //这个是为了替换windows下的文件目录在java里用\\表示

    }

    matcher.appendTail(newValue);returnnewValue.toString();

    }//测试方法

    public static voidmain(String[] args) {

    String tmpLine= "简历:\n 姓名: ${姓} ${名} \n 性别: ${性别}\n 年龄: ${年龄} \n";

    Map data = new HashMap();

    data.put("姓", "wen");

    data.put("名", "66");

    data.put("性别", "man");

    data.put("年龄", "222");

    System.out.println(simpleTemplate(tmpLine,null, "--"));

    }

    http://wen66.iteye.com/blog/830526

    static final String jsonStr = "{\"name\":\"11\",\"time\":\"2014-10-21\"}";static final String template = "亲爱的用户${name},你好,上次登录时间为${time}";staticString generateWelcome(String jsonStr,String template){

    Gson gson= newGson();

    HashMap jsonMap= gson.fromJson(jsonStr, HashMap.class);for(Object s : jsonMap.keySet()) {

    template= template.replaceAll("\\$\\{".concat(s.toString()).concat("\\}")

    , jsonMap.get(s.toString()).toString());

    }returntemplate;

    }public static void main(String[] args) throwsIOException {

    System.out.println(generateWelcome(jsonStr,template));

    }

    https://segmentfault.com/q/1010000002484866

    在开发中类似站内信的需求时,我们经常要使用字符串模板,比如

    尊敬的用户${name}。。。。

    里面的${name}就可以替换为用户的用户名。

    下面使用正则表达式简单实现一下这个功能:

    /*** 根据键值对填充字符串,如("hello ${name}",{name:"xiaoming"})

    * 输出:

    *@paramcontent

    *@parammap

    *@return

    */

    public static String renderString(String content, Mapmap){

    Set> sets =map.entrySet();for(Entryentry : sets) {

    String regex= "\\$\\{" + entry.getKey() + "\\}";

    Pattern pattern=Pattern.compile(regex);

    Matcher matcher=pattern.matcher(content);

    content=matcher.replaceAll(entry.getValue());

    }returncontent;

    }

    在map里存储了键值对,然后获取键值对的集合,遍历集合进行对字符串的渲染

    测试:

    @Testpublic voidrenderString() {

    String content= "hello ${name}, 1 2 3 4 5 ${six} 7, again ${name}. ";

    Map map = new HashMap<>();

    map.put("name", "java");

    map.put("six", "6");

    content=StringHelper.renderString(content, map);

    System.out.println(content);

    }

    有两个变量需要替换,name和six,对应的值分别为java和6,同时name调用了两次。

    结果:

    hello java, 1 2 3 4 5 6 7, again java.

    http://www.zgljl2012.com/javazheng-ze-biao-da-shi-shi-xian-name-xing-shi-de-zi-fu-chuan-mo-ban/

    展开全文
  • java工程中将word格式模板类型在浏览器中以pdf格式下载或预览,使用thymeleaf前端框架,maven工程的demo。
  • 使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持。 使用说明:https://blog.csdn.net/u012775558/article/details/79678701
  • 一、引言展示层有三大典型技术,分别是JSP、freemaker和velocity。本文主要介绍velocity。...源代码生成:Velocity 可以被用来生成 Java 代码、SQL 或者 PostScript。自动 Email:很多软件的用户注册、密码提醒...

    一、引言

    展示层有三大典型技术,分别是JSP、freemaker和velocity。本文主要介绍velocity。

    Velocity 主要使用场景如下:

    Web 应用:开发者在不使用 JSP 的情况下,可以用 Velocity 让 HTML 具有动态内容的特性。

    源代码生成:Velocity 可以被用来生成 Java 代码、SQL 或者 PostScript。

    自动 Email:很多软件的用户注册、密码提醒或者报表都是使用 Velocity 来自动生成的。

    转换 xml。

    二、入门

    velocity是一个基于java的模板引擎,与freemarker齐名,下面写一个velocity的hello world的demo。

    maven依赖

    org.apache.velocity

    velocity

    ${velocity.version}

    测试servelt

    import org.apache.velocity.Template;

    import org.apache.velocity.VelocityContext;

    import org.apache.velocity.app.VelocityEngine;

    import org.apache.velocity.runtime.RuntimeConstants;

    import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;

    import java.io.StringWriter;

    import java.util.ArrayList;

    import java.util.List;

    /**

    * ==Velocity之Hello Wordld入门程序==

    *

    * 首先,我们在代码中初始化了VelocityEngine这个模板引擎,对其设置参数进行初始化,

    * 指定使用ClasspathResourceLoader来加载vm文件。然后我们就可以往VelocityContext这个Velocity

    * 容器中存放对象了,在vm文件中我们可以取出这些变量,从而进行模板输出。

    */

    public class VelocityTest {

    private static final String VM_PATH = "template/velocity/helloworld.vm";

    public static void main(String[] args) {

    // 初始化模板引擎

    VelocityEngine velocityEngine = new VelocityEngine();

    velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");

    velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());

    velocityEngine.init();

    // 获取模板文件

    Template template = velocityEngine.getTemplate(VM_PATH);

    // 设置变量,velocityContext是一个类似map的结构

    VelocityContext velocityContext = new VelocityContext();

    velocityContext.put("name", "world");

    List list = new ArrayList();

    list.add("jack");

    list.add("kitty");

    velocityContext.put("list", list);

    // 输出渲染后的结果

    StringWriter stringWriter = new StringWriter();

    template.merge(velocityContext, stringWriter);

    System.out.println(stringWriter.toString());

    }

    }

    测试结果

    hello world

    1: This is jack

    2: This is kitty

    二、语法

    2.1 变量

    和我们所熟知的其他编程语言一样,Velocity 也可以在模板文件中有变量的概念。

    变量定义

    #set($name =“velocity”)

    等号后面的字符串 Velocity 引擎将重新解析,例如出现以$开始的字符串时,将做变量的替换。

    #set($hello =“hello $name”)

    上面的这个等式将会给 $hello 赋值为“hello velocity”

    变量的使用

    在模板文件中使用

    math?formula=name%20%E6%88%96%E8%80%85{name} 来使用定义的变量。推荐使用

    math?formula=%7Bname%7D%20%E8%BF%99%E7%A7%8D%E6%A0%BC%E5%BC%8F%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%9C%A8%E6%A8%A1%E6%9D%BF%E4%B8%AD%E5%90%8C%E6%97%B6%E5%8F%AF%E8%83%BD%E5%AE%9A%E4%B9%89%E4%BA%86%E7%B1%BB%E4%BC%BCname 和

    math?formula=names%20%E7%9A%84%E4%B8%A4%E4%B8%AA%E5%8F%98%E9%87%8F%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%B8%8D%E9%80%89%E7%94%A8%E5%A4%A7%E6%8B%AC%E5%8F%B7%E7%9A%84%E8%AF%9D%EF%BC%8C%E5%BC%95%E6%93%8E%E5%B0%B1%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%AF%86%E5%88%ABnames 这个变量。

    #set($name =“ricky”)

    Welcome $name to velocity.com

    2.2 循环

    在 Velocity 中循环语句的语法结构如下:

    #foreach($element in $list)

    This is $element

    $velocityCount

    #end

    Velocity 引擎会将 list 中的值循环赋给 element 变量,同时会创建一个 $velocityCount 的变量作为计数,从 1 开始,每次循环都会加 1.

    2.3 条件语句

    条件语句的语法如下:

    #if(condition)

    #elseif(condition)

    #else

    #end

    2.4 关系操作符

    Velocity 引擎提供了 AND、OR 和 NOT 操作符,分别对应&&、||和! 例如:

    #if($foo && $bar)

    #end

    2.5 宏

    Velocity 中的宏可以理解为函数定义。定义的语法如下:

    #macro(macroName arg1 arg2 …)

    #end

    调用这个宏的语法是:

    #macroName(arg1 arg2 …)

    这里的参数之间使用空格隔开,下面是定义和使用 Velocity 宏的例子:

    #macro(sayHello $name)

    hello $name

    #end

    #sayHello(“velocity”)

    输出的结果为 hello velocity

    2.6 内嵌和引用

    #parse 和 #include 指令的功能都是在外部引用文件,二者的区别是:

    #parse会将引用的内容当成类似于源码文件,会将内容在引入的地方进行解析

    #include是将引入文件当成资源文件,会将引入内容原封不动地以文本输出

    下面分别看两个例子:

    案例1:

    ## foo.vm 文件:

    #set($name =“velocity”)

    ## parse.vm文件:

    #parse(“foo.vm”)

    输出结果为:

    velocity

    案例2:

    ## foo.vm 文件:

    #set($name =“velocity”)

    ## include.vm:

    #include(“foo.vm”)

    输出结果为:

    #set($name =“velocity”)

    三、Spring整合velocity进行页面展示

    3.1 初步整合

    添加依赖

    org.apache.velocity

    velocity

    1.6.2

    org.apache.velocity

    velocity-tools

    2.0

    web.xml

    mvc-dispatcher

    org.springframework.web.servlet.DispatcherServlet

    contextConfigLocation

    classpath:springMVC.xml

    1

    mvc-dispatcher

    /

    编写/resources/spring-mvc.xml

    UTF-8

    UTF-8

    添加resources/velocity.properties

    ## 设置模板文件加载器,webapp从应用根目录加载

    resource.loader = webapp

    webapp.resource.loader.class = org.apache.velocity.tools.view.WebappResourceLoader

    ## 模板路径,根目录下的vm文件夹,比如访问http://localhost:8080/velocity/t.htm,则选中的模板路径是webapp/vm/t.htm,如果没配置,默认是模板路径是webapp/t.htm

    webapp.resource.loader.path = /vm

    ## 设置编码,不设置会中文乱码

    input.encoding = UTF-8

    output.encoding = UTF-8

    tools.view.servlet.layout.default.template=default.vm

    # 默认的布局文件位置

    tools.view.servlet.layout.directory=/WEB-INF/layout/

    编写webapp/vm/layout/layout.vm

    header

    $screen_content

    footer

    编写webapp/vm/test/index.vm

    hello world!${name}

    编写测试Controller

    import org.springframework.stereotype.Controller;

    import org.springframework.ui.Model;

    import org.springframework.web.bind.annotation.RequestMapping;

    /**

    * velocity与Spring MVC集成作为展示页面Demo

    */

    @Controller

    @RequestMapping(value = "/velocity")

    public class MyVelocityTestController {

    /**

    * 模拟首页

    *

    * @param model

    * @return

    */

    @RequestMapping(value = "/index")

    public String index(Model model) {

    String name = "tester";

    model.addAttribute("name", name);

    return "test/index";

    }

    3.2 velocity选择不同的模板

    系统中的登录页面所使用的模板与其他普通页面使用的模板不同,或者是某些页面需要引用不同的模板。

    先按照上节velocity(4) 的步骤配置好,通过以上配置后普通页面velocity会自动套用layout/default.vm模板。如果登录页面需套用自己独特的模板则如下可以在登录页面中添加:#set($layout="login_layout.vm"),则登录页面将套用"login_layout.vm"模板。

    编写webapp/vm/layout/empty.vm

    $screen_content

    webapp/test/login.vm

    #set($layout="layout/empty.vm")

    This is the login page

    完善测试controller

    import org.springframework.stereotype.Controller;

    import org.springframework.ui.Model;

    import org.springframework.web.bind.annotation.RequestMapping;

    /**

    * velocity与Spring MVC集成作为展示页面Demo

    */

    @Controller

    @RequestMapping(value = "/velocity")

    public class MyVelocityTestController {

    /**

    * 模拟首页

    *

    * @param model

    * @return

    */

    @RequestMapping(value = "/index")

    public String index(Model model) {

    String name = "tester";

    model.addAttribute("name", name);

    return "test/index";

    }

    /**

    * 模拟使用不一样模板的登录页

    *

    * @param model

    * @return

    */

    @RequestMapping(value = "/login")

    public String login(Model model) {

    return "test/login";

    }

    }

    测试

    测试1:访问localhost:8080/velocity/index

    bcba20eeab48

    test1

    测试2:访问localhost:8080/velocity/login

    bcba20eeab48

    test2

    可以看到,成功实现了不同页面引用和不引用公共模板的功能。

    四、参考资料

    展开全文
  • 使用jxls框架生成Excel,简单易懂。内含所使用的引用jar包版本。
  • 根据业务需要,需要在服务器端生成可动态配置的PDF文档,方便数据可视化查看。此文的测试是在客户端通过java程序的测试,直接运行java类获得成功!
  • template文件夹下放入xml模板, 运行Test.java文件, 可以生成word文档
  • poi-tl 的工作模式为: Template + data-model = output 1.1 为什么选用 poi-tl poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,你可以非常方便的加入到你的项目中,并且拥有着让人喜悦的...
  • file1、添加依赖org.thymeleafthymeleaf3.0.9.RELEASE2、编码工具类 HTMLTemplateUtils.javaimport org.thymeleaf.TemplateEngine;import org.thymeleaf.context.Context;.../*** HTML模板渲染工具类*/public class ...
  • 演示版 ...cd json-template-renderer mvn clean package java -Durl.rem=url.rem -jar target/jtr-*.jar src/test/resources/webapp ... 有时一个模板可以由多个模型文件渲染。 请使用查询参数来选择应使用模板呈现的模
  • java 生成Excel,可根据模板格式生成 Excel打印专用 报表 这个是旧版本的 ,需要新版本的 可以联系我
  • String template:resources下面的html模板名称,如magazine.html ,只要写magazine就可 String variableName 参数...通过springtemplateEngine将数据通过thymeleaf渲染模板上去,并获取到对应html源码: @Autowired .
  • java字符串模板渲染(freemarker,正则)

    千次阅读 2018-12-08 10:01:02
    当我传递一个map,指定上述参数的值后, 需要对字符串模板进行渲染 此类需求常见于短信模板 一、使用freemarker进行处理 FreeMarker是一款模板引擎 模板和数据是FreeMarker来生成输出所必须的组成部分:模板 + ...
  • 我知道这个问题一定在这里被问到,但是通过搜索我没有找到解决方案:我的问题是:什么是最好的Java库,“完全下载任何渗透和渲染内置的JavaScript,然后以编程方式访问渲染网页(即DOM-Tree!),并将DOM树作为”HTML -...
  • 最近项目中使用到了,对word模板进行编辑和渲染,所以使用到了模板引擎技术。在项目中,我们前端使用的富文本编辑器,进行展示和保存(和word格式一致),后端采用了freemarker进行数据的渲染。前端,就不多说了,处理...
  • Java渲染模板框架有很多,著名的有Velocity等。鉴于最近在学习java,所以自己实现了一个。
  • Java通过word模板导出word1.创建word模板文件,注意调整好格式,后期修改较为麻烦2.打开创建好的word模板,点击文件另存为,选择xml格式3.将生成的模板xml文件后缀改成ftl,例如:模板.xml-->模板.ftl4.在项目中...
  • 在刚工作做java开发的时候, 全都...java的服务器端渲染以使用Spring为例, 就是写个 Controller, 然后 return 一个模板引擎页面, 同时需要往模板页面中的变量设置值vue的服务器端渲染看官网是结合Express这个web框架...
  • 根据html模板生成新的html,很简单可以运行
  • 本篇介绍如何使用thymeleaf从后台获取数据后渲染至html页面上。
  • Java开源模板引擎

    万次阅读 2017-12-29 11:59:02
    它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计...
  • Springboot 模板渲染

    2019-10-24 15:08:05
    Springboot模板渲染 在之前所见到的信息显示发现都是以Rest风格进行显示,但是在实际开发之中, 所有数据的显示最终都应该交由页面去处理完成。在Springboot中这个页面并不是我之前的jsp ,FM这些而是普通的html...
  • Java模板引擎的使用

    2022-04-17 21:38:24
    Java 中的模板引擎的使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,521
精华内容 17,408
关键字:

java 模板渲染

java 订阅