2012-11-29 72 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