1)el表达式分为 值表达式和方法表达式,方法表达式只可以执行方法本身,值表达式可以获取表达式的值,也可以给表达式设置值。
一个表达式字符串可以由值表达式和方法表达式混合组成,下面示例的report.getReportParameters().get(0)部分是方法表达式,后面的.value是值表达式,只要表达式的最后部分是值表达式,就可以给整个表达式赋值,如下的inputText中的表达式能接收用户的输入。
<h:inputText value="#{report.getReportParameters().get(0).value}" />
下面的inputText只能显示,不能获取用户输入,输入后提交抛异常。
<h:inputText value="#{report.getReportParameters().get(0)}" />
2)el访问 list和map
#{bean.list[index].value}//index是数字
#{bean.map['key'].value}//对map中key对应的对象(复杂对象)的value属性进行操作,如果map中没有key对应的对象,set操作时抛出异常
#{bean.map['key']}//对map中key对应的简单对象进行操作。提交值时,如果map中key对应的对象没有就会将key设置进map中。下面示例,页面显示时cycleValueMap中可能没有一个key,也可能只有几个key,但提交时map中会有全部的key
private Map<String, Boolean> cycleValueMap;
ValueExpression ve = getValueExpression("value");
ve.setValue(context.getELContext(), getLocalValue());//map的赋值是将<key,getLocalValue()> put进去
使用list来接收值就不太方便,list需要提前构造好全部值,否则set时会抛出下面的异常。数组越界
value="#{calendarParam.list[3]}": java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
ValueExpression ve = getValueExpression("value");
ve.setValue(context.getELContext(), getLocalValue());//list 可能会调用public void add(int index, E element)
或 public E set(int index, E element)方法,这个方法会抛出数组越界异常。
周一<h:selectBooleanCheckbox
value="#{calendarParam.cycleValueMap['1']}"></h:selectBooleanCheckbox>
周二<h:selectBooleanCheckbox
value="#{calendarParam.cycleValueMap['2']}"></h:selectBooleanCheckbox>
周三<h:selectBooleanCheckbox
value="#{calendarParam.cycleValueMap['3']}"></h:selectBooleanCheckbox>
...
周日<h:selectBooleanCheckbox
value="#{calendarParam.cycleValueMap['7']}"></h:selectBooleanCheckbox>
list方式需要提前构造好list中的值,否则会抛出数组越界异常
<h:selectBooleanCheckbox
value="#{calendarParam.list[2]}"></h:selectBooleanCheckbox>