Java JSF关于自定义验证

时间:2013-03-12 13:56:04

标签: java web-applications jsf-2

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

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

我有它的Managed Bean:

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

和自定义验证器验证Managed Bean字段和Implmentation,如:

@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值是否真实????

2 个答案:

答案 0 :(得分:1)

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

只需将required="true"添加到两个输入组件中,然后在操作方法中执行作业。

E.g。

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

    // ...
}

答案 1 :(得分: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 {{1}中嵌套的<f:attribute/>标记的username值相关}}。通过此设置,您可以执行以下验证:

<h:inputText/>

由于所有这些都是在验证阶段完成的,因此尚未在您的托管bean中设置这些值,这就是您必须使用提交的值进行一些操作的原因。