Struts2 的 <s:component> 标签可以让你消磨掉自定义标签的意愿,它可以指定一个模板文件,我比校亲赖于 ftl 文件,然后用 <s:param> 给上参数,其他的事情交给 freemarker 去处理了,而且在 ftl 文件能够直接以 <@s.textfield ..../> 的形式使用 Struts2 的标签。
比如,jsp 文件里这么使用 <s:component> 标签:
<s:component template="/components/status.ftl" theme="simple">
<s:param name="status" value="#status"/>
</s:component>
把 status.ftl 要放在 WEB-INF/classes/template/simple/components/status.ftl。当然你可以应用 <s:component> 的 templateDir 属性使 status.ftl 放在别的位置上,但可能会带来别的麻烦。
然后在 status.ftl 文件里用 <#if parameters.status??>...... 判断参数,进而随意发挥 FreeMarker 和 Struts2 标签的功能了。
有时候多个 jsp 页面要共用同一个 ftl 文件时,某些时候要向 ftl 模板传入某个参数,其他时候不需要。一种本能的写法就是给其中的 <s:param> 用 <s:if> 框起来,像:
1 2 3 4 5 6 7 |
<s:component template="/components/status.ftl" theme="simple"> <s:if test="some a condition"> <s:param name="link"> <button type="button" onclick="bra()">Watch</button> </s:param> </s:if> </s:component> |
可是走不通,在 ftl 里怎么都感觉不到 link 参数的存在,解决办法是让 <s:if> 作 <s:param> 的儿子,写成:
1 2 3 4 5 6 7 |
<s:component template="/components/status.ftl" theme="simple"> <s:param name="link"> <s:if test="some a condition"> <button type="button" onclick="bra()">Watch</button> </s:if> </s:param> </s:component> |
这样在 ftl 文件里的:
1 2 3 |
<#if parameters.link2??> ${parameters.link2!''} </#if> |
上面那段代码就会在条件不成立时同样是不会有任何输出,达到正常思维下的 <s:if> 包裹 <s:param> 的效果。
本文链接 https://yanbin.blog/struts2-s-param-conditions/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。