Jsf 从表单外部处理数据表
我在datatable表单外有一个按钮,它的功能是删除所选行,但问题是它在backingbean中返回该行的空值,咆哮消息的更新正确完成,并且该操作也被调用 然而,当把按钮放在表单中时,它可以正常工作,但我需要它位于表单外部的工具栏中 这是我的xhtml代码:Jsf 从表单外部处理数据表,jsf,primefaces,Jsf,Primefaces,我在datatable表单外有一个按钮,它的功能是删除所选行,但问题是它在backingbean中返回该行的空值,咆哮消息的更新正确完成,并且该操作也被调用 然而,当把按钮放在表单中时,它可以正常工作,但我需要它位于表单外部的工具栏中 这是我的xhtml代码: 我已将rowKey更改为实体类型,为表单分配了唯一的id。无需在p:commandButton单击处处理表单。我将此按钮放入中。命令组件必须始终存在。单击行时完成的图元选择。单击按钮时,它将使用预设实体从列表中删除。只需重新提交。我将控制
我已将rowKey更改为实体类型,为表单分配了唯一的id。无需在
p:commandButton
单击处处理表单。我将此按钮放入
中。命令组件必须始终存在。单击行时完成的图元选择。单击按钮时,它将使用预设实体从列表中删除。只需重新提交
。我将控制器移动到javax.faces.view.ViewScope
中。PrimeFaces组件默认使用ajax,因此控制器的作用域必须至少与view一样宽
facelet:
?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<div class="row" >
<h:form id="toolbarForm">
<p:toolbar id="tb">
<f:facet name="left">
<p:commandButton value="Delete selected User" process="@this" update="myForm" actionListener="#{myBean.deleteUser}"/>
</f:facet>
</p:toolbar>
</h:form>
</div>
<h:form id="myForm">
<p:dataTable id="usersTable" value="#{myBean.users}" var="user" selectionMode="single" selection="#{myBean.selectedUser}" rowKey="#{user}">
<p:column>
<f:facet name="header">ID</f:facet>
#{user.id}
</p:column>
<p:column>
<f:facet name="header">First name</f:facet>
#{user.firstName}
</p:column>
<p:column>
<f:facet name="header">Last name</f:facet>
#{user.lastName}
</p:column>
</p:dataTable>
</h:form>
</h:body>
</html>
源代码包含注释以避免样板代码(getter/setter方法)表单外部的命令按钮不能用于提交表单。如果您想实现所需的功能,一种方法是
在表单中有一个p:remoteCommand,并将其绑定到支持bean方法personel.removeSelectedAnalyse和Have update=“@form”
使用onclick属性从工具栏的command按钮调用remoteCommand,remoteCommand将提交表单。现在,支持bean将从表单中获得提交的值,这样您就可以进行必要的处理,并且表单将在Ajax请求完成后更新
远程命令showcase:尝试以下操作:process=“@this,form”
it not work:/“此按钮执行更新并运行操作,但返回所选行的空值”。是个人选择的分析
?控制器的作用域是什么?它的请求scoppedPrimeFaces组件使用ajax。ajax始终至少需要ViewScope。您让我意识到,命令按钮中的过程是不需要的。我将尝试更改为ViewScope,并查看它是否工作使用用户类中的一个字段可以节省更多的空间,并为getter/setter腾出空间;-)仅仅发布“它对我有用”是有点不符合StackOverflow的礼节的。你改变了什么,为什么?@Kukeltje感谢你对我错误的反思。我已经添加了缺少的内容。通过将内容添加到进程属性(如process=“@this,myForm:usersTable”
)来处理其他形式的内容并不一定有效(这是偶然的,如果将来删除它,我也不会感到惊讶)。它只适用于PF命令按钮和链接,甚至不适用于p:ajax
标记afaik。而且它不适用于普通的jsf ajax。因此,我不会依赖它,只是把事情放在正常的形式上。谢谢你的回答。我尝试将rowkey设置为整个值,但它也不起作用“表单外的命令按钮不能用于提交该表单”你是否阅读了其他答案和我在下面的评论?你的答案可能行,我会根据我的建议试试看是否行得通needs@kukultje我同意你的观点。只是命令按钮也需要位于表单标签内,才能处理和提交另一个表单。如果您希望接受使用非默认行为,则不需要位于同一表单中。是的,不在同一表单中,但也需要位于表单内。例如,form1中的commandbutton可用于提交form2。
package x;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Named;
import javax.faces.view.ViewScoped;
import lombok.Data;
@Data
@Named( value = "myBean" )
@ViewScoped
public class MyBean implements Serializable
{
private List<User> users;
private User selectedUser;
public MyBean()
{
users = new ArrayList<>();
users.add( new User( 1, "First1", "Last1" ) );
users.add( new User( 2, "First2", "Last2" ) );
users.add( new User( 3, "First3", "Last3" ) );
users.add( new User( 4, "First4", "Last4" ) );
users.add( new User( 5, "First5", "Last5" ) );
}
@PostConstruct
public void init()
{
System.out.println( "MyBean.init() called" );
}
public void deleteUser()
{
if ( selectedUser == null )
System.out.println( "Selected User is null" );
else
System.out.println( "The ID of the User to remove: " + Integer.toString( selectedUser.getId() ) );
boolean bn = users.remove( selectedUser );
}
}
package x;
import lombok.Data;
@Data
public class User
{
private int id;
private String firstName;
private String lastName;
public User( int id_, String firstName_, String lastName_ )
{
id = id_;
firstName = firstName_;
lastName = lastName_;
}
}