JSTL的后台使用总结

时间:2022-01-18 17:26:27

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登录,登录成功