使用 JSF 捕获每个按键事件的服务器端验证
Server-side validation which captures each key press event with JSF
我目前已经通过 onkeypress
事件和纯 javascript 实现了此功能。
有一个textarea字段。一旦用户键入某些内容,实现的功能就会显示 him/her 剩余的字符数。
现在客户要求对 JSF 中的验证器做同样的事情?没有Javascript。
我很困惑如何使用 JSF 在每个按键事件上调用验证方法?
有什么建议吗?
编辑:
我不确定这个,
<f:ajax event="keypress" listener="#{helloBean.validateLength}">
<h:inputTextarea value="#{helloBean.name}"></h:inputTextarea>
</f:ajax>
用听法,
public void validateLength(AjaxBehaviorEvent event) {
// stuff
}
但是 javscript 被禁用了,这个能用吗?
保留您的 JavaScript 以显示剩余字符。这确实不是真正的验证器,但它只是一个有用的指标,基于 JSF 的解决方案将非常昂贵。
要在客户端强制文本区域的最大长度,请在组件上使用新的 HTML5 maxlength
属性。
<... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<h:inputTextarea ... a:maxlength="1000" />
提示:您可以在 "Remaining chars" 脚本中使用它,只需让它从 HTML DOM 中提取最大长度,即可使其变得更 generic/reusable。
然后,要验证服务器端的实际最大长度,只需使用 JSF 的 <f:validateLength>
。
<h:inputTextarea ...>
<f:validateLength maximum="1000" />
</h:inputTextarea>
或 BV 的 @Size
.
@Size(max=1000)
private String text;
无论哪种方式,您都可以通过简单地在文本区域内嵌套 <f:ajax event="keyup">
来在 keyup 事件期间触发服务器端验证。
<h:inputTextarea id="text" ...>
<f:ajax event="keyup" render="m_text" />
</h:inputTextarea>
<h:message id="m_text" for="text" />
但如前所述,那真的很贵。即使您使用了 <f:ajax delay>
,我仍然不建议您这样做,只是将其排除在外。它在这里没有真正的好处,因为 maxlength
已经限制了客户端的最大长度。
总而言之,我希望您学会了在要执行验证时使用普通验证器,而不是试图为此滥用 action(listener) 方法。另见 JSF 2.0 validation in actionListener or action method.
我目前已经通过 onkeypress
事件和纯 javascript 实现了此功能。
有一个textarea字段。一旦用户键入某些内容,实现的功能就会显示 him/her 剩余的字符数。
现在客户要求对 JSF 中的验证器做同样的事情?没有Javascript。
我很困惑如何使用 JSF 在每个按键事件上调用验证方法?
有什么建议吗?
编辑: 我不确定这个,
<f:ajax event="keypress" listener="#{helloBean.validateLength}">
<h:inputTextarea value="#{helloBean.name}"></h:inputTextarea>
</f:ajax>
用听法,
public void validateLength(AjaxBehaviorEvent event) {
// stuff
}
但是 javscript 被禁用了,这个能用吗?
保留您的 JavaScript 以显示剩余字符。这确实不是真正的验证器,但它只是一个有用的指标,基于 JSF 的解决方案将非常昂贵。
要在客户端强制文本区域的最大长度,请在组件上使用新的 HTML5 maxlength
属性。
<... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<h:inputTextarea ... a:maxlength="1000" />
提示:您可以在 "Remaining chars" 脚本中使用它,只需让它从 HTML DOM 中提取最大长度,即可使其变得更 generic/reusable。
然后,要验证服务器端的实际最大长度,只需使用 JSF 的 <f:validateLength>
。
<h:inputTextarea ...>
<f:validateLength maximum="1000" />
</h:inputTextarea>
或 BV 的 @Size
.
@Size(max=1000)
private String text;
无论哪种方式,您都可以通过简单地在文本区域内嵌套 <f:ajax event="keyup">
来在 keyup 事件期间触发服务器端验证。
<h:inputTextarea id="text" ...>
<f:ajax event="keyup" render="m_text" />
</h:inputTextarea>
<h:message id="m_text" for="text" />
但如前所述,那真的很贵。即使您使用了 <f:ajax delay>
,我仍然不建议您这样做,只是将其排除在外。它在这里没有真正的好处,因为 maxlength
已经限制了客户端的最大长度。
总而言之,我希望您学会了在要执行验证时使用普通验证器,而不是试图为此滥用 action(listener) 方法。另见 JSF 2.0 validation in actionListener or action method.