【问题标题】:Velocity string function速度串函数
【发布时间】:2011-08-09 15:07:36
【问题描述】:

我刚开始使用 Java Velocity。 现在我想创建一个 java 类模板。

package $app.package_namespace
public class ${app.name}Station

{
    #foreach($s_attribute in $app.station)
         $s_attribute.type $s_attribute.name,
    #end
    public $app.name Station(#foreach($s_attribute in $app.station)
                                 $s_attribute.type $s_attribute.name;
                             #end)
{
    #foreach($s_attribute in $app.station)
          $s_attribute.name=$s_attribute.name;
    #end
}
#foreach($s_attribute in $app.station)
    public ${s_attribute.type} get${s_attribute.name}()
    {
        return  get${s_attribute.name}();
    }
#end
}

问题是 s_attribute.name 第一个字符是小写的。当我为属性创建 getter 和 setter 函数时。我需要将第一个字符更改为大写。

有人知道怎么做吗?

【问题讨论】:

    标签: java velocity


    【解决方案1】:

    您可以在这些对象上调用标准 java 方法。如果s_attribute.name 是String 类型,您可以直接使用$s_attribute.name.toUpperCase() 或针对您的具体情况使用$s_attribute.name.substring(0,1).toUpperCase()$s_attribute.name.substring(1).toLowerCase()

    【讨论】:

    • 我希望你的意思是toUpperCasetoLowerCase
    • 是的,在这种情况下,同一个宏必须应用两次,一次用于第一个字符,一次用于字符串的其余部分。就个人而言,这是表示层,我会避免它。此外,在第二个字符串上执行 toLowerCase 是个坏主意,如果您的可验证对象称为 customerName,您会希望生成的方法是 getCustomerName 而不是 getCustomername。
    • @adarshr Oppa 是的.. 我的意思是 toUpperCase()/toLowerCase() - 自去年以来一直在做任何 java ! - 但是是的,你明白了。
    • @Ali - 是的,我在某种程度上同意 - 您可以在传入文本中出现各种格式不一致 - 因为您可能需要在某处编写实用程序函数并调用它来生成格式正确的名称/我想在这里强调的是 Velocity 支持在对象上调用标准方法,就像你在 java 中所做的那样。因此,如果在 myObj 的类上定义了该方法,则 $myObj.value 将与 $myObj.getValue() 相同。
    • 我认为toLowerCase() 可能会被删除以从velocity 的案例处理中获利。 IE。 $s_attribute.name.substring(0,1).toUpperCase()$s_attribute.name.substring(1)
    【解决方案2】:

    DisplayTool中有capitalize()方法:

    get${display.capitalize($s_attribute.name)}()
    

    【讨论】:

    • 天哪!我在 API 中看到了大写,但认为它是用于在后端格式化文本。这种用法也很有意义!
    • 这个${display.capitalize(...)} 对我不起作用。我的输出有${display.capitalize(...)}。我需要为 DisplayTool 做一些额外的事情吗?我正在使用直接香草速度 1.7
    • @KarthicRaghupathi DisplayTool 位于一个名为velocity-tools 的单独依赖项中。确保包含它,然后将 DisplayTool 添加到 VelocityContext。 vc.put("display",new DisplayTool());
    【解决方案3】:

    如果你使用commons-lang,你可以使用StringUtils类:

    context.put("StringUtils", org.apache.commons.lang3.StringUtils.class);
    

    然后在你的模板中:

    ...
    return  get$StringUtils.capitalize(s_attribute.name)();
    ...
    

    【讨论】:

    • 有没有办法在 AWS Appsync 的 VTL 模板中执行此操作?我不知道如何在 vtl 模板中导入一个类来调用这些字符串函数。我只想调用一个大写函数而不是自己写一个。
    【解决方案4】:

    您可以只创建 2 个方法 getName()getname() 那么当你使用${s_attribute.name}时,velocity将使用getname(),当你使用${s_attribute.Name}时,velocity将使用getName()方法。

    来自Velocity guide

    属性查找规则

    如前所述,属性通常指的是 父对象。在确定哪种方法时,速度非常聪明 对应于请求的属性。它尝试不同 基于几个既定命名约定的替代方案。这 确切的查找顺序取决于属性名称是否 以大写字母开头。对于小写名称,例如 $customer.address,顺序为

    getaddress()
    getAddress()
    get("address")
    isAddress()
    

    对于像 $customer.Address 这样的大写属性名称,略有不同:

    getAddress()
    getaddress()
    get("Address")
    isAddress()
    

    我的建议是你在后端的对象中处理它。

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多