我正在使用JSF 2和EJB 3.1来创建表单。
我正在使用页面的这一部分来获取一些数据,所以我可以使用下面的confirmDialog将它传递给我的bean
<p:column headerText="#{bundle.edit}" style="width:10px; overflow:visible;">
<p:rowEditor/>
</p:column>
<p:column headerText="#{bundle.delete}" style="width:10px; overflow:visible;">
<p:commandButton update=":form" oncomplete="confirmation.show()"
image="ui-icon ui-icon-close" title="Delete">
<f:param value="#{user}" name="userAction" />
</p:commandButton>
</p:column>
</p:dataTable>
<p:confirmDialog message="Are you sure? user:#{param['userAction']} " width="500"
header="Confirm" severity="alert" widgetVar="confirmation">
<p:commandButton value="Yes sure" update=":form"
actionListener="#{userController.deleteAction(param['userAction'])}"
oncomplete="confirmation.hide()" />
<p:commandButton value="Not yet" onclick="confirmation.hide()" type="button" />
</p:confirmDialog>
</h:form>
这是应该得到它的Bean
@Named(value = "userController")
@Stateful
@RequestScoped
@TransactionManagement(TransactionManagementType.CONTAINER)
public class UserController implements Serializable {
private User current;
@Inject
private br.com.cflex.itm.dataaccess.UserFacade userFacade;
public UserController() {
}
public void deleteAction(User user) {
userFacade.remove(user);
}
但我的bean只接收null作为User,而对话框中的我正在打印数据,所以我可以看到在那里选择了一个用户对象。
传递这样的参数有什么不妥?
为什么我的Bean中出现空值?因为它们在客户端和服务器端之间的通信中迷失了......
答案 0 :(得分:2)
<p:commandButton action="#{userController.deleteAction(param['userAction'])}" />
action
(和actionListener
)的EL在提交表单时进行评估,而不是在表单显示时进行评估。请求参数是请求范围的,并且在表单提交的后续请求中不存在。你需要传递它:
<p:commandButton action="#{userController.deleteAction(param['userAction'])}">
<f:param name="userAction" value="#{param['userAction']}" />
</p:commandButton>
在显示表单时评估<f:param>
的EL。因此,它将存在于生成的HTML中,并且JavaScript将注意它被传递。
请注意,请求参数属于String
类型。期待它们User
根本不起作用。基本上,它包含User#toString()
的值。您需要将String
作为操作参数并自行将其转换为User
。或者更好的是,使用<f:viewParam>
,其中您可以明确指定转换器。