Freemarker - 撰写语言切换网址

时间:2017-01-30 11:16:17

标签: spring url freemarker

我在Spring中使用freemarker模板引擎,我想在渲染页面时在link元素的href属性中添加或替换lang=xxx参数。

我发现最接近的解决方案如下:

<a href="${springMacroRequestContext.getRequestUri()}?lang=en'/>English</a>

但是当我有带参数和片段的URL时,这还不够,因为我会想念它们。例如,http://localhost/sports/search?query=Volleyball&lang=cs#some-fragment会产生http://localhost/sports/search?lang=en

如何使用freemarker中添加或更改的lang参数撰写网址,不要错过任何部分请求的网址?

1 个答案:

答案 0 :(得分:0)

我更喜欢用Java做这个,这个简单的实现没有考虑哈希(#)或者url中给定参数的存在。

public static String addParamToUrl(String url, String paramName, String paramValue){
    StringBuffer buffer = new StringBuffer(url);
    //adding separator
    if(url.indexOf('?') == -1){
        buffer.append('?');
    }else if(!url.endsWith("?") && !url.endsWith("&")){
        buffer.append('&');
    }        

    buffer.append(paramName);
    if(paramValue != null){
        buffer.append("=");
        buffer.append(URLEncoder.encode(paramValue, "UTF-8"));
    }
    return buffer.toString();
}

将此方法放在可由Freemarker引擎静态访问的类(即Utils.java)中,而不是:

<#assign url = Utils.addParamToUrl(springMacroRequestContext.getRequestUri(), "lang", "en") />

<a href="${url}">English</a>

要公开您的Utils课程,您必须自定义FreemarkerManager

public class MyFreemarkerManager extends FreemarkerManager {

    public MyFreemarkerManager(){
        super();
    }

    @Override
    protected void populateContext(ScopesHashModel model, ValueStack stack, Object action, HttpServletRequest request, HttpServletResponse response) {
        super.populateContext(model, stack, action, request, response);

        try {

            BeansWrapper beansWrapper = new BeansWrapperBuilder(Configuration.VERSION_2_3_24).build();
            TemplateHashModel staticModels = beansWrapper.getStaticModels();

            TemplateHashModel utils = (TemplateHashModel)staticModels.get("com.package.Utils");
            model.put("Utils", utils);  

        } catch (TemplateModelException e) {
            //...
        }       

    }
}

最后你必须告诉Spring你正在使用MyFreemarkerManager作为Freemarker的经理。