Java中是否有接口可以调用JSTL的表达式求值功能?
PHPz
PHPz 2017-04-17 11:02:40
[Java讨论组]

我需要一个表达式求值的功能,jsp中el的写法挺简单的,是否可以在java中调用? 如在JSP中可以写:${order.quantity==100},将在页面中输出true或false,这个表达式在java中作为一个字符串,如何在java中调用EL的功能进行计算?

补充问一下,common-el如何设置变量?文档中没有这方面的例子。

PHPz
PHPz

学习是最好的投资!

全部回复(1)
伊谢尔伦

可以通过Commons-EL实现。

Commons-EL官网: http://commons.apache.org/proper/commons-el/

测试代码样例在: http://commons.apache.org/proper/commons-el/xref-test/org/apache/commons/el/ELTest.html

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.commons.el;

import org.apache.commons.el.parser.ELParser;
import org.apache.commons.el.parser.ParseException;

import java.io.StringReader;
import java.io.IOException;

import javax.servlet.jsp.el.FunctionMapper;
import javax.servlet.jsp.el.VariableResolver;
import javax.servlet.jsp.el.ELException;

import junit.framework.TestCase;

public class ELTest extends TestCase {

    private MockVariableResolver resolver;
    private MockFunctionMapper mapper;

    protected void setUp() {
        this.resolver = new MockVariableResolver();
        this.mapper = new MockFunctionMapper();
    }

    protected void tearDown() {
        this.resolver = null;
        this.mapper = null;
    }

    public void testMath() {
        assertEquals("2", evaluate("${1 + 1}"));
        assertEquals("5", evaluate("${10 - 5}"));
    }

    public void testLiteral() {
        assertEquals("ac", evaluate("${'ac'}"));
        assertEquals("\"", evaluate("${'\"'}"));
        assertEquals("true", evaluate("${true}"));
    }

    public void testEL6() {
        assertEquals("a''c", evaluate("${'a\\'\\'c'}"));
    }

    private String evaluate(String input) {
        try {
            StringReader rdr = new StringReader(input);
            ELParser parser = new ELParser(rdr);
            Object result = parser.ExpressionString();
            if(result instanceof String) {
                return (String) result;
            } else if(result instanceof Expression) {
                Expression expr = (Expression) result;
                result = expr.evaluate(this.resolver, this.mapper);
                return result == null ? null : result.toString();
            } else if(result instanceof ExpressionString) {
                Expression expr = (Expression) result;
                result = expr.evaluate(this.resolver, this.mapper);
                return result == null ? null : result.toString();
            } else {
                throw new RuntimeException("Incorrect type returned; not String, Expression or ExpressionString");
            }
        } catch(ParseException pe) {
            throw new RuntimeException("ParseException thrown: " + pe.getMessage(), pe);
        } catch(ELException ele) {
            throw new RuntimeException("ELException thrown: " + ele.getMessage(), ele);
        }
    }

}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号