0

我在自定义验证中使用这种方式如果我假设我有这种形式,如果这种方式正确与否,我会有点困惑:

<h:form id="myForm>
 <h:outputText value="user name" />
 <h:inputText value="#userBean.userName" id="userName" />

 <h:outputText value="Password" />
 <h:inputText value="#userBean.Password" id="passwd" />
</h:form>

我有它的托管豆:

@ManagedBean(name="userBean")
@SessionScoped
public class UserBeanData{
   private String userName;
   private String password;
   // with setters and getters........
   //
}

以及用于验证托管 Bean 字段和实施的自定义验证器,例如:

@Override
public validate(FacesContext context, UIComponent component, Object value) throws ValidatorException{
Map<String, String> params = context.getExternalContext().getRequestParametersMap();

String username = params.get("myForm:username");
String pass = params.get("myForm:passwd");

// validate : if fields are not null check if the user exists if the result is empty , throws a validation Message Error
}

我的问题是:像这样检索托管 bean 值是真的还是假的????

4

2 回答 2

1

您基本上是在寻找错误方向的解决方案。验证仅适用于单个提交的值,例如最小/最大长度、非空/空、正则表达式模式等。但是您想根据所有提交的值调用业务操作:登录用户。这不完全是输入验证。

只需添加required="true"到两个输入组件并在操作方法中执行工作。

例如

<h:form id="myForm>
    <h:outputText value="user name" />
    <h:inputText value="#{userBean.userName}" id="userName" />
    <h:message for="userName" />

    <h:outputText value="Password" />
    <h:inputSecret value="#{userBean.password}" id="passwd" />
    <h:message for="passwd" />

    <h:commandButton value="Login" action="#{userBean.login}" />
    <h:messages globalOnly="true" />
</h:form>

@ManagedBean
@RequestScoped
public class UserBean {

    private String userName;
    private String password;

    @EJB
    private UserService service;

    public String login() {
        User user = service.find(userName, password);

        if (user != null) {
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap("user", user);
            return "home?faces-redirect=true";
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Unknown login"));
            return null;
        }
    }

    // ...
}
于 2013-03-13T20:36:33.460 回答
0

注意validate方法的牢固性。它有一个UIComponent参数,该参数是由该方法验证的组件。这UIComponent既有当前值 ( getValue()) 也有用户提交的值 ( getSubmittedValue())。

您可能必须将其UIComponent转换为您正在验证的特定类型的组件(在这种情况下,它是一个UIInput)。

现在,如果您要在登录之前验证用户名和密码,有几种方法可以做到这一点。在您的情况下,使用密码字段验证用户名字段作为添加的参数就足够了。您可以通过执行以下操作来实现:

<h:outputText value="user name" />
<h:inputText value="#userBean.userName" id="userName" validator="#{yourBean.validateLogin}">
    <f:attribute name="pass" value="#{passwordField}" />
</h:inputText>

<h:outputText value="Password" />
<h:inputText value="#userBean.Password" id="passwd" binding="#{passwordField}"/>

请注意,binding密码中的<h:inputText/>与嵌套在您的. 使用此设置,您可以像这样执行验证:pass<f:attribute/>username <h:inputText/>

public void validateLogin(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    //I suppose it's a typo, but your validate method lacks the return type.
    String username = (String) value;
    UIInput passwordInput = component.getAttributes().containsKey("pass") ? 
        (UIInput) component.getAttributes().get("pass") : null;
    if(passwordInput != null) {
        //Just to be sure the input was added as a parameter successfuly
        String submittedPassword = passwordInput.getSubmittedValue();
        //Now, do your validations based on the strings "username"
        //and "password".
    }
}

由于所有这些都是在验证阶段完成的,因此尚未在托管 bean 中设置值,这就是为什么您必须对提交的值进行一些调整。

于 2013-03-12T14:31:24.697 回答