当前位置: 首页 > 面试题库 >

Apache Velocity:是否存在从命令行验证模板正确性的标准方法?

澹台志诚
2023-03-14
问题内容

我们的网站使用Apache
Velocity
模板语言。我们的内容管理系统已经检查了所有生成的XML文档的格式是否正确。我们被要求在将文件推送到实际站点之前检查文档以捕获Velocity语法错误。

是否有从命令行验证Velocity模板正确性的标准方法?

我准备读入模板路径,初始化Velocity
Engine,解析模板,并捕获所有错误,如本页上所示,但是如果有现成的工具可以获取文件和配置,并吐出任何错误,那么我宁愿使用它。

更新资料

我最终要做的是:

package velocitysample;

import java.io.IOException;
import java.io.StringWriter;
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.MethodInvocationException;

public class Main
{
   /** Define a static logger variable so that it references the Logger
    *  instance named "MyApp".
    */
    private static Logger logger = Logger.getLogger(Main.class);


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {

        /* Set up a simple log4j configuration that logs on the console. */
        BasicConfigurator.configure();


        /* Check to see that a template path was passed on the command line. */
        if (args.length != 1)
        {
            logger.fatal("You must pass the path to a template as a " +
                    "command line argument.");
            return;
        }

        /* Pull the template filename from the command line argument. */
        String fileName = args[0];

        try
        {
            Velocity.setProperty("resource.loader", "file");
            Velocity.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
            Velocity.setProperty("file.resource.loader.path", "/templates/");
            Velocity.setProperty("file.resource.loader.cache", "false");
            Velocity.setProperty("file.resource.loader.modificationCheckInterval", "0");

            Velocity.init();
        }
        catch (Exception ex)
        {
            logger.fatal("Error initializing the Veolcity engine.", ex);
            return;
        }

        boolean error = false;

        /* Create an empty Velocity context */
        VelocityContext context = new VelocityContext();

        Template template = null;

        try
        {
           template = Velocity.getTemplate(fileName);
        }
        catch( ResourceNotFoundException rnfe )
        {
           logger.error("Couldn't find the template to parse at this path: " +
                   fileName + ".", rnfe);
           error = true;
        }
        catch( ParseErrorException peex )
        {
            logger.error("Error parsing the template located at this path: " +
                    fileName + ".", peex);
            error = true;
        }
        catch( MethodInvocationException mie )
        {
            logger.error("Something invoked in the template (" + fileName +
                    ") threw an Exception while parsing.", mie);
            error = true;
        }
        catch( Exception e )
        {
            logger.error("An unexpected exception was thrown when attempting " +
                    "to parse the template: " + fileName + ".", e);
            error = true;
        }

        if (error)
        {
            return;
        }

        StringWriter sw = new StringWriter();
        try
        {
            template.merge(context, sw);
        } 
        catch (ResourceNotFoundException rnfe)
        {
            logger.error("Couldn't find the template to merge at this path: " +
                   fileName + ".", rnfe);
            error = true;
        } 
        catch (ParseErrorException peex)
        {
            logger.error("Error parsing the template at this path during merge: " +
                    fileName + ".", peex);
            error = true;
        } 
        catch (MethodInvocationException mie)
        {
            logger.error("Something invoked in the template (" + fileName +
                    ") threw an Exception while merging.", mie);
            error = true;
        } 
        catch (IOException ioe)
        {
            logger.error("Error reading the template located at this path from " +
                    "disk: " + fileName + ".", ioe);
            error = true;
        }
        catch( Exception e )
        {
            logger.error("An unexpected exception was thrown when attempting " +
                    "to merge the template: " + fileName + ".", e);
            error = true;
        }

        if (!error)
        {
            logger.info("No syntax errors detected.");
        }
    }
}

问题答案:

Velocity附带有一个名为TemplateTool的工具,该工具可转储所有引用,并且可用于验证模板的语法。

但是,您必须正确设置上下文才能验证任何模板。因此,最好的验证方法是根据自己的上下文编写自己的工具。



 类似资料:
  • 问题内容: Redis中命令的准确性如何? 我注意到,返回的键数与命令返回的实际键数不匹配。 这是一个例子: 为什么键数比实际数字高得多? 问题答案: 我想说这与密钥到期有关。 键/值存储(例如Redis或memcached)无法为每个要过期的对象定义物理计时器。他们太多了。取而代之的是,他们定义一个数据结构以轻松跟踪要过期的项目,并将所有过期事件多路复用到单个物理计时器。他们还倾向于实施惰性策略

  • 例如,如果我的程序是这样正确启动的: 但是,我想阻止用户输入此表单以外的内容。 因此,只要命令行参数的格式不是我希望我的程序退出并打印错误代码。 我不知道怎么做。对于这种情况,如果有人输入什么,我只是用ArrayIndexOutofBound尝试捕捉,但我不知道如何特别捕捉每一个可能的命令行参数,这是不正确的形式。

  • 问题内容: 在EJS github页面上,只有一个简单的示例:https : //github.com/visionmedia/ejs 例 这似乎是在检查是否存在名为user的变量,如果存在,请执行一些操作。h,对不对? 我的问题是,如果用户变量不存在,为什么世界上Node会抛出ReferenceError?这使上面的示例无效。检查变量是否存在的适当方法是什么?我是否应该使用try / catch

  • 问题内容: 我需要一个独立于平台的(Linux / Unix | OSX)shell / bash命令,该命令将确定特定进程是否正在运行。例如,…最简单的方法/命令是什么? 问题答案: 尽管和是确定正在运行的工具的绝佳工具,但不幸的是,它们在某些操作系统上均不可用。确定的故障保护将使用以下内容: Gentoo Linux上的输出: OS X上的输出: 在Linux和OS X上,grep都会返回退出

  • 问题内容: 这比任何语言或解析器更重要的是程序的调用(尽管我确定解析器库的选择可以取决于此)。看,我已经使用了很多Linux命令行实用程序。并且有一些明显的模式。对于短选项,’-‘之前是单个字母,可以组合多个不带参数的选项,’-‘在长版本的选项之前,依此类推。 但是,在某些情况下,大写字母用于 反转 期权。所以,“-D”可能意味着作为守护程序运行,但“-D”将 不 作为后台进程运行。(为什么不不想

  • 问题内容: 有一个像这样的简单Python类: 我想检查以下约束: “说明不能为空” “值必须大于零” 我应该: 1.在创建垃圾邮件对象之前验证数据吗? 2.检查方法上的数据? 3.在Spam类上创建一个方法,并使用spam.isValid()进行调用? 4.在Spam类上创建一个静态方法,并使用Spam.isValid(description,value)进行调用? 5.检查二传手声明中的数据?