如何从数据表中删除元素
How to remove element from datatable
使用 Primefaces datatables with radio button selection 的简单应用程序无法正常运行。
当我选择带有单选按钮的元素时,event
参数是 delete()
方法中的 null
,因此无法从数据表中删除 selected 行。
view.xhtml // 这是我遇到问题的地方
<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>Event List</title>
</h:head>
<h:body>
<h:form>
<p:dataTable id="eventlist" var="event" value="#{eventBean.eventlist}" selection="#{eventBean.selectedEvent}" rowKey="#{event.id}" scrollable="true" scrollHeight="200" style="width:500px;">
<f:facet name="header">
Event List
</f:facet>
<p:column selectionMode="single" style="width:16px;text-align:center"/>
<p:column headerText="ID">
<h:outputText value="#{event.id}">
</h:outputText>
</p:column>
<p:column headerText="Date">
<h:outputText value="#{event.date}">
<f:convertDateTime pattern="yyyy-MM-dd" />
</h:outputText>
</p:column>
<f:facet name="footer">
<p:commandButton process="eventlist" action="#{eventBean.delete(eventBean.event)}" value="#{eventBean.event}" ajax="true" >
</p:commandButton>
</f:facet>
</p:dataTable>
</h:form>
</h:body>
EventBean.java // 这是我的托管 bean
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.ManagedBean;
import javax.ejb.EJB;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
@ManagedBean
@Named(value = "eventBean")
@RequestScoped
public class EventBean {
@EJB
private EventManager em;
private Event event;
private Event selectedEvent = new Event();
private Date currentDate;
private List<Event> eventlist = new ArrayList<Event>();
public Date getCurrentDate() {
if (currentDate == null) {
currentDate = new Date();
}
return currentDate;
}
public EventBean() {
}
public Event getEvent() {
if (event == null) {
event = new Event();
}
return event;
}
public void setEvent(Event event) {
this.event = event;
}
public List<Event> getEventlist() {
return eventlist;
}
public void setEventlist(List<Event> eventlist) {
this.eventlist = eventlist;
}
public Event getSelectedEvent() {
return selectedEvent;
}
public void setSelectedEvent(Event selectedEvent) {
this.selectedEvent = selectedEvent;
}
public String create() {
em.save(event);
eventlist = em.findEvents();
return "view";
}
public String delete(Event event){ //the event object is null
em.deleteEvent(event);
return "index";
}
}
简而言之,我想要实现的是:select 正确地从数据表中删除行,然后从数据表和数据库中删除它。
selection 设置为 #{eventBean.selectedEvent}
,但您将 #{eventBean.event}
来回传递给 delete 方法。这个问题有两个方面。首先,这是错误的属性。其次,你不需要来回传递它。已经在豆子里了。
所以,应该这样做:
<p:commandButton ... action="#{eventBean.delete}" />
和
public String delete() {
em.deleteEvent(selectedEvent);
return "index";
}
另一件奇怪的事情是,在 bean 的初始化过程中,您没有在任何地方初始化 eventlist
。这意味着当您提交表单时,在新请求期间,其中请求范围的 bean 是新构造和初始化的,eventlist
将是 null
,因此 select 将没有可用的内容并在模型中设置。
你应该在EventBean
中有以下方法:
@PostConstruct
public void init() {
eventlist = em.findEvents();
}
这样,您现在应该也能够在浏览器中直接打开 view.xhtml
时看到列表,而无需首先在另一个页面中提交任意表单。换句话说,现在终于 idempotent.
与具体问题无关,您正在混合使用 JSF 和 CDI bean 管理注释。完全摆脱 @ManagedBean
注释。您还在 getter 方法中执行延迟加载。摆脱它们并在 @PostConstruct
中完成工作,并保持自动生成的 getter(和 setter)方法不变。通过这种方式,您还可以轻松地在问题中提供更短的代码片段,您可以省略所有 getters/setters,因为它们足够明显。
使用 Primefaces datatables with radio button selection 的简单应用程序无法正常运行。
当我选择带有单选按钮的元素时,event
参数是 delete()
方法中的 null
,因此无法从数据表中删除 selected 行。
view.xhtml // 这是我遇到问题的地方
<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>Event List</title>
</h:head>
<h:body>
<h:form>
<p:dataTable id="eventlist" var="event" value="#{eventBean.eventlist}" selection="#{eventBean.selectedEvent}" rowKey="#{event.id}" scrollable="true" scrollHeight="200" style="width:500px;">
<f:facet name="header">
Event List
</f:facet>
<p:column selectionMode="single" style="width:16px;text-align:center"/>
<p:column headerText="ID">
<h:outputText value="#{event.id}">
</h:outputText>
</p:column>
<p:column headerText="Date">
<h:outputText value="#{event.date}">
<f:convertDateTime pattern="yyyy-MM-dd" />
</h:outputText>
</p:column>
<f:facet name="footer">
<p:commandButton process="eventlist" action="#{eventBean.delete(eventBean.event)}" value="#{eventBean.event}" ajax="true" >
</p:commandButton>
</f:facet>
</p:dataTable>
</h:form>
</h:body>
EventBean.java // 这是我的托管 bean
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.ManagedBean;
import javax.ejb.EJB;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
@ManagedBean
@Named(value = "eventBean")
@RequestScoped
public class EventBean {
@EJB
private EventManager em;
private Event event;
private Event selectedEvent = new Event();
private Date currentDate;
private List<Event> eventlist = new ArrayList<Event>();
public Date getCurrentDate() {
if (currentDate == null) {
currentDate = new Date();
}
return currentDate;
}
public EventBean() {
}
public Event getEvent() {
if (event == null) {
event = new Event();
}
return event;
}
public void setEvent(Event event) {
this.event = event;
}
public List<Event> getEventlist() {
return eventlist;
}
public void setEventlist(List<Event> eventlist) {
this.eventlist = eventlist;
}
public Event getSelectedEvent() {
return selectedEvent;
}
public void setSelectedEvent(Event selectedEvent) {
this.selectedEvent = selectedEvent;
}
public String create() {
em.save(event);
eventlist = em.findEvents();
return "view";
}
public String delete(Event event){ //the event object is null
em.deleteEvent(event);
return "index";
}
}
简而言之,我想要实现的是:select 正确地从数据表中删除行,然后从数据表和数据库中删除它。
selection 设置为 #{eventBean.selectedEvent}
,但您将 #{eventBean.event}
来回传递给 delete 方法。这个问题有两个方面。首先,这是错误的属性。其次,你不需要来回传递它。已经在豆子里了。
所以,应该这样做:
<p:commandButton ... action="#{eventBean.delete}" />
和
public String delete() {
em.deleteEvent(selectedEvent);
return "index";
}
另一件奇怪的事情是,在 bean 的初始化过程中,您没有在任何地方初始化 eventlist
。这意味着当您提交表单时,在新请求期间,其中请求范围的 bean 是新构造和初始化的,eventlist
将是 null
,因此 select 将没有可用的内容并在模型中设置。
你应该在EventBean
中有以下方法:
@PostConstruct
public void init() {
eventlist = em.findEvents();
}
这样,您现在应该也能够在浏览器中直接打开 view.xhtml
时看到列表,而无需首先在另一个页面中提交任意表单。换句话说,现在终于 idempotent.
与具体问题无关,您正在混合使用 JSF 和 CDI bean 管理注释。完全摆脱 @ManagedBean
注释。您还在 getter 方法中执行延迟加载。摆脱它们并在 @PostConstruct
中完成工作,并保持自动生成的 getter(和 setter)方法不变。通过这种方式,您还可以轻松地在问题中提供更短的代码片段,您可以省略所有 getters/setters,因为它们足够明显。