这个主要是因为喜欢在spring+springmvc中用freemarker时,增加${base} ,${jsPath},${cssPath}等等全局的变量来使用,这样不用使用相对路径,或者有统一的资源服务器的时候,可以动态的改变路径。还有自己定义一些方法在freemarker模板中使用,例如${conver('userType',e.user.type)},我们可以在后端对一些参数值进行转换。
刚换成springboot没有了配置文件,又不想往里边扔xml,有些强迫症,所以搞了一下,发现在springboot里实现也很简单。
直接贴代码
这里放到Application运行类中
/**
* 增加自定义视图变量和方法
*
* @return
*/
@Bean
public CommandLineRunner customFreemarker(FreeMarkerViewResolver resolver) {
return new CommandLineRunner() {
@Override
public void run(String... strings) throws Exception {
//增加视图
resolver.setViewClass(MyFreemarkerView.class);
//添加自定义解析器
Map map = resolver.getAttributesMap();
map.put("conver", new MyConver());
}
};
}
package com.xyauto.qa.core.assist;
import com.xyauto.qa.cons.QcdqcdnStatic;
import com.xyauto.qa.util.RequestUtil;
import com.xyauto.qa.util.SpringIocUtil;
import org.springframework.web.servlet.view.freemarker.FreeMarkerView;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* Created by shiqm on 2017-04-07.
*/
public class MyFreemarkerView extends FreeMarkerView {
@Override
protected void exposeHelpers(Map model, HttpServletRequest request) throws Exception {
String base = RequestUtil.getBasePath(request);
model.put("base", base);
model.put("h5Url", qcdqcdnStatic.getH5());
super.exposeHelpers(model, request);
}
}
h5Url那个请忽略,我配置文件里自定义的一些路径,总之这样就可以在模板中使用${h5Url} ${base},解析的值就是你设定的值
package com.xyauto.qa.util;
import javax.servlet.http.HttpServletRequest;
/**
* Created by shiqm on 2017/3/14.
*/
public class RequestUtil {
public static String getRequestIP(HttpServletRequest request) {
String clientIp = request.getHeader("x-forwarded-for");
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("Proxy-Client-IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("WL-Proxy-Client-IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getRemoteAddr();
}
return clientIp;
}
public static boolean isResponseBody(HttpServletRequest request) {
if (request.getRequestURI().indexOf("ajax") > -1) {
return true;
}
return false;
}
/**
* 得到请求的根目录
*
* @param request
* @return
*/
public static String getBasePath(HttpServletRequest request) {
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName()
+ ":" + request.getServerPort() + path;
return basePath;
}
/**
* 得到结构目录
*
* @param request
* @return
*/
public static String getContextPath(HttpServletRequest request) {
String path = request.getContextPath();
return path;
}
}
package com.xyauto.qa.core.conver;
import com.xyauto.qa.cons.ConvertCons;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModelException;
import java.util.List;
/**
* Created by shiqm on 2017-05-03.
*/
public class MyConver implements TemplateMethodModelEx {
@Override
public Object exec(List arguments) throws TemplateModelException {
if (null != arguments && 2 == arguments.size()) {
String key = String.valueOf(arguments.get(0));
try {
switch (key) {
case "source":
return ConvertCons.ResourceCover.get(Integer.parseInt(String.valueOf(arguments.get(1))));
case "userType":
return ConvertCons.UserTypeCover.get(Integer.parseInt(String.valueOf(arguments.get(1))));
case "logModule":
return ConvertCons.LogModuleCover.get(Integer.parseInt(String.valueOf(arguments.get(1))));
case "logAction":
return ConvertCons.LogActionCover.get(Integer.parseInt(String.valueOf(arguments.get(1))));
default:
return null;
}
}catch (Exception e){
return null;
}
} else {
return null;
}
}
}
package com.xyauto.qa.cons;
import java.util.HashMap;
import java.util.Map;
/**
* Created by shiqm on 2016-04-23.
*/
public class ConvertCons {
public static final class ResourceCover {
public static final Map map = new HashMap();
static {
init();
}
public static void init() {
map.put(1, "PC");
map.put(2, "IOS");
map.put(3, "Android");
map.put(4, "M站");
map.put(5, "H5");
map.put(6, "H51");
map.put(101, "慧商机");
map.put(102, "百度");
map.put(103, "360");
map.put(998, "后台创建");
map.put(999, "批量导入");
}
public static String get(Integer key) {
return map.get(key);
}
public static Map getMap() {
return map;
}
}
public static final class UserTypeCover {
public static final Map map = new HashMap();
static {
init();
}
public static void init() {
map.put(0, "普通用户");
map.put(1, "标兵");
map.put(2, "专家");
map.put(3, "经纪人");
}
public static String get(Integer key) {
return map.get(key);
}
public static Map getMap() {
return map;
}
}
public static final class LogModuleCover {
public static final Map map = new HashMap();
static {
init();
}
public static void init() {
LogModule[] temps = LogModule.values();
for (LogModule logModule : temps) {
map.put(logModule.getValue(), logModule.getName());
}
}
public static String get(Integer key) {
return map.get(key);
}
public static Map getMap() {
return map;
}
}
public static final class LogActionCover {
public static final Map map = new HashMap();
static {
init();
}
public static void init() {
LogAction[] temps = LogAction.values();
for (LogAction logAction : temps) {
map.put(logAction.getValue(), logAction.getName());
}
}
public static String get(Integer key) {
return map.get(key);
}
public static Map getMap() {
return map;
}
}
}