2015-05-28 59 views
2

我目前使用純javascript的onkeypress事件實現了此功能。使用JSF捕獲每個按鍵事件的服務器端驗證

有一個textarea字段。只要用戶鍵入某個東西,實現的功能就會向他/她顯示剩餘字符數。

現在客戶要求與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被禁用,將這項工作?

回答

2

保留您的JavaScript以顯示剩餘的字符。這確實不是一個真正的驗證器,但它僅僅是一個有用的指標,基於JSF的解決方案將非常昂貴。

要在客戶端強制textarea的maxlength,請使用組件上的新HTML5 maxlength屬性。

<... xmlns:a="http://xmlns.jcp.org/jsf/passthrough"> 
... 
<h:inputTextarea ... a:maxlength="1000" /> 

提示:你可以利用它在你的「剩餘字符」的劇本,使之更加通用的/可重複使用的只是讓它提取從HTML DOM的最大長度。

然後,要驗證服務器端的實際最大長度,只需使用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已經限制了客戶端的最大長度,因此它沒有真正的好處。總而言之,我希望你學會了如果你想要執行驗證,就會學會使用一個普通的驗證器,而不是試圖濫用一個動作(監聽器)方法。另見JSF 2.0 validation in actionListener or action method