Jsf p:数据表未编辑
我正在尝试创建一个DataTables,通过单击单元格编辑,如下所示: 我的问题是,该表不考虑修改。 我可以显示MySQL数据库中的数据。该表已正确加载,没有错误。当我尝试修改一个单元格时,它会按预期变成一个输入。但当我更改值并按enter键时,单元格将返回到其原始值。如果我在该单元格上重新进入编辑模式,我的修改将重新出现。不在数据库中进行任何修改 我对JSF和PrimeFaces不是很放心,我肯定错过了一些明显的东西 这是我的密码: 托管Bean:Jsf p:数据表未编辑,jsf,primefaces,datatable,Jsf,Primefaces,Datatable,我正在尝试创建一个DataTables,通过单击单元格编辑,如下所示: 我的问题是,该表不考虑修改。 我可以显示MySQL数据库中的数据。该表已正确加载,没有错误。当我尝试修改一个单元格时,它会按预期变成一个输入。但当我更改值并按enter键时,单元格将返回到其原始值。如果我在该单元格上重新进入编辑模式,我的修改将重新出现。不在数据库中进行任何修改 我对JSF和PrimeFaces不是很放心,我肯定错过了一些明显的东西 这是我的密码: 托管Bean: package Application;
package Application;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.faces.view.ViewScoped;
import org.primefaces.event.CellEditEvent;
import org.primefaces.event.RowEditEvent;
@Named(value = "plantCtrl")
@ViewScoped
public class PlantCtrl implements Serializable {
@EJB
private PlantDAO plantDAO;
public PlantCtrl() {
}
@PostConstruct
public void init(){
}
public List<Plant> getPlants() {
return plantDAO.allPlants();
}
public PlantDAO getPlantDAO() {
return plantDAO;
}
public void setPlantDAO(PlantDAO plantDAO) {
this.plantDAO = plantDAO;
}
public void onRowEdit(RowEditEvent event) {
FacesMessage msg = new FacesMessage("Plant Edited");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void onRowCancel(RowEditEvent event) {
FacesMessage msg = new FacesMessage("Edit Cancelled");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void onCellEdit(CellEditEvent event) {
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
if(newValue != null && !newValue.equals(oldValue)) {
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
}
包应用;
导入java.io.Serializable;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.ejb.ejb;
导入javax.faces.application.FacesMessage;
导入javax.faces.context.FacesContext;
导入javax.inject.Named;
导入javax.faces.view.ViewScoped;
导入org.primefaces.event.CellEditEvent;
导入org.primefaces.event.RowEditEvent;
@命名(value=“plantCtrl”)
@视域
公共类PlantCtrl实现可序列化{
@EJB
私人种植园;
公共PlantCtrl(){
}
@施工后
公共void init(){
}
公众植物名录{
返回plantDAO.allPlants();
}
公共PlantDAO getPlantDAO(){
返回plantDAO;
}
公共空间setPlantDAO(PlantDAO PlantDAO){
this.plantDAO=plantDAO;
}
公共无效onRowEdit(RowEditEvent事件){
FacesMessage msg=新的FacesMessage(“工厂编辑”);
FacesContext.getCurrentInstance().addMessage(null,msg);
}
公共作废onRowCancel(RowEditEvent事件){
FacesMessage msg=新的FacesMessage(“编辑已取消”);
FacesContext.getCurrentInstance().addMessage(null,msg);
}
public void onCellEdit(CellEditEvent事件){
对象oldValue=event.getOldValue();
Object newValue=event.getNewValue();
if(newValue!=null&!newValue.equals(oldValue)){
FacesMessage msg=新的FacesMessage(FacesMessage.SEVERITY_信息,“单元格已更改”,“旧的:+oldValue+”,新的:+newValue);
FacesContext.getCurrentInstance().addMessage(null,msg);
}
}
}
PlantDAO:
package Application;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
@Stateless
public class PlantDAO {
@PersistenceContext(unitName = "CarnivorousGardenPU")
private EntityManager em;
public List<Plant> allPlants() {
Query query = em.createNamedQuery("Plant.findAll");
return query.getResultList();
}
public void add(Plant p) {
em.persist(p);
em.flush();
}
public void edit(Plant p) {
em.merge(p);
em.flush();
}
public void remove(Plant p) {
em.remove(em.merge(p));
em.flush();
}
}
包应用;
导入java.util.List;
导入javax.ejb.Stateless;
导入javax.persistence.EntityManager;
导入javax.persistence.PersistenceContext;
导入javax.persistence.Query;
@无国籍
公共类PlantDAO{
@PersistenceContext(unitName=“CarnivorousGardenPU”)
私人实体管理者;
公开列出所有植物(){
Query Query=em.createNamedQuery(“Plant.findAll”);
返回query.getResultList();
}
公共空间添加(工厂p){
em.p;
em.flush();
}
公共空间编辑(工厂p){
em.merge(p);
em.flush();
}
公共空间移除(工厂p){
em.remove(em.merge(p));
em.flush();
}
}
XHTML:
<?xml version="1.0" encoding="UTF-8"?>
<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"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head>
<title>Dashboard</title>
</h:head>
<h:body>
<ui:include src="inc/header.xhtml" />
<h:form id="plantAdminList">
<p:growl id="msgs" showDetail="true"/>
<p:dataTable id="plantsTable" var="plant" value="#{plantCtrl.plants}" editable="true" editMode="cell" widgetVar="cellPlants">
<f:facet name="header">
Cell Editing with Click and RightClick
</f:facet>
<p:ajax event="cellEdit" listener="#{plantCtrl.onCellEdit}" update=":plantAdminList:msgs, :plantAdminList:plantsTable" />
<p:column headerText="Id">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{plant.genusPlant}" /></f:facet>
<f:facet name="input"><p:inputText id="modelInput" value="#{plant.genusPlant}" style="width:96%"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Price">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{plant.pricePlant}" /></f:facet>
<f:facet name="input"><p:inputText value="#{plant.pricePlant}" style="width:96%" label="Price"/></f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</h:form>
<ui:include src="/inc/footer.xhtml" />
</h:body>
</html>
仪表板
使用单击和右键单击进行单元格编辑
java由Netbeans自动生成,作为数据库中的实体类。我不是为了不让这篇文章超载而发帖的,但是如果需要,请毫不犹豫地询问。像这样修改托管bean的几行代码
//....
List<Plant> plants;
@PostConstruct
public void init(){
plants=plantDAO.allPlants();
}
public List<Plant> getPlants() {
return plants;
}
//....
onEditMethod
public void onRowEdit(RowEditEvent event) {
Plant editedPlant = (Plant)event.getObject();
plantDAO.edit(plant);
FacesMessage msg = new FacesMessage("Plant Edited");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
嗨,现在需要的是一个。这有助于您解决问题(有时甚至可以帮助您自己解决问题),也有助于我们帮助您……而且99.9%的此类问题与jsf和数据库无关。只需将其分开,然后查看值是否在服务器上结束。如果不是,那么它完全与jsf相关。如果是这样的话,那纯粹是数据库相关的abd而不是JSF嘿,谢谢你的回答,它成功了!你知道我如何保存数据吗?问题是event.getNewValue()将返回字符串、float等。。。取决于单元的类型。它不会返回对象本身,这使得以后使用我的编辑方法变得复杂。有没有办法从事件中获取已编辑的对象?@Cephou,我更新了我的答案,并添加了其他解释。还可以查看有关此的文档
public void onRowEdit(RowEditEvent event) {
Plant editedPlant = (Plant)event.getObject();
plantDAO.edit(plant);
FacesMessage msg = new FacesMessage("Plant Edited");
FacesContext.getCurrentInstance().addMessage(null, msg);
}