2016-04-13 2 views
0

ВведенияОценка пользовательских условий ввода в Java

Привет, я в настоящее время работаю над рамками импорта. Пользователь будет использовать фреймворк для сопоставления данных из большого количества листов excel для объектов в системе. Независимо от того, какие значения должны быть сопоставлены сущностям, зависит от состояния определенных значений в файлах. Это веб-приложение, которое построено на Java (Java-сервлетах).

К точке

Пользователь системы должен поставить систему с индивидуальным состоянием, как:

CELLD4 == "Hello world" 

Мой вопрос: Как я могу дать условие CELLD4 == "Hello world" в виде строки к системе, и пусть система интерпретирует ее как заявление if, например:

if (CELLD4 == "Hello world") {execute something} 

Что сделал кто-то другой, извлеките два значения до того, как знак double равен значению (==), и после двойного знака равенства, а затем выполните проверку равенства, чтобы проверить, идентичны ли значения. Но, кажется, есть лучший и простой способ сделать это. У кого есть предложения для меня о том, как лучше всего система интерпретировать пользовательские условия ввода от пользователя системы?

+0

Я думаю, что упомянутое решение лучше всего подходит для оценки CELLD4. – user4759923

+1

Если я правильно понимаю, вам просто нужно преобразовать 'String' в код. Возможно, вы можете проверить [здесь] (http://stackoverflow.com/questions/935175/convert-string-to-code). –

ответ

0

Если я правильно понял, вы можете достичь его с помощью ScriptEngine, т.е .:

public static void main(String[] argv) throws Exception { 
    ScriptEngineManager mgr = new ScriptEngineManager(); 
    ScriptEngine engine = mgr.getEngineByName("JavaScript"); 
    String expression2 = "CELLD4.equalsIgnoreCase(\"Hello world\")"; 

    Map<String, Object> map = new HashMap<>(); 
    map.put("CELLD4", getCELLD4()); 

    engine.setBindings(new SimpleBindings(map), ScriptContext.ENGINE_SCOPE); 
    if ((boolean) engine.eval(expression2)) { 
     System.out.println("YAY"); 
    } else { 
     System.out.println("NAY"); 
    } 
} 

public static String getCELLD4() { 
    return "Hello World"; 
} 

Выход будет YAY.

Возможно, есть более эффективные решения, поскольку для этого требуется какой-то странный материал. И, конечно, вам все равно нужно как-то разрешить переменную, переданную внутри выражения, и связать ее с чем-то.

+0

Что такое getEngineByName()? Он вызывает механизм javascript? Означает ли это, что он интерпретирует входную строку как синтаксис javascript? – Ben

+0

Он запускает код JavaScript непосредственно на JVM, и да, он ** может ** интерпретировать ввод как синтаксис js. Вещь, о которой я не уверен, - это порядок приоритета, если вы используете функцию, существующую как в Java, так и в JS. В приведенном примере я использовал 'equalsIgnoreCase()', который не существует в JS, и он использовал аналогию Java. Если вы сделаете то же самое для исключительной функции JS, то это произойдет, но когда они существуют на обоих языках, я не уверен. Поскольку кажется, что вы хотите сравнить String, это не должно быть проблемой. – dambros

Смежные вопросы