Java 无法访问JSF控制器中的某些(大写)字段?

Java 无法访问JSF控制器中的某些(大写)字段?,java,jsf,el,Java,Jsf,El,我无法访问控制器中的某些(大写)字段 比如说 我的控制器(*.java) 我的屏幕(*.xhtml) 当我尝试使用 <h:panelGrid> <h:outputText value="#{myController.FIELD}" /> <h:outputText value="#{myController.F1}" /> </h:panelGrid> 当我尝试使用 <h:panelGrid> <h:ou

我无法访问控制器中的某些(大写)字段
比如说

我的控制器(*.java)

我的屏幕(*.xhtml)
当我尝试使用

<h:panelGrid>
    <h:outputText value="#{myController.FIELD}" />
    <h:outputText value="#{myController.F1}" />
</h:panelGrid>
当我尝试使用

<h:panelGrid>
    <h:outputText value="#{myController.fIELD}" />
    <h:outputText value="#{myController.f1}" />
</h:panelGrid>

结果是
F1字段:可访问
然而
字段:不可访问


为什么会这样?

属性名不会产生干扰

但是您的方法声明应该遵循约定

private String FIELD;

 public String getField() {
        return FIELD;
    }
xhtml

<h:outputText value="#{seasonSearchController.field}" />

这是因为ManagedBean有一个命名模式get/set,后跟单词的大小写字母。JSF使用setter作为在xhtml中访问它的方式,而不是字段本身。 如果您注意到,即使字段名或变量名不同,也可以通过setter/getter访问它

private String FE123;

public String getFE12345() {
    return FE123;
}

public void setFE12345(String fE123) {
    this.FE123 = fE123;
}
你可以像这样访问它

   <h:outputText value="#{managedBean.FE12345}" />
JSF知道字段中的第二个字符是大写的I。因此它将其标识为全大写字段。因此您可以将其用作managedBean.FIELD。如果您使用getField,则可以将其作为

<h:outputText value="#{managedBean.field}" />
JSF看到第二个字符是1,没有大写或小写字母。因此,JSF使用setter/getter来获取字段。由于get/set后面的ManagedBean规范是大写的,因此您可以在ManagedBean中使用它作为:

 <h:outputText value="#{managedBean.f1}" />


抱歉,解释不好,希望您理解将EL表达式转换为属性访问的
BeanELResolver
,它遵循。它说明(第8.8节):

因此,当我们从现有Java名称的中间提取属性或事件名称时,我们 通常将第一个字符转换为小写。但是,为了支持偶尔使用所有大写名称,我们检查名称的前两个字符是否都是大写,如果是,则不使用它

解析器通过对实际类的反射来工作。它生成实例列表,并将这些实例与表达式匹配。因此,解析器从bean中看到的是:

  • 属性
    字段
    ,可读可写
  • 瞬态属性f1,可读写
  • 未公开属性
    F1
  • 由于您试图访问
    F1
    ,根据JavaBeans规范,F1没有getter和setter,因此解析程序抛出
    PropertyNotFoundException

    要解决此问题,请遵循正常的camelCase约定和/或使用更长的名称


    另请参见:

    好问题!但是,存在命名约定。菲利普斯安德同意你的看法。。但我问为什么会发生这种行为,我明白这一点,也觉得很有趣。它只是想指出这一点。这是一个解决办法,但是什么导致
    F1
    不被视为一个属性呢?Jup,关于getter有一个缩写名的说法一开始也让我感到困惑。但是EL解析器使用的是内省,这是由JavaBean规范的第8节管理的,该节使用这些模式作为自动发现可用属性名的方法。这就是我添加8.3.1部分的原因。我这样认为:这不是强制性的,但如果本来应该有效的东西不起作用,我会尽量坚持命名约定。:-)我的观点是:在EL的背景下,需要遵循“建议”。不是通过JavaBeans规范,而是通过解析EL表达式的工作方式。@YajliMaclo很好地找到了。甚至不知道有一个javabeans标记。有一个不推荐的解决方法:如果您在JavaBean中有一个名为:Company的字段,并且您想在jsf页面中访问它,那么您可以通过小写字母作为Company访问它(jsf在这里将调用具有正确语法getCapital的getter)
    private String FE123;
    
    public String getFE12345() {
        return FE123;
    }
    
    public void setFE12345(String fE123) {
        this.FE123 = fE123;
    }
    
       <h:outputText value="#{managedBean.FE12345}" />
    
       <h:outputText value="#{managedBean.FE123}" />
    
    getField();
    getFIELD();
    
    <h:outputText value="#{managedBean.field}" />
    
    getF1();
    
     <h:outputText value="#{managedBean.f1}" />