JSF如何处理动作侦听器?
我很好奇JSF怎么知道我点击了按钮,做了一些动作,甚至可以用参数调用一个动作监听器。我可以想象服务器注意到状态和EL并调用方法 例1: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
<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" ... />