【问题标题】:What are the rules for a JSF id?JSF id 的规则是什么?
【发布时间】:2011-08-23 18:23:36
【问题描述】:

似乎我应该能够通过半小时的网络搜索找到这个,但因为我不能:

有效 JSF id 的规则是什么?

我阅读了一封乱码电子邮件,提示 -_ 存在限制,但我收到了 IllegalArgumentExceptions,我认为这是由于 id。

编辑

java.lang.IllegalArgumentException: 6a945017207d46fd82b3d3bb7d2795f1
at javax.faces.component.UIComponentBase.validateId(UIComponentBase.java:549)
at javax.faces.component.UIComponentBase.setId(UIComponentBase.java:351)
at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:151)

【问题讨论】:

  • 你为什么不直接发布异常堆栈跟踪和导致它的代码sn-p?
  • 我认为我无法将示例简化为可以证明问题的任何合理简单的内容,但我会附上堆栈跟踪。

标签: jsf


【解决方案1】:

它必须是有效的CSS identifieridenthere)并且不能重复。

在 CSS 中,标识符(包括 selectors 中的元素名称、类和 ID)只能包含字符 [a-zA-Z0-9] 和 ISO 10646 字符 U+00A1 及更高,加上连字符 (-) 和下划线(_);它们不能以数字或连字符后跟数字开头。标识符还可以包含转义字符和任何 ISO 10646 字符作为数字代码(请参阅下一项)。例如,标识符"B&W?" 可以写成"B\&W\?""B\26 W\3F"

另见:


更新:对于你感兴趣的案例,这里是UIComponentBase#validateId()提供的验证器的源代码:

private static void validateId(String id) {
    if (id == null) {
        return;
    }
    int n = id.length();
    if (n < 1) {
        throw new IllegalArgumentException("Empty id attribute is not allowed");
    }
    for (int i = 0; i < n; i++) {
        char c = id.charAt(i);
        if (i == 0) {
            if (!Character.isLetter(c) && (c != '_')) {
                throw new IllegalArgumentException(id);
            }
        } else {
            if (!Character.isLetter(c) &&
                    !Character.isDigit(c) &&
                    (c != '-') && (c != '_')) {
                throw new IllegalArgumentException(id);
            }
        }
    }
}

不过它比 CSS 规则更严格一些。它们也不能以连字符开头。

【讨论】:

  • 宾果游戏!不能以数字开头!我很欣赏整个页面,因为我可以花一整天的时间替换字符和附加文本,而不是在 100% 的时间里得到所有的规则。谢谢
  • @BalusC 有什么理由比HTML rules 更严格吗?只是为了让 CSS 选择更容易?
  • @lucasvc:HTML 规则允许 :,这与命名容器分隔符冲突。
  • @lucasvc: 从 JSF 2.0 起才可配置。
  • @Roland 实际上,您的问题与此处提出的问题不同。转到stackoverflow.com/q/8634156
猜你喜欢
  • 2018-01-26
  • 1970-01-01
  • 2017-05-23
  • 2011-02-12
  • 2019-02-23
  • 2018-01-03
  • 1970-01-01
  • 2011-07-23
  • 2012-10-09
相关资源
最近更新 更多