gpt4 book ai didi

java - 在hibernate中,JSP值如何匹配实体类中的变量

转载 作者:行者123 更新时间:2023-11-30 06:10:05 25 4
gpt4 key购买 nike

我有一个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 呢?如果我在 JSP 页面中使用 Id 代替,程序会抛出 Id not found 异常。

此外,我考虑过区分大小写,但我发现如果将 ${tempCustomer.firstName} 更改为 ${tempCustomer.firstname}。它抛出名字未找到异常。

我们将不胜感激。

最佳答案

JSP EL 使用 java beans 命名约定将属性名称转换为相应的 getter,因为它无法直接访问私有(private)字段。根据 Javabeans 规范,idId 属性的标准 getter 名称是 getId(),这就是它适用于这两个选项的原因。但是对于 firstName getter 来说是 getFirstName() ,对于 firstname getter 来说是 getFirstname() 。由于您的类只有 getFirstName(),这就是为什么只有 firstName 在 EL 中有效。

更新

所以我检查了代码。要获取可在 EL Java 中使用的可用属性列表,请检查类的方法。对于像 getSomeStuff() 这样的 getters,如果删除前 3 个字母 (get),然后用小写替换第一个字母。因此,getSomeStuff() 被转换为someStuff。这是一个可以在 JSP EL 中使用的名称。由于此验证,id 是一个有效的属性,而 Id 则不是,尽管 proeprty Id 是对象中实际存在的属性。但 JSP 使用 getter 来获取实际值。它不会检查实际属性是否存在以及它们的名称是什么。

代码片段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;
}

关于java - 在hibernate中,JSP值如何匹配实体类中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50441799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com