Joh*_*n N 3 jsf actionlistener jsf-2
我很好奇JSF是如何知道单击按钮的,有一些动作,甚至可以使用参数调用动作监听器.我可以想象服务器会注意到状态和EL并调用方法.
例1:
<form>
<p:commandButton actionListener="{bean.do_something(bean.info)}" />
</form>
Run Code Online (Sandbox Code Playgroud)
例2:
<form>
<h:datatable values=... var="myvar">
<h:column>
<p:commandButton actionListener="{bean.do_something(myvar.info)}" />
</h:column>
</h:datatable>
</form>
Run Code Online (Sandbox Code Playgroud)
在应用请求值阶段期间,执行组件树decode()
中所有UIComponent
实例的方法.这是检查和收集必要的HTTP请求参数的位置.对于UIInput
组件(<h:inputText>
和朋友),已获得提交的值.在UICommand
组件(<h:commandButton>
和朋友)的情况下,ActionEvent
已排队.
如果<p:commandButton>
所有的魔法发生在下面提取源代码CommandButtonRenderer#decode()
的相关部分(行号来自PrimeFaces 3.5):
34 public void decode(FacesContext context, UIComponent component) {
35 CommandButton button = (CommandButton) component;
36 if(button.isDisabled()) {
37 return;
38 }
39
40 String param = component.getClientId(context);
41 if(context.getExternalContext().getRequestParameterMap().containsKey(param)) {
42 component.queueEvent(new ActionEvent(component));
43 }
44 }
Run Code Online (Sandbox Code Playgroud)
如果您熟悉基本HTML,您应该已经知道name=value
每个输入元素对和封闭形式的按下按钮都已作为请求参数发送到服务器.PrimeFaces命令按钮基本上生成以下HTML,
<button type="submit" name="formId:buttonId" ... />
Run Code Online (Sandbox Code Playgroud)
formId:buttonId
从哪里打印出来UIComponent#getClientId()
.正是这个值被用作HTTP请求参数名称(HTTP请求参数值是按钮的标签,但这里没有进一步的相关性).如果您熟悉JSF运行的基本Servlet,那么您也应该已经知道请求参数可用HttpServletRequest#getParameter()
,包括name=value
一对按钮.这允许区分按下的按钮.
正如您在上面的decode()
方法中看到的那样,UIComponent#getClientId()
确实使用此值是为了检查HTTP请求参数映射是否包含参数名称.如果是这样,那么ActionEvent
将排队,最终在调用应用程序阶段期间调用.
至于EL的论点,它实际上并不是火箭科学.整个EL表达式只是在调用应用程序阶段执行.它不是在生成表单的HTML输出时执行,然后以某种方式作为请求参数传递.不,它刚刚在实际调用应用程序阶段执行.
归档时间: |
|
查看次数: |
1085 次 |
最近记录: |