h: inputSecret redisplay = "false" обязательный = "false"> <s: validateEquality: поле подтверждения либо обязательно, либо не проверено вообще - PullRequest
1 голос
/ 12 ноября 2010

Я использую шов 2.2.0.GA.В моих полях для пароля / подтверждения есть redisplay = "false", поэтому текущий пароль отсутствует в формате html.validateEquality находится в поле подтверждения.

Я хочу следующее поведение: когда я создаю новую сущность, должны быть оба поля пароля / подтверждения.Когда я редактирую сущность, оба поля не должны быть обязательными, но равенство должно быть проверено в любом случае.Для этого у меня есть h: inputSecret required = "# {required}" и вычисление параметра "required".

Есть 2 проблемы:

1) s: validateEquality имеет атрибут "required "тоже, но выглядит глючно: если я жестко кодирую true или false, он работает как положено, но если я использую required =" # {required} "и во время разговора этот параметр изменяется, валидатор по-прежнему ведет себя так, как будто параметр имеетне изменилось.

2) s: validateEquality required = "false" не проверяет равенство, если поле подтверждения пусто.

#{sandboxController.now}

<ui:param name="label" value="password"/>
<ui:param name="labelConfirm" value="confirm password"/>
<ui:param name="message" value="not the same"/>
<ui:param name="id" value="bbb"/>

<ui:param name="redisplay" value="#{sandboxBean.redisplay}"/>
<ui:param name="required" value="#{sandboxBean.required}"/>
<ui:param name="value" value="#{sandboxBean.password}" />

    <a4j:form id="personalForm">

<a4j:region>
required: <h:selectBooleanCheckbox value="#{required}">
  <a4j:support event="onclick" reRender="passwordpanel" />
</h:selectBooleanCheckbox><br/>
redisplay: <h:selectBooleanCheckbox value="#{redisplay}">
  <a4j:support event="onclick" reRender="passwordpanel" />
</h:selectBooleanCheckbox><br/>
</a4j:region>

<a4j:outputPanel id="passwordpanel">
password: #{value}<br/>
    <s:decorate styleClass="fieldForm #{formClass}">
        <div class="fieldLabel #{labelClass}">
            <s:label styleClass="#{invalid?'error':''}" >
                #{label}
                <s:span styleClass="required" rendered="#{required}">*</s:span>
            </s:label>
        </div>

        <div class="fieldInput">
            <s:validateAll>
                <h:inputSecret id="#{id}" value="#{value}" required="#{required}" redisplay="#{redisplay}">
                </h:inputSecret>
            </s:validateAll>
            <s:message styleClass="error"/>
        </div>
    </s:decorate>
    <s:decorate styleClass="fieldForm #{formClass}">
        <div class="fieldLabel #{labelClass}">
            <s:label styleClass="#{invalid?'error':''}" >
                #{labelConfirm}
                <s:span styleClass="required" rendered="#{required}">*</s:span>
            </s:label>
        </div>
        <div class="fieldInput">
            <s:validateAll>
                <h:inputSecret value="#{value}" required="#{required}" redisplay="#{redisplay}">
                    <s:validateEquality for="#{id}" required="#{required}" message="#{message}"/>
                </h:inputSecret>
            </s:validateAll>
            <s:message styleClass="error"/>
        </div>
    </s:decorate>
</a4j:outputPanel>

<a4j:commandLink value="submit" action="#{sandboxController.getNow}" reRender="personalForm" /><br/>


    </a4j:form>

SandboxBean.java:

package org.foo.model;

import java.io.Serializable;

public class SandboxBean implements Serializable {
    private static final long serialVersionUID = 1L;
    private String password = "abcde";
    private boolean required=false;
    private boolean redisplay=false;

    public void setRequired(boolean required)        {            this.required = required;        }
    public boolean isRequired()        {            return required;        }
    public String getPassword() {            return password;        }
    public void setPassword(String password) {            this.password = password;        }
    public void setRedisplay(boolean redisplay)        {            this.redisplay = redisplay;        }
    public boolean isRedisplay()        {            return redisplay;        }
}

SandboxController.java:

package org.foo.logic.model;

import java.io.Serializable;
import java.util.Date;

import org.foo.model.SandboxBean;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.log.Log;

@Name("sandboxController")
@Scope(ScopeType.CONVERSATION)
public class SandboxController implements Serializable{
    private static final long serialVersionUID = 1L;

    @Logger Log log;

    @Out(required = false)
    SandboxBean sandboxBean;

    @Begin(join=true)
    @Factory("sandboxBean")
    public void initSandBoxBean(){
        sandboxBean = new SandboxBean();
    }

  public Date getNow() {
      return new Date();
  }
}

Ответы [ 2 ]

0 голосов
/ 17 февраля 2011
public class PasswordConverter
    implements Converter
{
    public static String DONT = "__dontchange__";

    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {
        if (DONT.equals(value) && component instanceof UIOutput) {
            return ((UIOutput)component).getValue();
        } else {
            return value;
        }
    }

    public String getAsString(FacesContext context, UIComponent component, Object value)
    {
        if (value instanceof String && component instanceof UIOutput && ((String)value).length() > 0) {
            return DONT;
        } else if (value == null) {
                return null;
        } else {
            return value.toString();
        }
    }

}
0 голосов
/ 16 февраля 2011

Задача № 1:

Следующий код превращает ваше «обязательное» поле в статическое, я считаю:

<ui:param name="required" value="#{sandboxBean.required}"/>

Задача № 2:

http://seamframework.org/Community/CustomValidatorUsingTwoFields

Используя специальный валидатор, помеченный соответствующей аннотацией, вы можете вызвать его с помощью специального валидатора.

@Validator
public class PasswordValidator implements javax.faces.validator.Validator, Serializable{
...
throw new ValidatorException(new FacesMessage("Passwords do not match."));
...