1

嗨,我编写了一个自定义的验证器,它获取系统名称并将其与数据库中的 id 进行比较,现在我想检查该值是否完全相同,必须允许用户单击按钮并继续前进,否则会出现一些错误消息应显示。我真的很困惑如何通过ajax调用验证器()。

我的查看页面代码是

<h:commandButton action="sample?faces-redirect=true" value="submit">
                    <f:ajax execute="#{csample.UserValidator}" render="@form" >
                    <h:inputText name="idtext" value="#{csampleBean.id}" />
                    </f:ajax>
                </h:commandButton>

和我的自定义验证器

public void UserValidator(FacesContext context, UIComponent toValidate, Object value)
            throws UnknownHostException, ValidatorException, SQLException, NamingException
    {
        java.net.InetAddress localMachine = java.net.InetAddress.getLocalHost();
        String machine=  localMachine.getHostName();

        String query = "select * from USER_ where USER_ID = '"+machine+"'";

        Context initContext = new InitialContext();
        Context envContext = (Context)initContext.lookup("java:/comp/env");
         DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
        Connection conn = ds.getConnection();   
        Statement stat = conn.createStatement();
        //get customer data from database
        ResultSet result =  stat.executeQuery(query);

        if (query==machine)
                // what to do here      
            conn.close();

需要一些指导

4

1 回答 1

1

您需要创建一个实现Validator接口的类。在验证失败时,只需抛出 aValidatorException和 a FacesMessage。然后,JSF 将注意FacesMessage最终在<h:message>与输入组件关联的右侧。

@FacesValidator您可以通过在其中使用验证器 ID对其进行注释来将自定义验证器注册到 JSF 。<h:inputXxx validator>您可以在或中引用它<f:validator validatorId>

这是一个启动示例:

@FacesValidator("userValidator")
public class UserValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        // ...

        if (!valid) {
            String message = "Sorry, validation has failed because [...]. Please try again.";
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
        }
    }

}

使用如下(注意:<h:inputText>没有name属性!而是使用id; 另请注意,您的初始代码片段有一些没有任何意义的嵌套):

<h:inputText id="idtext" value="#{csampleBean.id}" validator="userValidator">
    <f:ajax render="idtextMessage" />
</h:inputText>
<h:message id="idtextMessage" for="idtext" />
<h:commandButton action="sample?faces-redirect=true" value="submit" />

也可以看看:


与具体问题无关,您的 JDBC 代码正在泄漏数据库资源。请也解决这个问题。

于 2013-09-05T12:28:22.100 回答