1.首先定义标签函数集合:
Map<String, Method> fns = new HashMap<String, Method>(); (1)
将表达式中的方法 放在定义的fns 中,定义的方法确定是静态的,格式如下:
public static String functionName(boolean success, String input0, String input1) {
return success == true ? input0 : input1;
}
2.实现VariableResolver接口,该接口是jstl 定义的,供解析EL表达式使用。demo
private class MapVariableResolver implements VariableResolver {
private Map<String, Object> map;
public MapVariableResolver(MethodInvocation mi, Object result, HttpServletRequest request) {
Object[] args = mi.getArguments();
map = new LinkedHashMap<String, Object>(args.length + 2);
for (int i = 0; i < args.length; i++) {
map.put("username", args[i]);
if ((!map.containsKey("ctx"))) {
map.put("ctx", new LogContextImpl(request));
}
}
Map<String, Boolean> resultMap = new HashMap<>();
if (result != null && result instanceof UserDetails) {
resultMap.put("success", true);
} else {
resultMap.put("success", false);
}
map.put("ret", resultMap);
}
@Override
public Object resolveVariable(String arg0, Object arg1) throws ELException {
if (map.containsKey(arg0)) {
return map.get(arg0);
}
return "[no named(" + arg0 + ") value]";
}
}
3.配置ELEvaluator ,进行解析。
使用如下:
MapVariableResolver vr = new MapVariableResolver(mi, result, request);
// ELEvaluator 用来 evaluate
ELEvaluator eval = new ELEvaluator(vr);
// 允许包含函数
System.setProperty("javax.servlet.jsp.functions.allowed", "true");
注意:msg 要转义
msg = msg.replaceAll("‘", "\"");
// 执行evaluate,String.class表示eval返回的类型,fns是函数映射map,fn是函数前缀
Object obj = eval.evaluate(msg, null, String.class, fns, "fn");
到处jstl后台使用介绍完毕。
效果如下:表达式: 输入:${username}从${ctx.ip}登录, 登录${if(ret.success,‘成功‘,‘失败‘)}
Map={username =xxx,ctx={ip=127.0.0.1},ret={success=true}};
输出:xxx从127.0.0.1登录,登录成功