fug*_*007 0 java mysql dialog primefaces jsf-2
我有一个数据表页面(Java + JSF + PRIMEFACES + Oracle GlassFish Server 3.1.2.2 + MYSQL)。当我在页面中指定行并单击“ 显示”按钮时,您可以在弹出窗口中看到以下内容:

当我尝试编辑行时,我单击“ 编辑”。

问题从这里开始,当我单击复选标记时,该行消失了:
我在服务器日志中看到:
ThreadName = Thread-2; | javax.faces.model.NoRowAvailableException javax.faces.model.NoRowAvailableException javax.faces.model.ListDataModel.getRowData(ListDataModel.java:150)在javax.faces.component.UIData.getRowData(UIData .java:371),位于org.primefaces.component.datatable.DataTable.queueEvent(DataTable.java:620),位于org.primefaces.component.behavior.ajax.AjaxBehaviorRenderer.decode(AjaxBehaviorRenderer.java:44)。 org.primefaces.renderkit.CoreRenderer.decodeBehaviors(CoreRenderer.java:395)的component.behavior.ClientBehaviorBase.decode(ClientBehaviorBase.java:132)在org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:64) org.primefaces处的javax.faces.component.UIComponentBase.decode(UIComponentBase.java:787)处。com.sun.faces.context.PartialViewContextImpl $ PhaseAwareVisitCallback.visit(Component.api.UIData.processDecodes(UIData.java:232)在com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialViewContextImpl.java:506)在org.primefaces.component.api.UIData.visitTree(UIData.java:675)在javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)的java.faces.component.UIComponent上的PartialVisitContext.java:183) .visitTree(UIComponent.java:1601)在javax.faces.component.UIForm.visitTree(UIForm.java:344)在javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)在com.sun.faces。 context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:376)位于com.sun.faces.context.PartialViewContextImpl。org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:57)为org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:57)为javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:931)为com.sun.faces.lifecycle位于com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)位于com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)处的.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78) org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)处的javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) java:281),位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)在org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)在org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)在org.apache.catalina.core.StandardHostValve com的org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)的.invoke(StandardHostValve.java:161)。位于com.sun的sun.enterprise.v3.services.impl.ContainerMapper $ AdapterCallable.call(ContainerMapper.java:317)位于com.sun的sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) com.sun上的grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)com.sun上的grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)。com.sun.grizzly的grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)的grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)在com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java :79)在com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)在com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)在com.sun.grizzly.ContextTask.run(ContextTask。 java:71),网址为com.sun.grizzly.util.AbstractThreadPool $ Worker。doWork(AbstractThreadPool.java:532)在com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:513)在java.lang.Thread.run(Thread.java:724)|#]
这是我的页面:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
>
<h:head>
<title>Teszt</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" type="text/css" href="style.css"/>
</h:head>
<ui:debug />
<h:form id="form">
<p:fieldset legend="Teszt:">
<p:dataTable id="dataTableTeszt" value="#{TesztBean.values}" var="c" paginator="true" rows="25" editable="true" filteredValue="#{TesztBeanBean.filteredOsszesito}" scrollable="true" scrollWidth="1500" scrollHeight="550"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
paginatorPosition="bottom" rowsPerPageTemplate="5,10,15,20,30,40,50"
selectionMode="multiple" selection="#{TesztBean.selectList}" rowKey="#{c.id}">
<p:column selectionMode="multiple" style="width:2%;text-align:center"/>
<p:column style="width: 130px; text-align: center" filterBy="#{c.id}" filterMatchMode="contains">
<f:facet name="header">ID:</f:facet>
<h:outputText value="#{c.id}" style="width: 130px; text-align: center"/>
</p:column>
<p:column style="width: 130px; text-align: center" filterBy="#{c.name}" filterMatchMode="contains">
<f:facet name="header">Name:</f:facet>
<h:outputText value="#{c.name}" style="width: 130px; text-align: center"/>
</p:column>
<p:column style="width: 130px; text-align: center" filterBy="#{c.age}" filterMatchMode="contains" >
<f:facet name="header">Age:</f:facet>
<h:outputText value="#{c.age}" style="width: 130px; text-align: center"/>
</p:column>
<p:column style="width: 230px; text-align: center" filterBy="#{c.kapcsolatfelvetel_megtortent}" filterMatchMode="contains" >
<f:facet name="header">Kapcsolatfelvétel megtörtént:</f:facet>
<h:outputText value="#{c.kapcsolatfelvetel_megtortent}" style="width: 230px; text-align: center"/>
</p:column>
<p:column style="width: 230px; text-align: center" filterBy="#{c.levelkuldesenek_datuma}" filterMatchMode="contains" >
<f:facet name="header">Levélküldés dátuma:</f:facet>
<h:outputText value="#{c.levelkuldesenek_datuma}" style="width: 230px; text-align: center"/>
</p:column>
<p:column style="width: 230px; text-align: center" filterBy="#{c.kepzes_kezdete}" filterMatchMode="contains" >
<f:facet name="header">Képzés kezdete:</f:facet>
<h:outputText value="#{c.kepzes_kezdete}" style="width: 230px; text-align: center"/>
</p:column>
<p:column style="width: 230px; text-align: center" filterBy="#{c.kepzes_vege}" filterMatchMode="contains" >
<f:facet name="header">Képzés vege:</f:facet>
<h:outputText value="#{c.kepzes_vege}" style="width: 230px; text-align: center"/>
</p:column>
<p:column style="width: 1000px; text-align: center" filterBy="#{c.magyarazat}" filterMatchMode="contains">
<f:facet name="header">Megjegyzés:</f:facet>
<h:outputText value="#{c.magyarazat}" style="width: 1000px; text-align: center"/>
</p:column>
<f:facet name="footer">
<p:commandButton id="addCategoryButton" value="Show" oncomplete="categoryDialog.show();" update=":form:dataTableTesztDialog :form:categoryDialog"/>
</f:facet>
</p:dataTable>
</p:fieldset>
<p:dialog id="categoryDialog" header="Category Detail" widgetVar="categoryDialog" closeOnEscape="true" resizable="false" style="width:1000px; height: 500px;" showEffect="explode" hideEffect="bounce">
<p:dataTable id="dataTableTesztDialog" value="#{TesztBean.selectList}" var="d" paginator="true" rows="25" editable="true">
<p:ajax event="rowEdit" listener="#{TesztBean.update(event)}"/>
<p:column style="width: 60px; text-align: center" headerText="Edit">
<p:rowEditor />
</p:column>
<p:column style="width: 130px; text-align: center">
<f:facet name="header">ID:</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{d.id}" style="width: 130px; text-align: center"/>
</f:facet>
<f:facet name="input">
<p:inputText value="#{d.id}"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="width: 230px; text-align: center">
<f:facet name="header">Kapcsolatfelvétel megtörtént:</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{d.kapcsolatfelvetel_megtortent}" style="width: 230px; text-align: center"/>
</f:facet>
<f:facet name="input">
<p:inputText value="#{d.kapcsolatfelvetel_megtortent}"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="width: 230px; text-align: center">
<f:facet name="header">Levélküldés dátuma:</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{d.levelkuldesenek_datuma}" style="width: 230px; text-align: center"/>
</f:facet>
<f:facet name="input">
<p:inputText value="#{d.levelkuldesenek_datuma}"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="width: 230px; text-align: center">
<f:facet name="header">Képzés kezdete:</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{d.kepzes_kezdete}" style="width: 230px; text-align: center"/>
</f:facet>
<f:facet name="input">
<p:inputText value="#{d.kepzes_kezdete}"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="width: 230px; text-align: center">
<f:facet name="header">Képzés vege:</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{d.kepzes_vege}" style="width: 230px; text-align: center"/>
</f:facet>
<f:facet name="input">
<p:inputText value="#{d.kepzes_vege}"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="width: 350px; text-align: center">
<f:facet name="header">Megjegyzés:</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{d.magyarazat}" style="width: 350px; text-align: center"/>
</f:facet>
<f:facet name="input">
<p:inputText value="#{d.magyarazat}"/>
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</p:dialog>
</h:form>
</html>
Run Code Online (Sandbox Code Playgroud)
这是我的bean类:
import java.awt.event.ActionEvent;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import org.primefaces.event.RowEditEvent;
import org.primefaces.model.LazyDataModel;
@ManagedBean(name="tesztBean")
@SessionScoped
@ViewScoped
public class TesztBean{
String URL = "jdbc:mysql://localhost:3306/osszesito?useUnicode=yes&characterEncoding=UTF-8";
String USER = "User";
String PASSWORD = "Password";
String DRIVER = "com.mysql.jdbc.Driver";
private List<TesztSetGet> filteredOsszesito;
private List<TesztSetGet> values;
private List<TesztSetGet> selectList;
public List<TesztSetGet> getSelectList() {
return selectList;
}
public void setSelectList(List<TesztSetGet> selectList) {
this.selectList = selectList;
}
@PostConstruct
public void init() {
try {
values = selectTesztTable();
} catch (SQLException e) {
e.printStackTrace();
}
}
public Connection getDBConnection() {
Connection dbConnection = null;
try {
Class.forName(DRIVER);
dbConnection= DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("Connection completed.");
} catch (SQLException e) {
System.out.println(e.getMessage());
}catch(ClassNotFoundException cnfe){
cnfe.printStackTrace();
System.out.println(cnfe.getMessage());
System.exit(-1);
}
return dbConnection;
}
public List<TesztSetGet> selectTesztTable() throws SQLException{
ResultSet rs = null;
PreparedStatement pst = null;
Connection con = getDBConnection();
String stm = "select * from teszt order by age";
List<TesztSetGet> records = new ArrayList<TesztSetGet>();
try {
pst = con.prepareStatement(stm);
pst.execute();
rs = pst.getResultSet();
while(rs.next()){
TesztSetGet objectMeghiv = new TesztSetGet();
objectMeghiv.setId(rs.getInt(1));
objectMeghiv.setName(rs.getString(2));
objectMeghiv.setAge(rs.getInt(3));
objectMeghiv.setKapcsolatfelvetel_megtortent(rs.getString(4));
objectMeghiv.setLevelkuldesenek_datuma(rs.getString(5));
objectMeghiv.setKepzes_kezdete(rs.getString(6));
objectMeghiv.setKepzes_vege(rs.getString(7));
objectMeghiv.setMagyarazat(rs.getString(8));
records.add(objectMeghiv);
}
return records;
}catch (SQLException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally{
rs.close();
pst.close();
con.close();
}
return records;
}
public List<TesztSetGet> getValues() {
return values;
}
public void update(RowEditEvent event) {
TesztSetGet edittedObject = (TesztSetGet) event.getObject();
Connection connection = null;
PreparedStatement pst = null;
ResultSet rs = null;
String sql = "update teszt set kapcsolatfelvetel_megtortent=?, levelkuldes_datuma=?, kepzes_kezdete=?, kepzes_vege=?, megjegyzes=? where id=?";
try{
connection = getDBConnection();
pst = connection.prepareStatement(sql);
pst.setString(1, edittedObject.getKapcsolatfelvetel_megtortent());
pst.setString(2, edittedObject.getLevelkuldesenek_datuma());
pst.setString(3, edittedObject.getKepzes_kezdete());
pst.setString(4, edittedObject.getKepzes_vege());
pst.setString(5, edittedObject.getMagyarazat());
pst.setInt(6, edittedObject.getId());
pst.executeUpdate();
pst.close();
connection.close();
}catch(SQLException se){
se.printStackTrace();
se.getMessage();
}catch(Exception e){
e.printStackTrace();
e.ge
首先,您必须了解范围的种类:
作用域是数据的生命周期,您只能使用一个,代码中有两个作用域:
@SessionScoped
@ViewScoped
Run Code Online (Sandbox Code Playgroud)
我建议您使用ViewScoped,但是请考虑要保留数据的时间,如果选择ViewScoped,则数据将保留,而您不更改视图或页面,如果选择SessionScoped,则数据将保留当您不注销时。
现在,您必须更新表列表。你有:
<p:dataTable id="dataTableTeszt" value="#{TesztBean.values}" var="c" paginator="true" rows="25" editable="true" filteredValue="#{TesztBeanBean.filteredOsszesito}" scrollable="true" scrollWidth="1500" scrollHeight="550"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
paginatorPosition="bottom" rowsPerPageTemplate="5,10,15,20,30,40,50"
selectionMode="multiple" selection="#{TesztBean.selectList}" rowKey="#{c.id}">
Run Code Online (Sandbox Code Playgroud)
表的主要列表是values value="#{TesztBean.values}",当调用update方法时,必须更新values列表:
public void update(RowEditEvent event) {
TesztSetGet edittedObject = (TesztSetGet) event.getObject();
Connection connection = null;
PreparedStatement pst = null;
ResultSet rs = null;
String sql = "update teszt set kapcsolatfelvetel_megtortent=?, levelkuldes_datuma=?, kepzes_kezdete=?, kepzes_vege=?, megjegyzes=? where id=?";
try{
connection = getDBConnection();
pst = connection.prepareStatement(sql);
pst.setString(1, edittedObject.getKapcsolatfelvetel_megtortent());
pst.setString(2, edittedObject.getLevelkuldesenek_datuma());
pst.setString(3, edittedObject.getKepzes_kezdete());
pst.setString(4, edittedObject.getKepzes_vege());
pst.setString(5, edittedObject.getMagyarazat());
pst.setInt(6, edittedObject.getId());
pst.executeUpdate();
pst.close();
connection.close();
//UPDATE VALUES LIST WITH NEW DATA
}catch(SQLException se){
se.printStackTrace();
se.getMessage();
}catch(Exception e){
e.printStackTrace();
e.getMessage();
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何做到这一点,但是您可以看到primefaces网站,其中有一些示例,其想法是更新表的主列表,并根据情况更新值列表。
希望这些信息对您有所帮助。
祝好运。
PS。如果我的英语不好,我愿意收到评论。= P