我有一個用例,我想驗證一堆viewParams,如果我發現驗證錯誤,跳過preRenderView事件,只顯示錯誤消息。這可能嗎?如何在驗證失敗時跳過PreRenderView事件?
例如
<f:metadata>
<f:viewParam id="param1" name="p1" value="#{someBean.param1}" />
<f:viewParam id="param2" name="p2" value="#{someBean.param2}" />
<f:event type="javax.faces.event.PostValidateEvent" listener="#{someBean.validateParams}" />
<f:event type="javax.faces.event.PreRenderViewEvent" listener="#{someBean.viewAction}" />
</f:metadata>
的方法validateParams()是用來做多字段驗證並有可能去是這樣的:
public void validateParams(ComponentSystemEvent event) {
UIComponent source = event.getComponent();
Integer value1 = (Integer) ((UIInput) source.findComponent("param1")).getLocalValue();
Integer value2 = (Integer) ((UIInput) source.findComponent("param2")).getLocalValue();
boolean valid1 = validOneField(value1);
boolean valid2 = validOneField(value2);
boolean valid12 = validBothFields(valid1, valid2);
if(!valid1);//add facesMessage
if(!valid2);//add facesMessage
if(!valid12);//add facesMessage
if (!valid1 || !valid2 || !valid12)
FacesContext.getCurrentInstance().renderResponse();
}
我的理解是,無論是被迫的渲染響應,的viewAction()將仍然被稱爲。我可以很容易地修改viewAction()來考慮驗證,但是由於其他原因我想完全跳過它(這種方法中的一些雜亂的代碼,我寧可不碰)等等。有沒有一種方法可以完全繞過viewAction()並顯示驗證錯誤消息?
編輯:使用FacesContext.getCurrentInstance()的BalusC建議ValidationFailed()
我已經修訂validateParams()到:
public void validateParams(ComponentSystemEvent event) {
UIComponent source = event.getComponent();
Integer value1 = (Integer) ((UIInput) source.findComponent("param1")).getLocalValue();
Integer value2 = (Integer) ((UIInput) source.findComponent("param2")).getLocalValue();
boolean valid1 = validOneField(value1);
boolean valid2 = validOneField(value2);
boolean valid12 = validBothFields(valid1, valid2);
if(!valid1);//add facesMessage
if(!valid2);//add facesMessage
if(!valid12);//add facesMessage
if (!valid1 || !valid2 || !valid12)
FacesContext.getCurrentInstance().ValidationFailed();
FacesContext.getCurrentInstance().renderResponse();
}
和改性的viewAction()如下:
public void viewAction(ComponentSystemEvent cse) {
if(!FacesContext.getCurrentInstance().isValidationFailed()) {
// viewAction() code
}
}
這似乎現在對我有用。希望JSF 2.2中的視圖操作不要求我檢查驗證是否失敗,因爲我相信它們根本不會被調用(FacesContext.renderResponce()將跳過調用應用程序步驟,這是調用視圖操作的地方) 。
您可能指定了viewAction(ComponentSystemEvent)而不是validateParams()。 – Zak
我修復了方法名稱。我只是從代碼片段中複製而沒有多加關注。我只是回答標題中所述的問題:)方法參數是可選的。 – BalusC
我使用了你的建議並修改了我的代碼。謝謝。 – Zak