简体   繁体   English

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

[英]Java Maven project: Update/Change/Set String Value of an Entity with Primefaces: <p:inputText/> does not work

#change or set String Value of an Entity with Primfaces input Text and Ajax# #使用 Primfaces 输入文本和 Ajax 更改或设置实体的字符串值#

Hi, I am using a Java Maven project.嗨,我正在使用 Java Maven 项目。 I am trying to set the Variable USERNAME of my USER Entity.我正在尝试设置我的USER实体的变量USERNAME I after I inserted the input into the <p:inputText/> field, the String Variable stays "null".我将输入插入<p:inputText/>字段后,字符串变量保持“空”。 Unfortunately, I have no more idea what I can do to update the variable.不幸的是,我不知道我可以做什么来更新变量。

At first the Entity:一开始是实体:

    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;
    }
    
}
```

I think this is a Scope-Problem.我认为这是一个范围问题。
Each Ajax-Event triggers a Request and on each Request you will get a new Bean-Instance.每个 Ajax 事件都会触发一个请求,并且在每个请求上,您都会获得一个新的 Bean-Instance。
Change the Scope of your UserManager to ViewScoped.将 UserManager 的 Scope 更改为 ViewScoped。

I think the issue is basically one level of indirection too much.我认为这个问题基本上是一个间接级别太多了。 Instead of value="#{userManager.addUser.USERNAME}" , it's much better to use two levels only, such as value="#{userManager.username}" .而不是value="#{userManager.addUser.USERNAME}" ,最好只使用两个级别,例如value="#{userManager.username}"

So one approach is the replicate all the fields of the entity as fields in the bean.因此,一种方法是将实体的所有字段复制为 bean 中的字段。 Then in the action method of the "save" commandButton ( action="#{userManager.insertUSER()}" ), create the Entity object ("USER"), copy all the individual fields from the bean into entity and persist the entity.然后在“保存”命令按钮的操作方法( action="#{userManager.insertUSER()}" )中,创建实体 object(“USER”),将所有单个字段从 bean 复制到实体中并持久化实体. If you're editing an entity, of course, you'll need to do the reverse in the @PostConstruct method, or at the point the entity is retrieved.当然,如果您正在编辑实体,则需要在 @PostConstruct 方法中或在检索实体时执行相反的操作。

A cleaner approach is to use CDI functionality.更简洁的方法是使用 CDI 功能。 In your backing bean (UserManager) include a producer for the entity, such as:在您的支持 bean (UserManager) 中包含实体的生产者,例如:

@Named
@Produces
@ViewScoped
private USER userEntityBean = new USER();

[No need to have getters/setters.] In your.xhtml page you can refer to value="#{userEntityBean.USERNAME}" . [不需要有 getter/setter。] 在 your.xhtml 页面中,您可以参考value="#{userEntityBean.USERNAME}" In the "save" method, just persist the entity.在“保存”方法中,只保留实体。

Somewhat off topic, it is highly unusual to have Java class names and field names all in upper case, even for entities (which are, after all, just POJOs).有点离题了,将 Java class 名称和字段名称全部大写是非常不寻常的,即使对于实体(毕竟只是 POJO)也是如此。

The problem was solved by adding the primary key to the object before building the preparedstatement.通过在构建preparedstatement之前将主键添加到object中解决了这个问题。 Even if the object was filled befor with every information needed it looses the information after setting/ changing any attribute.即使 object 之前已填满所需的所有信息,它也会在设置/更改任何属性后丢失信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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