В спящем режиме, как значение JSP может соответствовать переменной в классе Entity - PullRequest
0 голосов
/ 21 мая 2018

У меня есть страница jsp, некоторые коды ниже

<c:forEach var="tempCustomer" items="${customers}">
    <c:url var="updateLink" value="/customer/showFormForUpdate">
        <c:param name="customerId" value="${tempCustomer.id}"/>
    </c:url>
    <c:url var="deleteLink" value="/customer/delete">
        <c:param name="customerId" value="${tempCustomer.id}"/>
    </c:url>
    <tr>
        <!-- .firstName must match the variable in () customer setFirstName(String firstName) -->
        <td> ${tempCustomer.firstName} </td>
        <td> ${tempCustomer.lastName} </td>
        <td> ${tempCustomer.email} </td>
        <td>
            <a href="${updateLink}">Update</a>
        </td>
        <td>
            <a href="${deleteLink}" onclick="if(!(confirm('U sure u want to delete'))) return false">Delete</a>
        </td>
    </tr>
</c:forEach>

И ниже мой класс сущности

package com.learning.spring.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

    @Entity
    @Table(name="customer")
    public class Customer {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int Id;
    @Column(name="first_name")
    private String firstName;
    @Column(name="last_name")
    private String lastName;
    @Column(name="email")
    private String email;

    public Customer() {

    }

    public int getId() {
        return Id;
    }

    public void setId(int Id) {
        this.Id = Id;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}

Как вы можете видеть на странице JSP, value="${tempCustomer.id}",Я использую id, который в нижнем регистре i.Однако в классе сущности я определяю его, как показано ниже, в котором используется Id, прописные буквы I.

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int Id;

Так как Hibernate может сопоставить id с Id?И если я использую Id вместо этого на странице JSP, программа выдает исключение Id not found.

Кроме того, я подумал о регистрозависимости, но обнаружил, изменил ли я ${tempCustomer.firstName} на ${tempCustomer.firstname}.выдает исключение по имени, не найденному.

И помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 21 мая 2018

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;
}
...