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}"