前面章节我们介绍 <#if>、<#elseif> 和 <#else> 指令,可以使用这些指令来处理多分支条件判断;如果分支太多,使用 <#if>、<#elseif> 和 <#else> 指令有点繁琐。因此,FreeMaker 引入了 <#switch> 指令。语法如下:
<#switch value> <#case refValue1> ... <#break> <#case refValue2> ... <#break> ... <#case refValueN> ... <#break> <#default> ... </#switch>
参数说明:
value、refValue1、refValue2、refValueN: 这些表达式将会计算成相同类型的标量,即数据类型一致。
<#case> 至少要有一个,每一个 <#case> 用来处理一种情况;当 <#list> 的 value 和该 <#case> 匹配,则执行 <#case> 下面的内容。
<#break> 指令是可选的。该指令用来结束当前 <#case> 指令,跳出 <#list>;如果没有指定,将继续执行下一个 <#case>(如果匹配的话)。
<#default> 指令是可选的。当没有匹配到任何一个 <#case> 时执行。
当程序运行到 <#switch> 时,将 <#switch> 的 value 和它下面 <#case> 的 refValue1、refValue2、refValueN 进行比较;如果成功匹配到某个 <#case> 则进入该 <#case>,执行该 <#case> 中的内容;如果定义了 <#break> 指令,则跳出 <#case> 且 结束当前 <#switch>;如果没有定义 <#break> 指令,则继续匹配下一个 <#case>,直到最后一个 <#case>(每个匹配到的 <#case> 和前面的 <#case> 处理逻辑一致);如果定义了 <#default> 指令,则执行 <#default> 指令下面的内容;如果没有定义 <#default> 指令,则结束 <#list> 指令。
实例:使用 <#switch> 来选择模板中的一个片段。
<html> <head> <title>switch 指令</title> </head> <body> <div> <h2>消息内容</h2> <#switch message_type> <#case "email"> <p>这是一封邮件</p> <#break> <#case "sms"> <p>这是一条短信</p> <#break> <#default> <p>No Message</p> </#switch> </div> </body> </html>
输出结果:
<html> <head> <title>switch 指令</title> </head> <body> <div> <h2>消息内容</h2> <p>这是一封邮件</p> </div> </body> </html>
在 <#switch> 中间必须有一个或多个 <#case value>, 在所有 <#case> 标签之后,有一个可选的 <#default>。 当 FreeMarker 到达 <#switch> 指令时,它会将 <#switch> 指令的 value 和每个 <#case> 指令的 refValue 进行判断;如果相等,则执行当前 <#case> 下面的内容;否则,继续处理下一个 <#case>。 如果没有匹配到合适的 <#case> 指令,那么就继续处理 <#default> 指令(如果它存在);最后,继续处理 </#switch> 结束标签之后的内容。
注意:如果在 <#case> 指令中没有 <#breaker> 指令,程序将继续执行下一个 <#case> 指令(如果匹配的话);比如:
<html> <head> <title>switch 指令</title> </head> <body> <div> <h2>消息内容</h2> <#switch message_type> <#case "email"> <p>这是一封邮件</p> <#case "sms"> <p>这是一条短信</p> <#default> <p>No Message</p> </#switch> </div> </body> </html>
输出结果:
<html> <head> <title>switch 指令</title> </head> <body> <div> <h2>消息内容</h2> <p>这是一封邮件</p> <p>这是一条短信</p> <p>No Message</p> </div> </body> </html>
如果 type 等于 “email”,它会打印:
<p>这是一封邮件</p> <p>这是一条短信</p> <p>No Message</p>
如果 type 等于 “sms”,它会打印:
<p>这是一条短信</p> <p>No Message</p>
如果 type 不等于 “email”,也不等于 “sms”,它会打印:
<p>No Message</p>
<#break> 标记指示 FreeMarker 直接略过剩下的 <#switch> 代码段。