2016-04-13 36 views
0

介紹評估在Java中自定義的輸入條件

嗨,我目前工作的一個進口框架。用戶將使用該框架將大量Excel表格中的數據映射到系統中的實體。某些值是否需要映射到實體取決於文件中某些值的條件。它是一個構建在Java(Java servlets)中的Web應用程序。

給點

系統的用戶需要將系統使用自定義的條件提供:

CELLD4 == "Hello world" 

我的問題是:如何給CELLD4 == "Hello world"條件爲String到系統並讓系統將其解釋爲if聲明,如:

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

其他人所做的是從雙等號(==)之前和雙等號後面提取兩個值,然後執行等於檢查以檢查值是否相同。但似乎有一個更好,更簡單的方法來解決這個問題。誰對我有關於如何最好地讓系統解釋系統用戶輸入的自定義條件的建議?

+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

也許有更好的解決方案,因爲這需要一些whacky的東西。當然,你仍然需要以某種方式解析在表達式中傳遞的變量並將其綁定到某個東西。

+0

什麼是getEngineByName()?它調用一個JavaScript引擎?這是否意味着它將輸入字符串解釋爲JavaScript語法? – Ben

+0

它直接在JVM上運行JavaScript代碼,並且它可以**將輸入解釋爲js語法。我不確定的事情是優先順序,如果你使用一個存在於Java和JS中的函數。在給出的例子中,我使用了'equalsIgnoreCase()',它不存在於JS中,並且它使用了Java的對應部分。如果你對一個獨特的JS func做同樣的事情,情況也會如此,但是當它們以兩種語言存在時,我都不確定。既然看起來你想要String comparisson,但這應該不是問題。 – dambros