丰富的javascript函数findComponent

时间:2011-08-19 11:32:15

标签: java jsf richfaces el

我正在尝试使用rich:findComponent添加动态onclick事件:

<font class="topFirstTablehdCategory2" style="font-size: 12px; cursor: pointer;" onclick="#{rich:findComponent('benchmarkEndDate').value = channelPerformanceController.resetDate}">
    RESET
</font>

但我得到了

com.sun.el.parser.ParseException: Encountered "=" at line 1, column 48.

我愿意做的是将字符串值设置为rich:calender benchmarkEndDate,其resetDate来自ChannelPerformanceController类的字段function setResetDate(id, date) { #{rich:findComponent('benchmarkEndDate').value} = date; }

我还在jsp页面中编写了一个javascript方法:

onclick="setResetDate('benchmarkEndDate', '#{channelPerformanceController.resetDate}')"

无效。它被称为:function setResetDate(id, date) { 2011-03-24 00:00:00.0 = date; }

它在浏览器中呈现为:

function setResetDate(id, date) {
        document.getElementById(#{rich:clientId(id)}) = date;
}

此方法:

function setResetDate(id, date) {
        document.getElementById() = date;
}

改为:

{{1}}

我做错了什么?我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

  • JavaScript由客户端执行。
  • 在将标记发送到浏览器之前,在服务器上评估表达式语言表达式。

#{foo = bar}不是有效的EL表达式。 =不是EL中的有效运算符。 EL没有赋值运算符。通过EL分配值的唯一方法是在支持它们的属性中使用值绑定(几乎完全通过JSF输入控件)。


如果评估此表达式:

#{rich:clientId(id)}

此表达式将使用getAttribute("id")搜索requestsessionapplication范围,使用托管bean机制创建此类bean(如果使用此id定义) 。当评估它并返回null时,不会呈现任何内容。


如果此表达式评估:

#{rich:clientId(id)}

然后将它放在模板文本中(可能在JSP 2.0 / J2EE 1.4中。)

有两种类型的EL表达式:

  • #{foo} - 延迟表达式:仅在允许它们的属性中进行评估
  • ${foo} - 立即表达:允许使用模板文字

从JSP 2.1开始,在模板文本中使用延迟表达式是一个转换错误。从JSP 2.1规范:

  

在JSP页面的模板文本中使用时,#{字符序列   触发翻译错误,除非特别允许通过   配置设置。这是因为#{}语法是关联的   专门用于JSP中的延迟评估   2.1并且在模板文本的上下文中没有意义(仅   使用${expr}语法立即进行评估是有意义的   模板文本)。

     

在标记文件中,模板文本中的#{expr}根据   标记文件的JSP版本:如果标记文件的JSP版本是2.0或更低,   模板文本中的#{expr}不会导致任何错误。如果是标签文件的话   JSP版本在模板中等于或大于2.1,#{expr}   文本必须导致错误,除非它已被转义或标记文件   包含deferredSyntaxAllowedAsLiteral标记指令属性   设为TRUE

通常,#{foo}表达式必须仅在JSF控件属性中(对于JSP视图)。


如果要更改服务器端值,请使用表单提交和操作绑定。这可以通过RichFaces中的AJAX来完成。