struts2里有select标签,可以方便的生成html的select元素.
用velocity以后,怎么用select标签呢
第一,可以用#sselect.事实上,在velocity页面中,可以使用#s的前缀来使用struts2的标签
详情见
http://struts.apache.org/release/2.3.x/docs/velocity-tags.html
第二,用velocity的宏来实现自定义组件.
先考虑一个普通java类Bar,有foo和bar两个属性,在velocity中访问这两个属性,可以用
$bar.foo
$bar.bar
但是如何能动态指定要访问的属性呢?
evaluate指令可以用来在运行时动态解析模板语言.
#set($prop="bar")
#evaluate("\$bar.$prop")
#set($prop="foo")
#evaluate("\$bar.$prop")
其中"\"用来转义"$"
下面用宏来组成一个自定义的select元素
#macro (fooList $list $name $listKey $listValue $headerKey $headerValue)
#set($currentValueExpression = "$$name")
#set($currentValue = "#evaluate($currentValueExpression)")
<select name="$name">
#if( $headerKey && $headerValue )
<option value="$headerKey">$headerValue</option>
#end
#foreach( $v in $list )
#set($dynamicValueExpression = "\$v.$listValue")
#set($dynamicKeyExpression = "\$v.$listKey")
#set($dynamicKey = "#evaluate($dynamicKeyExpression)")
<option value="$dynamicKey"
#if( $dynamicKey == $currentValue )
selected="selected"
#end>
#evaluate($dynamicValueExpression)</option>
#end
</select>
#end
这样来调用这个宏,产生类似于struts2 select标签的效果
#fooList($barList "currentBarId" "fooId" "fooName")
最后吐槽下velocity的文档,它说调用宏的时候,传递的参数个数必须和定义时一致
引用
when the Velocimacro is invoked, it must be called with the same number of arguments with which it was defined
那现在如果我硬少几个参数,照样能调用,也不报错,那个"must"真是莫大的讽刺....
分享到:
相关推荐
Velocity 是一个基于Java的模板引擎,它允许网页设计师在页面中嵌入动态内容,而无需直接接触Java代码。通过Velocity,网页设计师可以专注于设计工作,而程序员则可以专注于编写高效的应用代码,实现了Model-View-...
在初始化时,开发者通常会创建一个或多个VelocityContext实例,将需要在模板中使用的变量放入其中。 2. **配置VelocityProperties** 在初始化Velocity之前,需要配置Velocity的属性。这通常通过`Properties`类来...
`将一个名为"user"的对象放入上下文,然后在模板中使用`$user`。 3. **Velocity模板引擎配置** - 可以通过VelocityConfigurer类配置Velocity引擎,比如设置模板路径、编码格式、缓存策略等。 - `Velocity.init()`...
在本文中,我们将深入探讨Velocity的核心概念、使用方法以及如何将其应用于实际项目。 **一、Velocity简介** Velocity是Apache软件基金会的一个开源项目,它提供了简单易用的模板语言,用于生成HTML、XML、电子邮件...
- **Velocity Context**:存储模板中使用的变量和方法,它是模板和Java对象之间的桥梁。 - **Directives**:如`#set`, `#if`, `#foreach`等,用于控制模板的逻辑流程。 - **Macros**:可重用的模板片段,类似于...
Velocity模板语言(VTL)是Velocity的核心,它允许开发者在模板文件中使用特定的指令和变量。例如,`#set`用于设置变量,`$variable`用于输出变量,`#if`、`#else`、`#end`用于条件判断,`#foreach`用于循环迭代。...
3. **设置 Context**:将需要在模板中使用的 Java 对象放入 Context。 ```java VelocityContext context = new VelocityContext(); context.put("name", "World"); ``` 4. **渲染模板**:使用 VelocityEngine 和 ...
- **resources** 目录:可能存储 Velocity 配置文件(如 `velocity.properties`),以及应用中使用的资源文件。 - **src/main/java** 目录:包含 Velocity 相关的 Java 类,如控制器、模型类和 velocity 工具类。 - ...
在这个"Velocity简单案例"中,我们可以推测其包含了一个基础的Velocity模板使用示例,可能包括以下几个关键知识点: 1. **Velocity模板语言(VTL)**: VTL是一种声明式语言,允许开发者在模板中插入变量、控制结构...
Velocity的工作原理是,它解析含有 Velocity指令的模板文件,这些指令通常是以`$`或`#`开头的特殊标记,然后在运行时将这些指令与Java对象中的数据进行结合,最终生成输出。这种方式极大地简化了Web应用中视图层的...
- **属性(Properties)**:配置 Velocity 的方法及其如何在模板中使用。 - **方法(Methods)**:调用 Java 方法的方式。 - **属性查找规则(Property Lookup Rules)**:解释 Velocity 如何查找并解析属性。 - **...
Velocity 还有其他指令,如 `#stop` 用于停止模板的处理,`#parse` 用于解析另一个文件,`#evaluate` 用于执行 Java 表达式等。这些指令在模板设计中都有特定的用途,可以根据实际需求灵活使用。 通过以上介绍,...
学习Velocity Demo,不仅可以了解如何在Java项目中使用Velocity,还能掌握模板引擎的基本原理和最佳实践。通过实际操作,你可以更好地理解如何将Java对象的数据与HTML页面动态结合,实现更灵活的Web页面生成。同时,...
3. **模板解析**: 使用 `VelocityEngine` 加载模板文件,然后通过 `evaluate()` 或 `mergeTemplate()` 方法进行解析。 4. **生成输出**: 解析后的结果通常是一个字符串,可以写入到文件、HTTP 响应或其它输出流中。...
"VelocityTest"可能是一个示例代码或测试文件,用于演示如何在实际项目中使用Velocity。这通常包括创建VelocityContext对象(用于存储数据),加载模板文件,以及合并上下文数据和模板以生成最终输出。在学习和实践...
在 Velocity 中,模板语言(Velocity Template Language, VTL)被用于创建动态内容。VTL 提供了一系列的指令和宏,开发者可以使用这些元素来控制模板的逻辑。例如,`#if`、`#else`、`#foreach` 等用于条件判断和循环...
3. **创建上下文**: 创建一个 VelocityContext 对象,向其中添加需要在模板中使用的变量。 4. **合并上下文和模板**: 使用 `mergeTemplate()` 或 `evaluate()` 方法将上下文和模板合并,生成输出。 5. **处理结果*...
- **基本概念**:VTL是Velocity模板引擎使用的脚本语言,它提供了一系列内置对象、变量和指令来帮助生成动态内容。 - **变量**:用于存储数据值。 - **属性**:可以是字符串、数字或任何其他类型的数据。 - **方法**...