繁体   English   中英

Java Maven 项目:使用 Primefaces 更新/更改/设置实体的字符串值:<p:inputtext /> 不工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM