Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我在执行表单验证时遇到困难。我想将used输入的字符串传递给数据库,并将其签入数据库。如果此值已经存在于数据库表中。这里我调用Java方法来检查值: <h:panelGroup> <h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}" > <f:validateLength minimum="0" maximum="15"/> <f:ajax render="sessionidvalidate" event="blur"/> </h:inputText> <h:outputText id="sessionidvalidate" rendered="#{DatabaseController.validateSessionid}" value="session is already registered" /> </h:panelGroup>_Java_Jsf_Jsf 2 - Fatal编程技术网

我在执行表单验证时遇到困难。我想将used输入的字符串传递给数据库,并将其签入数据库。如果此值已经存在于数据库表中。这里我调用Java方法来检查值: <h:panelGroup> <h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}" > <f:validateLength minimum="0" maximum="15"/> <f:ajax render="sessionidvalidate" event="blur"/> </h:inputText> <h:outputText id="sessionidvalidate" rendered="#{DatabaseController.validateSessionid}" value="session is already registered" /> </h:panelGroup>

我在执行表单验证时遇到困难。我想将used输入的字符串传递给数据库,并将其签入数据库。如果此值已经存在于数据库表中。这里我调用Java方法来检查值: <h:panelGroup> <h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}" > <f:validateLength minimum="0" maximum="15"/> <f:ajax render="sessionidvalidate" event="blur"/> </h:inputText> <h:outputText id="sessionidvalidate" rendered="#{DatabaseController.validateSessionid}" value="session is already registered" /> </h:panelGroup>,java,jsf,jsf-2,Java,Jsf,Jsf 2,如何将插入的值发送到Java方法 最好的祝愿只需在标签中添加侦听器h:inputText: <h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}" valueChangeListener="#{DatabaseController.validateSessionid}"> ajax调用返回后,JSF呈现h:outputText id=“sessionidvali

如何将插入的值发送到Java方法


最好的祝愿

只需在标签中添加侦听器
h:inputText

<h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}" 
         valueChangeListener="#{DatabaseController.validateSessionid}">

ajax调用返回后,JSF呈现
h:outputText id=“sessionidvalidate”
您需要创建一个
验证器

启动示例:

@FacesValidator("sessionIdValidator")
public class SessionIdValidator implements Validator {

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

        if (yourDataService.existSessionId(value)) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                "Session ID is already in use, please choose another.", null));
        }
    }

}
按如下方式使用:


请注意,您应该使用
来显示验证消息。你看不到任何人。对所有其他字段应用相同的设置:



如果要在验证器中使用
@Resource
@EJB
@Inject
,请将
@FacesValidator
注释替换为
@ManagedBean
或(您似乎出于某种原因使用CDI)
@Named

@Named
public class SessionIdValidator implements Validator {

    @Resource
    private DataSource dataSource;

    @Inject
    private YourDataService yourDataService;

    // ...
}
并按如下方式使用它



valueChangeListener的作用完全不同。它的目的是监听值更改事件,而不是验证值。但本例中的过程实际上与使用自定义验证器时相同。根本的区别是什么?使用正确的工具完成工作。如果要验证某些内容,请使用
验证程序
。它非常适合这个工作,它有一个定义良好的
validate()
方法,您可以在其中抛出
ValidatorException
,这将正确地强制JSF将提交视为无效并处理消息。在
valueChangeListener
中,您必须手动完成所有操作。但是,在这种情况下,简单的错误消息动态呈现比生成异常要便宜,不是吗?使用
验证器
真的不会花费太多时间,而且它与JSF框架集成良好,因此更易于(重新)使用。另外,当值更改侦听器中的验证失败时,不要忘记将组件标记为无效、将faces上下文标记为无效、跳过更新模型值和调用应用程序阶段。感谢您提供的示例!如果我实现了您的验证示例,错误消息何时会出现在网页中?当我按下按钮或输入任何内容时?根据
,仅当输入字段模糊时。否,请使用
event=“keyup”
。记住这是相当昂贵的。
event=“change”
仅在更改值后模糊字段时触发。我刚才使用的是
event=“blur”
,因为您的代码片段中已经有了它。请注意,当您不更改值时,
event=“change”
因此不会触发,但如果您想立即在空字段上验证
required=“true”
等,最好使用
event=“blur”
。是的,这是可能的。您可以在组件上使用
来指定值的“类型”。例如,
。您可以通过
component.getAttributes().get(“type”)
在验证器中获取它。实现
validator
并使用
FacesMessage
抛出
ValidatorException
,如我的回答所示。下面是一个示例:
public void validateSessionid(ValueChangeEvent e) {
    UIInput nameInput = e.getComponent()
    String sessionid = nameInput.getValue()

    //do SQL query
}
@FacesValidator("sessionIdValidator")
public class SessionIdValidator implements Validator {

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

        if (yourDataService.existSessionId(value)) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                "Session ID is already in use, please choose another.", null));
        }
    }

}
@Named
public class SessionIdValidator implements Validator {

    @Resource
    private DataSource dataSource;

    @Inject
    private YourDataService yourDataService;

    // ...
}