seam中方便地使用el表达式 el的高级用法

1)直接由表达式字符串生成javax.el.ValueExpression和javax.el.MethodExpression,主要适用于动态构造jsf组件

org.jboss.seam.core.Expressions

@Name("org.jboss.seam.core.expressions")

 

 

Expressions.instance().createValueExpression("#{var11.address}").toUnifiedValueExpression()

Expressions.instance().createMethodExpression("#{var11.f1()}").toUnifiedMethodExpression()

主要适用于动态构造jsf组件,给组件属性设置表达式。

javax.faces.component.html.HtmlOutputText out2=new javax.faces.component.html.HtmlOutputText();
      out2.setValueExpression("value", Expressions.instance().createValueExpression("#{var11.city}").toUnifiedValueExpression());
2)在seam组件中直接执行el表达式,就像在页面组件中一样。

Expressions.instance().createMethodExpression("#{search.refresh()}").invoke();
List newList=(List)Expressions.instance().createValueExpression(("#{search.resultList}").getValue();

3)将java对象转成表达式,使得java对象可以直接在表达式中使用,比如seam扩展的jpa查询语句中可以插入表达式,针对in or需要list的查询语句特别有意义。当in list时不需要把list中的内容转换成字符串

h.xzqh in (#{list})这样就可以了,我们需要的就是将list对象转成表达式即可

 

Expressions.instance().createValueExpression(("#{list}").setValue(list);

em.createQuery(".....where ....h.xzqh in (#{list})").getResultList();

当然,这个更好的方式就是使用jpa的参数 in(:list).

4)如何让不能执行的表达式执行

<rich:column filterBy="#{item.seri.desc}" 获取filter字段的class,在表头上#{item.seri.desc}是无法执行的,因为没有item对象存在,只有当进入table循环后item才有值。

。。。。。。。。

5)seam集成的hibernate验证,构造自己的el Resolver

详见seam ui源码Validators class

 

public ErrorMessage[] validate(ValueExpression valueExpression,
   ELContext elContext, Object value, ValidatorObject... others) {
  ValidatingResolver validatingResolver = new ValidatingResolver(
    elContext.getELResolver());
  ELContext decoratedContext = EL.createELContext(elContext, validatingResolver);

 

  //el的解析就使用validatingResolver来解析了。
  //[不去真正执行对象的set方法]   valueExpression.setValue方法中
  //拿value去调用hibernate的验证
  valueExpression.setValue(decoratedContext, value);
  return validatingResolver.getMessages();
 }

 

class ValidatingResolver extends ELResolver {
  private ELResolver delegate;

@Override
      public void setValue(ELContext context, Object base, Object property, Object value) throws NullPointerException, PropertyNotFoundException, PropertyNotWritableException, ELException
      {
         if (base != null && property != null)
         {
            context.setPropertyResolved(true);
            invalidValues = getValidator(base).getPotentialInvalidValues(property.toString(), value);
         }

      }

新思路:执行hibernate的关键是知道是那个实体,取表达式字符串,构造出实体表达式,执行表达式即可获得实体。

#{apply.aa}变成#{apply},执行#{apply}即可获得实体。

你可能感兴趣的:(html,jboss,JSF,jpa,seam)