Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更新和处理don';t在JSF2.0.3.4中不能正常工作_Java_Jsf_Jsf 2_Primefaces - Fatal编程技术网

Java 更新和处理don';t在JSF2.0.3.4中不能正常工作

Java 更新和处理don';t在JSF2.0.3.4中不能正常工作,java,jsf,jsf-2,primefaces,Java,Jsf,Jsf 2,Primefaces,在本页中,我将让用户通过单击复选框来显示密码。实际上,应该隐藏两个输入(password,conPassword),并显示另一个输入(passwordV)。所有这3个输入都具有相同的值,并且需要在用户在这两种状态之间切换时保持其值:(具有两个可见的秘密字段或具有一个纯文本字段) 我将页面和bean代码放在这里: JSF页面: :#{lbls.newEntry} 和Bean: package package; @ManagedBean(name = "entry") @ViewScoped

在本页中,我将让用户通过单击复选框来显示密码。实际上,应该隐藏两个输入(
password
conPassword
),并显示另一个输入(passwordV)。所有这3个输入都具有相同的值,并且需要在用户在这两种状态之间切换时保持其值:(具有两个可见的秘密字段或具有一个纯文本字段)

我将页面和bean代码放在这里:

JSF页面:


:#{lbls.newEntry}
和Bean:

package package;


@ManagedBean(name = "entry")
@ViewScoped
public class PasswordEntryBean implements Serializable {

  //<editor-fold defaultstate="collapsed" desc="FIELDS">   
  private static final Logger logger = LogUtil.getLogger(PasswordEntryBean.class);
  private PasswordEntry passwordEntry;
  @ManagedProperty(value = "#{current}")
  private CurrentSessionBean current;
  private Database database;
  private List<PasswordTag> selectedTags = new ArrayList<PasswordTag>();
  private Set<PasswordTag> tags;
  private boolean showPasswords;
  //</editor-fold>  

  //<editor-fold defaultstate="collapsed" desc="CONSTRUCTORS">    
  public PasswordEntryBean() {
    passwordEntry = new PasswordEntry();
  }

  @PostConstruct
  public void init() {
  }
  //</editor-fold>

  //<editor-fold defaultstate="collapsed" desc="PROPERTIES">    
  public PasswordEntry getPasswordEntry() {
    return passwordEntry;
  }

  public Database getDatabase() {
    return database;
  }

  public boolean getShowPasswords() {
    return showPasswords;
  }

  public void setShowPasswords(boolean showPasswords) {
    this.showPasswords = showPasswords;
  }

  public void setDatabase(Database database) {
    this.database = database;
  }

  public Set<PasswordTag> getTags() {
    return tags;
  }

  public void setTags(Set<PasswordTag> tags) {
    this.tags = tags;
  }

  public List<PasswordTag> getSelectedTags() {
    return selectedTags;
  }

  public void setSelectedTags(List<PasswordTag> selectedTags) {
    this.selectedTags = selectedTags;
  }

  public void setPasswordEntry(PasswordEntry passwordEntry) {
    this.passwordEntry = passwordEntry;
  }

  public CurrentSessionBean getCurrent() {
    return current;
  }

  public void setCurrent(CurrentSessionBean current) {
    this.current = current;
  }
  //</editor-fold>
}

如果我没有向
添加process属性,此代码可以隐藏两个字段并正确显示第三个字段。问题是您将同一变量
entry.passwordEntry.password
绑定到两个或多个字段,因此,当提交
时,这些字段中只有一个值将被设置为
entry.passwordEntry.password
,其他值将被丢弃

解决这个问题的最好方法是为表单上的每个字段设置不同的变量。通过查看代码,可以通过在bean中具有3个
PasswordEntry
属性来实现:

@ManagedBean(name = "entry")
@ViewScoped
public class PasswordEntryBean implements Serializable {
    //other attributes...
    private PasswordEntry passwordEntry;
    private PasswordEntry passwordEntryV;
    private PasswordEntry conPasswordEntry;

    //<editor-fold defaultstate="collapsed" desc="CONSTRUCTORS">    
    public PasswordEntryBean() {
        passwordEntry = new PasswordEntry();
        passwordEntryV = new PasswordEntry();
        conPasswordEntry = new PasswordEntry();
    }

    //getters and setters...
}
@ManagedBean(name=“entry”)
@视域
公共类PasswordEntryBean实现可序列化{
//其他属性。。。
私人密码输入;
私人密码输入passwordEntryV;
私有密码条目conPasswordEntry;
//    
公共PasswordEntryBean(){
passwordEntry=新的passwordEntry();
passwordEntryV=新的PasswordEntry();
conPasswordEntry=新的PasswordEntry();
}
//接球手和接球手。。。
}
JSF代码:



如果希望/需要在2或3个位置具有相同的值,则必须考虑到绑定不应位于相同的
,否则将出现相同的问题。您可以使用普通JavaScript同步变量值(毕竟,
将是
将是
)或者在服务器端执行操作时,即在
中选择值时应执行的侦听器,您的主要错误是在客户端使用CSS切换输入字段的可见性,而不是在服务器端使用JSF。所以JSF根本不知道显示/隐藏了哪一个。它只知道两个字段都显示出来。因此,它将处理这两个字段。当您将两个字段的值绑定到同一个属性时,它将始终得到最后处理的字段的值

您需要在服务器端使用JSF显示/隐藏输入字段。您可以使用提供的
渲染属性

rendered="#{testBean.visiblePassword}"

因此,如果用户填写密码字段(机密字段),然后单击复选框,则第三个字段将为空!我也尝试了服务器端隐藏,但在这种情况下,问题是当我想第二次切换时,值变为空。无论如何,我完全改变了我的UI设计,因为我找不到解决这个问题的真正方法。我甚至创建了3个属性,并将每个输入绑定到一个单独的属性!但仍然不起作用。所以我只留下了2个带有2个outputText的秘密字段,我显示/隐藏了这些outputText。使用
重新显示提交的值。出于安全原因,默认情况下不会重新显示它们。您不需要3个属性。只有一张就够了。请看一下我更新的Facelet。我使用了
redisplay=“true”
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core">
  <h:head>
    <title>Facelet Title</title>
    <style type="text/css">
      .none {
        display: none;
      }
    </style>
  </h:head>
  <h:body>
    <h1>Register</h1>
    <h:form id="frmRegistration">
      <h:panelGrid columns="3">
        <h:outputLabel value="Username:" for="username"/>
        <p:inputText label="username" id="username" value="#{testBean.username}" required="true"/>
        <p:message for="username"/>

        <h:outputLabel value="Password:" id="lblPassword" for="password" rendered="#{!testBean.visiblePassword}"/>
        <p:password redisplay="true" label="password" id="password" value="#{testBean.password}" 
                        rendered="#{!testBean.visiblePassword}"/>
        <p:message for="password" id="msgPassword" rendered="#{!testBean.visiblePassword}"/>

        <h:outputLabel value="Confirm Password:" id="lblCpassword" for="cpassword" rendered="#{!testBean.visiblePassword}"/>
        <p:password redisplay="true" label="confirm password" id="cpassword" value="#{testBean.password}" 
                        rendered="#{!testBean.visiblePassword}"/>
        <p:message for="cpassword" id="msgCpassword" rendered="#{!testBean.visiblePassword}"/>

        <h:outputLabel value="Password:" id="lblVpassword" for="vpassword" rendered="#{testBean.visiblePassword}"/>
        <p:inputText label="password" id="vpassword" value="#{testBean.password}" 
                        rendered="#{testBean.visiblePassword}"/>
        <p:message for="vpassword" id="msgVpassword" rendered="#{testBean.visiblePassword}"/>

        <h:outputLabel value="Show password"/>
        <p:selectBooleanButton value="#{testBean.visiblePassword}" 
                               onLabel="Yes" offLabel="No">
          <p:ajax update="messages password cpassword vpassword lblPassword lblCpassword lblVpassword msgPassword msgCpassword msgVpassword"
                   process="password cpassword vpassword" listener="#{testBean.addMessage}" />
        </p:selectBooleanButton>


        <f:facet name="footer">
          <p:commandButton actionListener="#{testBean.save(event)}" value="Save" update="messages"/>
          <p:messages id="messages"/>
        </f:facet>
      </h:panelGrid>
    </h:form>
  </h:body>
</html>
@ManagedBean(name = "entry")
@ViewScoped
public class PasswordEntryBean implements Serializable {
    //other attributes...
    private PasswordEntry passwordEntry;
    private PasswordEntry passwordEntryV;
    private PasswordEntry conPasswordEntry;

    //<editor-fold defaultstate="collapsed" desc="CONSTRUCTORS">    
    public PasswordEntryBean() {
        passwordEntry = new PasswordEntry();
        passwordEntryV = new PasswordEntry();
        conPasswordEntry = new PasswordEntry();
    }

    //getters and setters...
}
rendered="#{testBean.visiblePassword}"