Java属性命名规范:
一个拥有Property(域/类变量)及其setter/getter的普通Java类,
一般情况下,Java的属性变量名都以小写字母开头,如:userName,showMessage等。
特殊情况下,一些特定的英文缩略词如(USA,XML等),JavaBean也允许大写字母起头的属性变量名,不过必须满足“变量的前两个字母要么全部大写,要么全部小写”。
如:
- 合法:IDCode、ICCard、idCode等
- 非法:iC、iCcard、iDCode等(在web应用中会报无法找到这个Property,因为根据"规则",需要找的是"Ic、IcCard、IdCode")
举个例子:
public class RegionDTO implements Serializable{
public String cId;
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String cName;
public String getCName() {
return cName;
}
public void setCName(String name) {
cName = name;
}
}
封装成List后,然后在页面上用C标签进行显示
${item.cId}//报错 RegionDTO没有这个属性!!!
原因:
(1)普通JavaBean处理涉及到相关类
在web应用中,Servlet容器或者EJB容器一般会使用java.beans包中的类来加载这些JavaBean。
BeanInfo(接口) ——> SimpleInfo(类)——> GenericBeanInfo(JavaBean数据装载类) ——> Introspector(JavaBean处理中最重要的一个处理类)
另外的一些辅助类,就不一一列举了。
(2)解密开始
在应用中,我们通常会用以下代码来获取一个普通JavaBean相关的信息:
BeanInfo mBeanInfo = null;
try {
mBeanInfo = Introspector.getBeanInfo(Person.class);
} catch (IntrospectionException e) {
e.printStackTrace();
}
(3)解密深入
在Introspector类的getBeanInfo方法中,我们发现其中与Property处理相关的行:
private GenericBeanInfo getBeanInfo() throws IntrospectionException {
……
PropertyDescriptor apropertydescriptor[] = getTargetPropertyInfo();
……
}
(4)继续深入
在Property处理方法中,我们发现其处理方式是根据getter/setter的方法来得到Property(域/类变量)
private PropertyDescriptor[] getTargetPropertyInfo() throws IntrospectionException{
……
if(s.startsWith("get")) obj = new PropertyDescriptor(decapitalize(s.substring(3)), method, null);
……
}
(5)关键
接下来,最关键的就是下面这个方法:
public static String decapitalize(String s) {
if(s == null || s.length() == 0)
//空处理
return s;
if(s.length() > 1 && Character.isUpperCase(s.charAt(1)) && Character.isUpperCase(s.charAt(0))){
//长度大于1,并且前两个字符大写时,返回原字符串
return s;
} else{
//其他情况下,把原字符串的首个字符小写处理后返回
char ac[] = s.toCharArray();
ac[0] = Character.toLowerCase(ac[0]);
return new String(ac);
}
}