Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc 使用JSTL或Spring MVC标记在当前页面上切换语言_Spring Mvc_Jstl - Fatal编程技术网

Spring mvc 使用JSTL或Spring MVC标记在当前页面上切换语言

Spring mvc 使用JSTL或Spring MVC标记在当前页面上切换语言,spring-mvc,jstl,Spring Mvc,Jstl,我正在使用Spring MVC LocaleChangeInterceptor来处理区域设置的更改。我需要2个简单的链接来切换英语和法语之间的当前网页,同时保持当前URL的任何现有参数 我想出的解决办法看起来相当难看。一个c:url标记,带有一个空值以链接到当前页面,还有一个循环以附加任何现有参数,除了我不想看到两次的language参数。所以代码如下 <c:url value="" var="englishURL"> <c:forEach items="${param

我正在使用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>

/ 

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

从您的问题来看,您似乎每次都在url中添加siteLanguage参数。对吗?你为什么要这么做?您可以将此语言更改保存在会话或cookie中,然后每次都不需要指定siteLanguage参数。选择语言后,语言参数将存储在会话或cookie中。spring将自己管理其余的事情

只需在LocaleChangeInterceptor中指定SessionLocaleResolver或CookieLocaleResolver。它会帮你的


希望这对你有帮助。干杯。

不是真的没有那么难看,而是至少少了一些代码重复

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

/ 

没有,我已经在使用CookieLocaleResolver了。我只为更改站点语言的链接指定siteLanguage参数。好的。。。那是另一个问题。:-)