自定义验证器通过ajax调用按钮

时间:2013-09-05 12:00:22

标签: ajax jsf validation

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

我的观看页面代码是

<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();

需要一些指导

1 个答案:

答案 0 :(得分:1)

您需要创建一个实现Validator接口的类。验证失败后,只需使用ValidatorException抛出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代码正在泄漏数据库资源。请同样fix