简化Freemarker条件以制作struts2自定义导航

时间:2012-12-17 04:17:50

标签: struts2 freemarker

Struts2 + Freemarker。下面的代码工作正常,但我想知道任何人都可以简化它。我看到重复的代码生成html标签。

下面的代码看起来很多,可以生成包含3个链接的自定义菜单

任何人都有更好的解决方案吗?

 <@s.set var="page" value="com.opensymphony.xwork2.ActionContext.name" />
    <@s.url action="home" var="urlHome" />
    <@s.url action="about" var="urlAbout" />
    <@s.url action="contact" var="urlContact" />

    <#if page=='home'>
        <@currentPage page="%{urlHome}" title="Home"/>
        <@s.a href="%{urlAbout}">About Us</@s.a>
        <@s.a href="%{urlContact}">Contact Us</@s.a>
    <#elseif page=='about' >
        <@s.a href="%{urlHome}">Home</@s.a>
        <@currentPage page="%{urlAbout}" title="About Us"/>
        <@s.a href="%{urlContact}">Contact Us</@s.a>
    <#elseif page=='contact' >
        <@s.a href="%{urlHome}">Home</@s.a>
        <@s.a href="%{urlAbout}">About Us</@s.a>
        <@currentPage page="%{urlContact}" title="Contact Us"/>
    <#else>
        <@currentPage page="%{urlHome}" title="Home"/>
        <@s.a href="%{urlAbout}">About Us</@s.a>
        <@s.a href="%{urlContact}">Contact Us</@s.a>
    </#if>

<#macro currentPage page title>
    <div class="menu-image">
        <img src="<@s.url value="/images/on-left.gif"/>"/>
    </div>
    <div class="on">
        <@s.a cssClass="over" href="${page}">${title}</@s.a>
    </div>
    <div class="menu-image">
        <img alt="" src="<@s.url value="/images/on-right.gif"/>"/>
    </div>
</#macro>

1 个答案:

答案 0 :(得分:1)

比较宏内部页面的名称或将其设置为宏

的属性
<@s.set var="page" value="com.opensymphony.xwork2.ActionContext.name" />

<@aPage pageUrl=urlHome title="Home" name="home">
<@aPage pageUrl=urAbout title="About us" name="about">
<@aPage pageUrl=urlContact title="Contact us" name="contact">

<@aPageWithBoolean pageUrl=urlHome title="Home" isOn=(page=="home")>
<@aPageWithBoolean pageUrl=urAbout title="About us" isOn=(page=="about")>
<@aPageWithBoolean pageUrl=urlContact title="Contact" isOn=(page=="contact")>

<#macro aPage pageUrl title name>
    <#if name == page>
        <div class="menu-image">
            <img src="<@s.url value="/images/on-left.gif"/>"/>
        </div>
        <div class="on">
            <@s.a cssClass="over" href="${pageUrl}">${title}</@s.a>
        </div>
        <div class="menu-image">
           <img alt="" src="<@s.url value="/images/on-right.gif"/>"/>
        </div>
    <#else>
        <@s.a cssClass="over" href="${pageUrl}">${title}</@s.a>
    </#if>
</#macro>

或者使用布尔值

<#macro aPageWithBoolean pageUrl title isOn=false>
    <#if isOn>
        <div class="menu-image">
            <img src="<@s.url value="/images/on-left.gif"/>"/>
        </div>
        <div class="on">
            <@s.a cssClass="over" href="${pageUrl}">${title}</@s.a>
        </div>
        <div class="menu-image">
           <img alt="" src="<@s.url value="/images/on-right.gif"/>"/>
        </div>
    <#else>
        <@s.a cssClass="over" href="${pageUrl}">${title}</@s.a>
    </#if>
</#macro>

您还可以使用带有CSS的包装器div并根据它显示/隐藏项目。