关于JSF/PF+Hibernate+JPA(web开发中)数据的添加,更新,以及界面数据显示小结(图片待传)
2015-01-30 16:15
375 查看
一.完成功能:
a. 通过JPA 接口读出数据,在web页面显示,然后修改后更新到数据库.
b.在web页面 添加新纪录到数据库.
c.列表中既显示主表数据,同时显示分表数据.
界面示意图如下:(待传)
二.实现细节:
(1)xhtml文件(test.xhtml):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<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">
<f:view contentType="text/html">
<h:head>
<f:facet name="first">
<meta content='text/html; charset=UTF-8' http-equiv="Content-Type"/>
<title>I示例</title>
</f:facet>
</h:head>
<h:body>
<h:form id="qryForm">
<h:outputLabel for="projectNo" value="B-名字"/>
<p:inputText value="#{mngBean.bname}" />
<p:commandButton value="查询" actionListener="#{mngBean.query()}" update=":qryForm:mainTable :testform"/>
<p:dataTable id="mainTable" selectionMode="single" selection="#{mngBean.testDataJSFRow}" rowKey="#{test.b.id}" var="test" value="#{mngBean.testDataJSFList}" >
<p:ajax event="rowSelect" update=":editform" />
<p:column headerText="A-名字" >
<h:outputText value="#{test.a.name}"/>
</p:column>
<p:column headerText="B-名字">
<h:outputText value="#{test.b.name}"/>
</p:column>
<p:column headerText="B-备注" >
<h:outputText value="#{test.b.remark}"/>
</p:column>
</p:dataTable>
</h:form>
<h:form id="editform">
<h:panelGrid columns="2" >
<p:outputLabel value="A-名字:" />
<p:inputText value="#{mngBean.testDataJSFRow.a.name}" />
<p:outputLabel value="B-名字:" />
<p:inputText value="#{mngBean.testDataJSFRow.b.name}" />
<p:outputLabel value="B-备注:" />
<p:inputText value="#{mngBean.testDataJSFRow.b.remark}" />
</h:panelGrid>
<h:panelGrid columns="2" >
<p:commandButton value="添加" update=":editform" actionListener="#{mngBean.newRecord()}" >
</p:commandButton>
<p:commandButton value="提交" update=":qryForm:mainTable :editform" actionListener="#{mngBean.submit()}" >
</p:commandButton>
</h:panelGrid>
</h:form>
</h:body>
</f:view>
</html>
(2)管理bean(mngBean.java):
@ManagedBean
@ViewScoped
public class OrderMngBean implements Serializable {
@ManagedProperty(value = "#{testPrv}")
private ITestPrv testPrv;
private String bname;
private testDataJSF testDataJSFRow = new testDataJSF();
private List testDataJSFList=new ArrayList();
public void query(){
//查询方法(略)
}
public void newRecord(){
testDataJSFRow = new testDataJSF();
testDataJSFRow.setA(new A());
testDataJSFRow.setB(new B());
}
public void submit(){
testPrv.save(testDataJSFRow);//此处save可完成更新和添加新数据的功能(有id时为更新,无id时为添加新数据)
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname =bname;
}
public testDataJSF getTestDataJSFRow() {
return testDataJSFRow;
}
public void setTestDataJSFRow(testDataJSF testDataJSFRow) {
this.testDataJSFRow =testDataJSFRow;
}
public List getTestDataJSFList() {
return testDataJSFList;
}
public void setTestDataJSFList(List testDataJSFList) {
this.testDataJSFList = testDataJSFList;
}
public ITestPrv getTestPrv() {
return testPrv;
}
public void setTestPrv(ITestPrv testPrv) {
this.testPrv=testPrv;
}
}
(3)界面显示类:
public class TestDataJSF {
private A a=new A();
private B b=new B();
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
public B getB() {
return b;
}
public void setB(B b) {
this.b= b;
}
}
(4)entity(实体类):
类A:
@Entity
@Table(name = "a")
@XmlRootElement
@NamedQueries({
............
})
public class A implements Serializable {
@Column(name = "id")
private Integer Id;
@Column(name = "name")
private String name;
.......
}
类B:
@Entity
@Table(name = "b")
@XmlRootElement
@NamedQueries({
............
})
public class B implements Serializable {
@Column(name = "id")
private Integer Id;
@Column(name = "name")
private String name;
@Column(name = "remark")
private String remark;
.......
}
三.问题与总结:
(1)使用save()方法更新数据到数据库出现的空指针和数据错误问题:
原因与解决:当使用save()更新数据时,确保被更新的数据完整性,如果被更新的entity有属性为class类型,如果此class类型的属性为null,则更新时将出现NullException的报错;之所以出现数据错误,是因为被更新的数据的一些简单属性(非class类型)数据不全,更新后,当前的不完整的数据覆盖了数据库中的数据.
(2)使用save()方法添加新数据到数据库出现空指针和无任何操作执行问题:
原因与解决:出现空指针的原因同上,出现无操作的原因是在插入数据之前,将新数据对象的id做了操作.正确的做法是,插入时new 一个对象,为此对象设置完整属性值(id的值不要动).
(3)实体类在界面显示时,界面显示类的设置问题.
解决:因为实体类是我们对数据库操作时传入接口的对象,需要保证数据的完整性,所以,为了减少更新中的赋值操作,在定义界面显示类时,直接将实体类作为界面显示类的属性,可以减少些麻烦.
a. 通过JPA 接口读出数据,在web页面显示,然后修改后更新到数据库.
b.在web页面 添加新纪录到数据库.
c.列表中既显示主表数据,同时显示分表数据.
界面示意图如下:(待传)
二.实现细节:
(1)xhtml文件(test.xhtml):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<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">
<f:view contentType="text/html">
<h:head>
<f:facet name="first">
<meta content='text/html; charset=UTF-8' http-equiv="Content-Type"/>
<title>I示例</title>
</f:facet>
</h:head>
<h:body>
<h:form id="qryForm">
<h:outputLabel for="projectNo" value="B-名字"/>
<p:inputText value="#{mngBean.bname}" />
<p:commandButton value="查询" actionListener="#{mngBean.query()}" update=":qryForm:mainTable :testform"/>
<p:dataTable id="mainTable" selectionMode="single" selection="#{mngBean.testDataJSFRow}" rowKey="#{test.b.id}" var="test" value="#{mngBean.testDataJSFList}" >
<p:ajax event="rowSelect" update=":editform" />
<p:column headerText="A-名字" >
<h:outputText value="#{test.a.name}"/>
</p:column>
<p:column headerText="B-名字">
<h:outputText value="#{test.b.name}"/>
</p:column>
<p:column headerText="B-备注" >
<h:outputText value="#{test.b.remark}"/>
</p:column>
</p:dataTable>
</h:form>
<h:form id="editform">
<h:panelGrid columns="2" >
<p:outputLabel value="A-名字:" />
<p:inputText value="#{mngBean.testDataJSFRow.a.name}" />
<p:outputLabel value="B-名字:" />
<p:inputText value="#{mngBean.testDataJSFRow.b.name}" />
<p:outputLabel value="B-备注:" />
<p:inputText value="#{mngBean.testDataJSFRow.b.remark}" />
</h:panelGrid>
<h:panelGrid columns="2" >
<p:commandButton value="添加" update=":editform" actionListener="#{mngBean.newRecord()}" >
</p:commandButton>
<p:commandButton value="提交" update=":qryForm:mainTable :editform" actionListener="#{mngBean.submit()}" >
</p:commandButton>
</h:panelGrid>
</h:form>
</h:body>
</f:view>
</html>
(2)管理bean(mngBean.java):
@ManagedBean
@ViewScoped
public class OrderMngBean implements Serializable {
@ManagedProperty(value = "#{testPrv}")
private ITestPrv testPrv;
private String bname;
private testDataJSF testDataJSFRow = new testDataJSF();
private List testDataJSFList=new ArrayList();
public void query(){
//查询方法(略)
}
public void newRecord(){
testDataJSFRow = new testDataJSF();
testDataJSFRow.setA(new A());
testDataJSFRow.setB(new B());
}
public void submit(){
testPrv.save(testDataJSFRow);//此处save可完成更新和添加新数据的功能(有id时为更新,无id时为添加新数据)
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname =bname;
}
public testDataJSF getTestDataJSFRow() {
return testDataJSFRow;
}
public void setTestDataJSFRow(testDataJSF testDataJSFRow) {
this.testDataJSFRow =testDataJSFRow;
}
public List getTestDataJSFList() {
return testDataJSFList;
}
public void setTestDataJSFList(List testDataJSFList) {
this.testDataJSFList = testDataJSFList;
}
public ITestPrv getTestPrv() {
return testPrv;
}
public void setTestPrv(ITestPrv testPrv) {
this.testPrv=testPrv;
}
}
(3)界面显示类:
public class TestDataJSF {
private A a=new A();
private B b=new B();
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
public B getB() {
return b;
}
public void setB(B b) {
this.b= b;
}
}
(4)entity(实体类):
类A:
@Entity
@Table(name = "a")
@XmlRootElement
@NamedQueries({
............
})
public class A implements Serializable {
@Column(name = "id")
private Integer Id;
@Column(name = "name")
private String name;
.......
}
类B:
@Entity
@Table(name = "b")
@XmlRootElement
@NamedQueries({
............
})
public class B implements Serializable {
@Column(name = "id")
private Integer Id;
@Column(name = "name")
private String name;
@Column(name = "remark")
private String remark;
.......
}
三.问题与总结:
(1)使用save()方法更新数据到数据库出现的空指针和数据错误问题:
原因与解决:当使用save()更新数据时,确保被更新的数据完整性,如果被更新的entity有属性为class类型,如果此class类型的属性为null,则更新时将出现NullException的报错;之所以出现数据错误,是因为被更新的数据的一些简单属性(非class类型)数据不全,更新后,当前的不完整的数据覆盖了数据库中的数据.
(2)使用save()方法添加新数据到数据库出现空指针和无任何操作执行问题:
原因与解决:出现空指针的原因同上,出现无操作的原因是在插入数据之前,将新数据对象的id做了操作.正确的做法是,插入时new 一个对象,为此对象设置完整属性值(id的值不要动).
(3)实体类在界面显示时,界面显示类的设置问题.
解决:因为实体类是我们对数据库操作时传入接口的对象,需要保证数据的完整性,所以,为了减少更新中的赋值操作,在定义界面显示类时,直接将实体类作为界面显示类的属性,可以减少些麻烦.
相关文章推荐
- 关于C# Winform dataGridView显示时没有默认选中以及dataGridView添加DataTable中的数据
- 关于windows版本电脑版微信更新后无法显示好友头像以及接收图片和表情的解决方案
- 关于异步上传图片以及上传完成后显示缩略图的问题
- hibernate分页查询,在自己写的s2sh注册登录的基础上添加对数据表的分页显示功能
- 关于图片资源在android2.1/2.2/2.3下无法显示的问题以及解决方法
- 关于使用Hibernate以及JPA查询使用的问题
- 巧用CursorLoader实时更新界面上显示的数据
- 小结一下c#WinForm调用sql2000,将老表数据通过与新表数据比较,不同的添加进去,并使用进度条显示进度的教训与经验
- 关于ListView异步加载图片导致图片显示混乱以及ListView效率问题探讨
- 关于CListCtrl控件更新Item的闪烁问题和一次插入大容量数据的显示问题解决办法
- android 为 ListView Item中的组件添加事件 以及更新数据
- 关于图片在窗体显示后,无法更新或删除的问题
- 关于EF4.1更新数据后的显示问题-----PagedList
- 关于一点显示全部数据的小技巧 以及实现模糊查询的小技巧
- alv tree 为显示的树结构数据添加图片
- 关于Acess 图片存为ole类型,数据集合显示
- 关于Acess 图片存为ole类型,数据集合显示
- 工作问题 解决关于hibernate 更新数据的问题
- 关于ViewPager的数据更新问题小结
- 郁闷了半天,原来是这个问题:关于C#中关于图片保存到数据库以及将数据库中的图片显示到PictureBox。