2

我正在学习 JSF 2.2,我很难找到一个好的答案,我可以理解如何对 GET 参数进行更多验证。

我有一个 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}

我的 bean 类看起来像这样:

@ManagedBean
@RequestScoped
public class ShowSqlTemplateManagedBean {

    String type = "";

    public String getType() {
        return type;
    }

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

    public ShowSqlTemplateManagedBean() {

    }
}

正如你所看到的,我已经使用了“必需”属性来确保类型参数至少在那里,并且一切正常。但我想做更多的验证。

具体来说,我想确保 String 类型的值只会是 ALTER、INSERT、UPDATE 或 DELETE。

这是自定义验证器的用武之地吗?对于这样一个简单的验证检查,自定义验证器似乎太过分了。我确定我错过了一些东西。也许在 PostConstruct init() 方法中添加一些东西?

4

1 回答 1

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 有一个内置的枚举转换器,它将完全透明地启动。converterMessage任何无效值都会导致转换错误,您可以通过<f:viewParam>.

枚举在代码的其他地方也有更多好处。


与具体问题无关,使用空字符串(甚至null)显式初始化属性是不好的做法。不要再那样做了。此外,使用非空字符串或非 null 初始化托管 bean 属性应该发生在带@PostConstruct注释的方法中。

于 2015-04-14T18:18:14.070 回答