嗨,我写了一个自定义验证器获取系统名称并将其与数据库中的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();
需要一些指导
答案 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。