我在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
参数撰写网址,不要错过任何部分请求的网址?
答案 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的经理。