我正在使用Spring MVC LocaleChangeInterceptor来处理语言环境的更改。我需要2个简单的链接来在英语和法语之间切换当前页面,同时保留当前URL的任何现有参数。

我想出的解决方案看起来很丑。一个c:url标记,具有一个空值以链接到当前页面,并具有一个循环以附加任何现有参数,但我不想两次看到的language参数除外。因此,代码如下。

<c:url value="" var="englishURL">
    <c:forEach items="${param}" var="currentParam">
        <c:if test="${currentParam.key != 'siteLanguage'}">
            <c:param name="${currentParam.key}" value="${currentParam.value}"/>
        </c:if>
    </c:forEach>
    <c:param name="siteLanguage" value="en"/>
</c:url>
<c:url value="" var="frenchURL">
    <c:forEach items="${param}" var="currentParam">
        <c:if test="${currentParam.key != 'siteLanguage'}">
            <c:param name="${currentParam.key}" value="${currentParam.value}"/>
        </c:if>
    </c:forEach>
    <c:param name="siteLanguage" value="fr"/>
</c:url>
<a href="${englishURL}">English</a> / <a href="${frenchURL}">Français</a>

有人用不太丑陋的方式来创建这些链接吗?我知道我可以创建一个自定义标签来避免重复,但是我觉得这是非常小的改进,因为我需要声明标签和所有标签。

最佳答案

确实不那么丑陋,但是至少要少一些代码重复

<c:forEach var="tuple" items="${fn:split('en,English|fr,Français|nl,Nederlands', '|')}" varStatus="status">
  <c:set var="locale" value="${fn:split(tuple, ',')[0]}"/>
  <c:set var="name" value="${fn:split(tuple, ',')[1]}"/>
  <c:url value="" var="url">
    <c:forEach items="${param}" var="currentParam">
      <c:if test="${currentParam.key != 'changeLocale'}">
        <c:param name="${currentParam.key}" value="${currentParam.value}"/>
      </c:if>
    </c:forEach>
    <c:param name="changeLocale" value="${locale}"/>
  </c:url>
  <a href="${url}">${name}</a>
  <c:if test="${not status.last}"> / </c:if>
</c:forEach>

09-26 23:01
查看更多