0

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>
4

1 回答 1

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 并在此基础上显示/隐藏项目。

于 2012-12-18T10:28:13.703 回答