Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF如何处理动作侦听器?_Jsf_Jsf 2_Actionlistener - Fatal编程技术网

JSF如何处理动作侦听器?

JSF如何处理动作侦听器?,jsf,jsf-2,actionlistener,Jsf,Jsf 2,Actionlistener,我很好奇JSF怎么知道我点击了按钮,做了一些动作,甚至可以用参数调用一个动作监听器。我可以想象服务器注意到状态和EL并调用方法 例1: <form> <p:commandButton actionListener="{bean.do_something(bean.info)}" /> </form> 例2: <form> <h:datatable values=... var="myvar"> &l

我很好奇JSF怎么知道我点击了按钮,做了一些动作,甚至可以用参数调用一个动作监听器。我可以想象服务器注意到状态和EL并调用方法

例1:

<form>
   <p:commandButton actionListener="{bean.do_something(bean.info)}" />
</form>

例2:

<form>
     <h:datatable values=... var="myvar">
        <h:column>
           <p:commandButton actionListener="{bean.do_something(myvar.info)}" />
        </h:column>
     </h:datatable>
</form>

在应用请求值阶段,将执行组件树中所有
UIComponent
实例的方法。这是检查和收集必要HTTP请求参数的地方。如果是
UIInput
组件(
和朋友),则获得提交的值。如果是
UICommand
组件(
和好友),则
ActionEvent
已排队

的情况下,所有的魔法都发生在下面提取了相关部分的人身上(行号来自PrimeFaces 3.5):

如果您熟悉,您应该已经知道每个输入元素的
name=value
对以及只有封装表单的按下按钮作为请求参数发送到服务器。PrimeFaces命令按钮基本上生成以下HTML

<button type="submit" name="formId:buttonId" ... />

其中
formId:buttonId
是从
UIComponent\getClientId()打印的。正是这个值被用作HTTP请求参数名(HTTP请求参数值是按钮的标签,但在这里没有进一步的相关性)。如果您熟悉在哪个JSF上运行,那么您还应该知道请求参数可以通过
HttpServletRequest#getParameter()
获得,包括
name=value
对按钮。这允许

正如您在上面的
decode()
方法中所看到的,这个
UIComponent#getClientId()
值也被用来检查HTTP请求参数映射是否包含参数名称。如果是这样,那么一个
ActionEvent
将被排队,最终在调用应用程序阶段被调用


至于EL的论点,它实际上不是火箭科学。整个EL表达式仅在调用应用程序阶段执行。它不是在生成表单的HTML输出时执行的,然后以某种方式作为请求参数传递。不,它只是在实际调用应用程序阶段执行的。

谢谢!很好的解释!
<button type="submit" name="formId:buttonId" ... />