我有这种不寻常的情况:
我有一个registrationVO,它有很少的属性和getter setter。
例如city
或bCity
及其getter方法getCity()
和getBCity()
在JSP中,我尝试使用scriplets显示这些属性的值,
<%=registrationVO.getCity()%>
和&lt; %=registrationVO.getBCity()%>
,工作正常。
但我用表达语言替换了相同的,
${registrationVO.city}
和${registrationVO.bCity}
我得到一个错误,说在注册中没有找到属性“bCity”。
我再次使用了一个用于bCity的scriplet,我得到了输出。
我观察到它是因为命名惯例。 “如果财产的第二个字符是大写字母,我们就不能使用表达语言”。我试过很多差异,这就是我发现的。
请检查这种情况,我不知道我的结论是对还是错。
谢谢, DJ
答案 0 :(得分:7)
如果getter方法的属性名称以至少两个大写字符开头,那么您还需要在EL属性名称中使用所有这些大写字符。在您的特定情况下,您需要将其替换为${registrationVO.BCity}
。这在Javabeans spec的第8.8章中有详细说明。这是本章的摘录(强调我的):
8.8推断名称的大写。
当我们使用设计模式推断属性或事件名称时,我们需要确定哪些规则 跟随大写推断名称。如果我们从正常的中间提取名称 如果是mixedCase样式的Java名称,则默认情况下名称将以大写字母开头。
Java程序员习惯于使用小写字母开头。 强有力的评论者输入使我们确信我们应该遵循同样的传统规则 对于财产和事件名称。
因此,当我们从现有Java名称的中间提取属性或事件名称时,我们 通常将第一个字符转换为小写字母。 但支持偶尔使用所有 大写名称,我们检查名称的前两个字符是否都是大写和if 所以不管它。例如,
- “FooBah”变成“fooBah”
- “Z”变为“z”
- “网址”变为“网址”
我们提供了一个实现此转换规则的方法
Introspector.decapitalize
。
那就是说,我宁愿将它们重命名为更合理的东西。也许birthCity
(如果我猜对了),这样你就可以很好地使用${registrationVO.birthCity}
。