JSP EL использует соглашение об именах Java-бинов для преобразования имен свойств в соответствующие методы получения, поскольку он не может напрямую обращаться к закрытым полям.И согласно спецификации Javabeans для свойств id
и Id
стандартное имя получателя равно getId()
, поэтому оно работает для обоих вариантов.Но для firstName
геттер равен getFirstName()
, а для firstname
геттер равен getFirstname()
.Поскольку ваш класс имеет только getFirstName()
, поэтому только firstName
работает в EL.
ОБНОВЛЕНИЕ
Итак, я проверил код.Чтобы получить список доступных свойств, которые можно использовать в EL, Java проверяет методы класса.Для получателей типа getSomeStuff()
if удаляет первые 3 буквы (get
), а затем заменяет первую букву строчными.Таким образом, getSomeStuff()
преобразуется в someStuff
.И это имя, которое можно использовать в JSP EL.Из-за этой проверки id
является допустимым свойством, а Id
- нет, хотя proeprty Id
- это то, что действительно существует в объекте.Но JSP использует геттеры для получения фактических значений.Он не проверяет, существуют ли фактические свойства и каковы их имена.
Кусочки кода java.beans.Introspector
if (argCount == 0) {
if (name.startsWith(GET_PREFIX)) {
// Simple getter
pd = new PropertyDescriptor(this.beanClass, name.substring(3), method, null);
} else if (resultType == boolean.class && name.startsWith(IS_PREFIX)) {
// Boolean getter
pd = new PropertyDescriptor(this.beanClass, name.substring(2), method, null);
}
}
public static String decapitalize(String name) {
if (name == null || name.length() == 0) {
return name;
}
if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
Character.isUpperCase(name.charAt(0))){
return name;
}
char chars[] = name.toCharArray();
chars[0] = Character.toLowerCase(chars[0]);
return new String(chars);
}
И код для java.beans.ProeprtyDescriptor
PropertyDescriptor(Class<?> bean, String base, Method read, Method write) throws IntrospectionException {
if (bean == null) {
throw new IntrospectionException("Target Bean class is null");
}
setClass0(bean);
setName(Introspector.decapitalize(base));
setReadMethod(read);
setWriteMethod(write);
this.baseName = base;
}