我正在使用Spring MVC LocaleChangeInterceptor来处理区域设置的更改。我需要2个简单的链接来切换英语和法语之间的当前页面,同时保留当前URL的任何现有参数。
我提出的解决方案看起来相当难看。一个c:url标记,其中一个空值可以链接到当前页面,另一个循环可以附加任何现有参数,但我不希望看到的语言参数除外。所以代码如下。
<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>
有人创建这些链接的方式不那么难看吗?我知道我可以创建一个自定义标签以避免重复,但我觉得这是一个非常小的改进,因为我需要声明标签和所有。
答案 0 :(得分:2)
并不是那么难看,但至少有一些代码重复
<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>
答案 1 :(得分:0)
从您的问题看来,您每次都会在网址中附加siteLanguage param。这是对的吗?为什么你需要这样做?您可以在会话或cookie中保存此语言更改,然后每次不需要指定siteLanguage参数。选择语言后,语言参数将存储在会话或cookie中。春天将管理剩下的事情本身。
只需指定SessionLocaleResolver或CookieLocaleResolver以及LocaleChangeInterceptor。它会为你做到这一点。
希望这会对你有所帮助。欢呼声。