按钮的“名称=值”对本身通常可以用作HTTP请求参数。想象一下,命令按钮的生成的HTML表示如下所示
<input type="submit" name="formId:buttonId" value="Submit" ... />
Run Code Online (Sandbox Code Playgroud)
然后,它作为请求参数出现,其名称formId:buttonId带有非空值。JSF在“应用请求值”阶段完全使用此信息来确定是否按下了按钮。这发生在decode()与按钮组件关联的渲染器方法期间,大致如下:
if (externalContext.getRequestParameterMap().containsKey(component.getClientId(context))) {
component.queueEvent(new ActionEvent(component));
}
Run Code Online (Sandbox Code Playgroud)
或者,当涉及到ajax请求时,该按钮的名称可以用作javax.faces.Sourcerequest参数的值。
if (component.getClientId(context).equals(externalContext.getRequestParameterMap().get("javax.faces.Source"))) {
component.queueEvent(new ActionEvent(component));
}
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,ActionEvent最终都会将其存储为私有字段,UIViewRoot而公共API 则无法使用该私有字段。因此,除非您掌握了反射和实现方面的特定技巧,否则到此为止。
要确定按下的按钮,最好的选择是像JSF本身一样手动检查请求参数映射。
根据具体的功能需求,这不正是从这个问题清楚了,另一种可能是使用actionListener或<f:actionListener>对所有UICommand感兴趣的组件,或者使用<action-listener>在faces-config.xml注册一个全球性的。将在调用实数之前立即action调用它。
| 归档时间: |
|
| 查看次数: |
3133 次 |
| 最近记录: |