2015-04-14 50 views
2

我正在學習JSF 2.2,並且找到一個很好的答案,我可以理解如何在GET參數上進行驗證。驗證f:viewParam值是一組選定的允許值之一

我有,有一個像這樣一個鏈接文件source.xhtml:

<h:link value="ALTER" outcome="/main/showSqlTemplates.xhtml"> 
    <f:param name="type" value="ALTER" /> 
</h:link> 

,並在我的destination.xhtml我有代碼看起來像這樣:

<f:metadata> 
<f:viewParam id="type" name="type" value="#{showSqlTemplateManagedBean.type}" required="true" requiredMessage="Invalid page access. Please use a link from the menu."/>      
</f:metadata> 
<h:message for="type" class="bold"></h:message> 
<br/>TYPE is : #{showSqlTemplateManagedBean.type} 

和我的豆類看起來像這樣:

@ManagedBean 
@RequestScoped 
public class ShowSqlTemplateManagedBean { 

    String type = ""; 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public ShowSqlTemplateManagedBean() { 

    } 
} 

正如你所看到的,我已經使用了「required」屬性來確保類型參數i至少在那裏,一切工作都很好。但我想做更多的驗證。

具體而言,我想確保字符串類型的值只能是ALTER,INSERT,UPDATE或DELETE。

這是自定義驗證程序進來的地方嗎?自定義驗證器似乎已經過了殺死這樣一個簡單的驗證檢查。我相信我錯過了一些東西。也許把一些東西放在PostConstruct的init()方法中?

回答

3

只是讓它成爲enum

@ManagedBean 
@RequestScoped 
public class ShowSqlTemplateManagedBean { 

    public enum Type { 
     ALTER, INSERT, UPDATE, DELETE; 
    } 

    private Type type; 

    public Type getType() { 
     return type; 
    } 

    public void setType(Type type) { 
     this.type = type; 
    } 

} 

JSF有一個內置的轉換器,可以完全透明地打開列。任何無效值都會導致轉換錯誤,您可以通過<f:viewParam>converterMessage屬性進行自定義。

枚舉在代碼的其他地方也有更多的好處。


無關的具體問題,明確使用空字符串(甚至null)初始化屬性是不良的做法。不要那樣做了。此外,使用非空字符串或非空值初始化託管bean屬性應在@PostConstruct帶註釋的方法中發生。

相關問題