[英]Java Maven project: Update/Change/Set String Value of an Entity with Primefaces: <p:inputText/> does not work
#使用 Primfaces 输入文本和 Ajax 更改或设置实体的字符串值#
嗨,我正在使用 Java Maven 项目。 我正在尝试设置我的USER
实体的变量USERNAME
。 我将输入插入<p:inputText/>
字段后,字符串变量保持“空”。 不幸的是,我不知道我可以做什么来更新变量。
一开始是实体:
package entities;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
//import javax.persistence.Table;
@Entity
public class USER implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private int USERID;
// @OneToMany
private int VEREINSID;
private String GEBDATUM;
private String NAME;
private String USERNAME;
private String PASSWORT;
private String VEREINSTITEL;
private String ERWAERBSTAETIGKEIT;
private Double BEITRAGSSATZ;
public USER() {
}
public USER(int USERID, int VEREINSID, String GEBDATUM, String NAME, String USERNAME, String VEREINSTITEL, String ERWAERBSTAETIGKEIT, Double BEITRAGSSATZ) {
this.USERID = USERID;
this.VEREINSID = VEREINSID;
this.GEBDATUM = GEBDATUM;
this.NAME = NAME;
this.USERNAME = USERNAME;
this.VEREINSTITEL = VEREINSTITEL;
this.ERWAERBSTAETIGKEIT = ERWAERBSTAETIGKEIT;
this.BEITRAGSSATZ = BEITRAGSSATZ;
}
public USER(int USERID, int VEREINSID, String GEBDATUM, String NAME, String USERNAME, String PASSWORT, String VEREINSTITEL, String ERWAERBSTAETIGKEIT, Double BEITRAGSSATZ) {
this.USERID = USERID;
this.VEREINSID = VEREINSID;
this.GEBDATUM = GEBDATUM;
this.NAME = NAME;
this.USERNAME = USERNAME;
this.PASSWORT = PASSWORT;
this.VEREINSTITEL = VEREINSTITEL;
this.ERWAERBSTAETIGKEIT = ERWAERBSTAETIGKEIT;
this.BEITRAGSSATZ = BEITRAGSSATZ;
}
public int getUSERID() {
return USERID;
}
public void setUSERID(int USERID) {
this.USERID = USERID;
}
public int getVEREINSID() {
return VEREINSID;
}
public void setVEREINSID(int VEREINSID) {
this.VEREINSID = VEREINSID;
}
public String getGEBDATUM() {
return GEBDATUM;
}
public void setGEBDATUM(String GEBDATUM) {
this.GEBDATUM = GEBDATUM;
}
public String getNAME() {
return NAME;
}
public void setNAME(String Name) {
this.NAME = Name;
}
public String getUSERNAME() {
return USERNAME;
}
public void setUSERNAME(String USERNAME) {
this.USERNAME = USERNAME;
}
public String getPASSWORT() {
return PASSWORT;
}
public void setPASSWORT(String PASSWORT) {
this.PASSWORT = PASSWORT;
}
public String getVEREINSTITEL() {
return VEREINSTITEL;
}
public void setVEREINSTITEL(String VEREINSTITEL) {
this.VEREINSTITEL = VEREINSTITEL;
}
public String getERWAERBSTAETIGKEIT() {
return ERWAERBSTAETIGKEIT;
}
public void setERWAERBSTAETIGKEIT(String ERWAERBSTAETIGKEIT) {
this.ERWAERBSTAETIGKEIT = ERWAERBSTAETIGKEIT;
}
public Double getBEITRAGSSATZ() {
return BEITRAGSSATZ;
}
public void setBEITRAGSSATZ(Double BEITRAGSSATZ) {
this.BEITRAGSSATZ = BEITRAGSSATZ;
}
}
```
Here comes my xhtml document
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>testseite</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</h:head>
<h:body>
<h:form id="form1">
<p:inputText id="asdf" value="#{userManager.addUser.USERNAME}">
<p:ajax event="keyup" process="@this"/>
</p:inputText>
<p:commandButton id="dssaf" action="#{userManager.insertUSER()}"/>
</h:form>
</h:body>
</html>
```
I also tried:
```
<p:inputText id="asdf" value="#{userManager.addUser.USERNAME}">
<p:ajax/>
</p:inputText>
<p:commandButton id="dssaf" action="#{userManager.insertUSER()}"/>
```
and
```
<p:inputText id="asdf" value="#{userManager.addUser.USERNAME}"/>
<p:commandButton id="dssaf" action="#{userManager.insertUSER()}">
<p:ajax/>
</p:commandButton>
```
and
```
<p:inputText id="asdf" value="#{userManager.addUser.USERNAME}"/>
<p:commandButton id="dssaf" action="#{userManager.insertUSER()}"/>
```
And my bean
```
package webbeans;
import entities.USER;
import db.Model;
import entities.VEREIN;
import java.io.Serializable;
//import java.sql.Connection;
//import java.sql.DriverManager;
//import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.RequestScoped;
//import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.event.SelectEvent;
@RequestScoped
@Named("userManager")
public class UserManager implements Serializable{
private static final long serialVersionUID = 1L;
private USER newUser;
private USER checkUser;
@Inject
private USER selectedUser;
private USER addUser;
private List<USER> newUserList = new ArrayList<>();
private List<VEREIN> newVereinsList = new ArrayList<>();
@Inject
private Model db;
@Inject
private Viewmanager vManager;
public UserManager() {
this.db = new Model();
}
@PostConstruct
public void initiate(){
addUser = new USER();
// addUser.setUSERNAME("abc");
callNewUserList();
}
public void deleteUser(){
}
public void selectedUserAusgeben(){
System.out.println("webbeans.UserManager.selectedUserAusgeben()");
System.out.println(selectedUser.getNAME());
}
public void onRowSelect(SelectEvent<USER> event) {
selectedUser.setUSERID(event.getObject().getUSERID());
selectedUser.setVEREINSID(event.getObject().getVEREINSID());
selectedUser.setGEBDATUM(event.getObject().getGEBDATUM());
selectedUser.setNAME(event.getObject().getNAME());
selectedUser.setUSERNAME(event.getObject().getUSERNAME());
selectedUser.setVEREINSTITEL(event.getObject().getVEREINSTITEL());
selectedUser.setERWAERBSTAETIGKEIT(event.getObject().getERWAERBSTAETIGKEIT());
selectedUser.setBEITRAGSSATZ(event.getObject().getBEITRAGSSATZ());
vManager.setNewSelectedUser(this.selectedUser);
System.out.println(selectedUser.getNAME());
System.out.println(selectedUser.getUSERNAME());
System.out.println(vManager.getNewSelectedUser().getNAME());
System.out.println(vManager.getNewSelectedUser().getUSERNAME());
FacesMessage msg = new FacesMessage("User Selected", event.getObject().getNAME());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
//insert new User to Database
public void insertUSER(){
System.out.println("-------------------------------------------------------------------------------------------------------------");
System.out.println(addUser.getUSERNAME());
}
// Getter und Setter
public USER getAddUser() {
return addUser;
}
public void setAddUser(USER addUser) {
this.addUser = addUser;
}
}
```
我认为这是一个范围问题。
每个 Ajax 事件都会触发一个请求,并且在每个请求上,您都会获得一个新的 Bean-Instance。
将 UserManager 的 Scope 更改为 ViewScoped。
我认为这个问题基本上是一个间接级别太多了。 而不是value="#{userManager.addUser.USERNAME}"
,最好只使用两个级别,例如value="#{userManager.username}"
。
因此,一种方法是将实体的所有字段复制为 bean 中的字段。 然后在“保存”命令按钮的操作方法( action="#{userManager.insertUSER()}"
)中,创建实体 object(“USER”),将所有单个字段从 bean 复制到实体中并持久化实体. 当然,如果您正在编辑实体,则需要在 @PostConstruct 方法中或在检索实体时执行相反的操作。
更简洁的方法是使用 CDI 功能。 在您的支持 bean (UserManager) 中包含实体的生产者,例如:
@Named
@Produces
@ViewScoped
private USER userEntityBean = new USER();
[不需要有 getter/setter。] 在 your.xhtml 页面中,您可以参考value="#{userEntityBean.USERNAME}"
。 在“保存”方法中,只保留实体。
有点离题了,将 Java class 名称和字段名称全部大写是非常不寻常的,即使对于实体(毕竟只是 POJO)也是如此。
通过在构建preparedstatement之前将主键添加到object中解决了这个问题。 即使 object 之前已填满所需的所有信息,它也会在设置/更改任何属性后丢失信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.