2012-11-29 132 views
-1

我有一個要求,使用Java EL連接字符串列表。請注意,這不是在JSP/Web context中,而是在獨立的Java客戶端中(使用juel-2.2.4.jar)。 表達的形式爲:在表達式中使用for循環

${for(int i=1; i<Employees.length; i++){Employee[i].Name + "--" }} 

我已經有一個自定義ELResolver其理解Employee對象。 我期望的輸出是一個String,其中所有員工的姓名中間有一個分隔符。

這是甚至可以在獨立的Java EL應用程序?

+0

我想你將需要創建一個方法返回連接字符串。 –

回答

0

你可能不得不做出一個輔助功能,據我所知,沒有辦法Java可以使用表達式處理這個開箱。

${Employee.joinEmployeesByName(Employees, "--")} 

代碼在Employee類:

public static String joinEmployeesByName(Employee[] arr, String separator) { 
    //implement 
} 

下面是使用動態例如反射:

public static String getFieldByName(Employee obj, String fieldName) { 
    String ret = null; 
    Class<?> c = obj.getClass(); 
    try { 
     Field field = c.getDeclaredField(fieldName); 
     ret = field.get(obj).toString(); 
    } catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
    return ret; 
} 

public static String joinEmployeesByField(Employee[] arr, String fieldName, String separator) { 
    if(arr.length < 1) { 
     return ""; 
    } 
    StringBuilder ret = new StringBuilder(); 
    ret.append(getFieldByName(arr[0], fieldName)); 
    for(int i = 1; i < arr.length; ++i) { 
     ret.append(separator); 
     ret.append(getFieldByName(arr[i], fieldName)); 
    } 
    return ret.toString(); 
} 

用法是:

${Employee.joinEmployeesByField(Employees, "Name", "--")} 
${Employee.joinEmployeesByField(Employees, "Designation", "--")} 
+0

它需要更具活力,因爲明天我可能想更改表達式以使用員工指定字段而不是員工姓名。 – Sandhya

+0

@Sandhya你可以使函數獲取一個字符串的屬性名稱,然後使用反射從僱員數組中獲取該名稱的屬性 – Esailija

+0

@Sandhya我已經添加了一個動態示例 – Esailija

0
String allName=""; 
for(int i=1; i<Employees.length; i++){ 
allName+=Employee[i].Name + "--" 
} 

最後allName包含連接的名稱。當你從i = 1開始時,確保你沒有錯過第一個員工的名字;

你在評論中問了什麼,你不能直接寫出符合你要求的東西。雖然你可以做下面的事情,

public String getConcatenatedString(String property){ 
String allName=""; 
    for(int i=1; i<Employees.length; i++){ 
    if(property.equals("name")) 
    allName+=Employee[i].Name + "--"; 
    else if(property.equals("designation")) 
     allName+=Employee[i].designation + "--"; 
    } 
return allName; 
} 

您將調用名稱或屬性的方法。您將獲得連接屬性。

+0

這是一個簡單的for循環可編譯Java代碼。我在詢問代碼是一個必須在運行時動態執行的表達式。換句話說,明天我可以更改爲Employee.designation而不是Employee.name,而不必更改/重新編譯任何Java代碼。 – Sandhya

0

您可以使用下面的代碼:

StringBuffer allEmployeeName= new StringBuffer(); 
for(int i=1; i<Employees.length; i++){ 
    allEmployeeName += Employee[i].Name + "--" 
} 
+0

請在上面看到我對Rasel的評論。我的問題是在Java EL的背景下。 – Sandhya