JavaBean
一、初识JavaBean
什么叫做JavaBean呢?
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。特殊之处在
- 1、所有属性为private
- 2、提供默认构造方法
- 3、提供getter和setter
- 4、实现serializable接口。
如下边的Students就是一个JavaBean类:
public class Students { private String name; private String sex; private double grades; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public double getGrades() { return grades; } public void setGrades(double grades) { this.grades = grades; } }
一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。
- setName的属性是name。
- setSex的属性是sex。
- setGrades的属性是grades。
- getClass的属性是class。
所有的类都继承与Object,Object类中有getClass方法,所有上面也有一个class属性。
二、内省操作JavaBean的属性
什么事内省?
内省是Java语言对Bean类属性、事件的一种缺省处理方法。例如:Students类中有属性name,那我们可以通过getName,setName来得到其值或者设置新的值。通过getName/setName来访问name属性,这就是默认的规则。Java中提供了 一套API用来访问某个属性的getter/setter方法,通过这些API可以使你不需要了解这个规则,这些API存放于包java.beans中。一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器 (PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来 调用这些方法。
PartI、某个对象的所有属性名称都打印出来
/*某个对象的所有属性名称都打印出来 * * 1、连同父类的属性值也打印出来。(就像Students类,打印四个属性grades、name、sex、class,包括一个Object的一个class属性) * * public static BeanInfo getBeanInfo(Class<?> beanClass) throws IntrospectionException * * 2、只打印该类的属性,父类的属性不打印 (就像Students类,只打印三个属性grades、name、sex * * public static BeanInfo getBeanInfo(Class<?> beanClass,Class<?> stopClass throws IntrospectionException * */ public static void test1() throws IntrospectionException{ BeanInfo info= Introspector.getBeanInfo(Students.class,Object.class); PropertyDescriptor[] pds=info.getPropertyDescriptors(); for(PropertyDescriptor pd:pds){ System.out.println(pd.getName()); } }
PartII、操作对象的某个属性:
/* * 1、通过PropertyDescriptor来获得一个属性的 PropertyDescriptor * PropertyDescriptor(String propertyName, Class<?> beanClass) * * 2、通过PropertyDescriptor对象的方法 * getPropertyType() 获得属性的 Class 对象 * getReadMethod() 获得应该用于读取属性值的方法。 * getWriteMethod() 获得应该用于写入属性值的方法。 */ public static void test2() throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{ Students p=new Students(); PropertyDescriptor pd=new PropertyDescriptor("grades",Students.class); System.out.println(pd.getPropertyType()); Method method=pd.getWriteMethod(); method.invoke(p, 60); System.out.println(p.getGrades()); method=pd.getReadMethod(); System.out.println(method.invoke(p, null)); }
三、使用BeanUtils工具包来操作JavaBean类。
如需下载JavaBean包,请加qq群: 45775655。
public static void test1() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{ /* * 使用BeanUtils的setProperty方法为对象的grade属性设置值 * 使用BeanUtils的getProperty方法为对象的grade属性设置值 */ Students s=new Students(); BeanUtils.setProperty(s, "grades", 97); Object grades=BeanUtils.getProperty(s, "grades"); System.out.println(grades); }
Converter只支持一些基本的类型,甚至连java.util.Date类型也不支持。当我们操作Date类型时候,就需要使用ConvertUtils来实现类型转换。
ConvertUtils.register(new DateLocaleConverter(), Date.class);
也可以自己实现类型转换的方法,如下:
public static void test1() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{ /* * 自己实现DateConverter() 方法。 * */ ConvertUtils.register(new DateConverter(),Date.class); Students s=new Students(); BeanUtils.setProperty(s, "birthday", "1992-08-08"); System.out.println(s.getBirthday().toLocaleString()); System.out.println(); } class DateConverter implements Converter { private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); /** * 要将字符串的value转换为java.util.Date类型的值 * targetClass 第一个参数 是你的目标类型 * value 要转换的值, * Object 把要转回的值,返回出去就ok了 */ public Object convert(Class targetClass, Object value) { if (targetClass != Date.class) { return null; } try { if (value instanceof String) { String v = (String) value; return format.parse(v); } } catch (ParseException e) { e.printStackTrace(); } return null; }
四、JSP操作javaBean
在JSP中,我们可通过JSP中的<jsp:useBean>、<jsp:setProperty>及<jsp:getProperty>这三个标准操作元素来使用JavaBean。这三个标准元素分别是用来使用JavaBean、设置以及取得JavaBean的属性。
1、<jsp:useBean>标签
该标签用于在某个指定的域范围(application、session、request、pageContext等)中查找一个指定名称的 JavaBean对象,如果存在则直接返回该JavaBean对象的引用。如果不存在则实例化一个新的JavaBean对象,并将它按指定的名称存储在指 定的域范围中。常见语法如下:
<jsp:useBean id="beanInstanceName" class="package.class" scope="page|request|session|application" />
- class属性用于指定JavaBean的完整类名,JSP引擎将使用这个类名来创建JavaBean的实例对象或作为查找到JavaBean对象的类 型;
- id属性用于指定JavaBean实例对象的引用名称和其存储在域范围的名称;
- scope属性用于指定JavaBean实例对象所存储的域范围,其默 认值是page。
<jsp:useBean>标签除了可以按照空元素的方式进行使用外,还可以按容器元素的格式进行使用,如:
<jsp:useBean...> Body </jsp:useBean...>
Body部分只在标签创建JavaBean的实例对象时才执行,也就是说,如果scope属性指定的域范围存在id属性指定的JavaBean对象,那Body内容将被忽略。
2、<jsp:setProperty>标签
该标签用于设置JavaBean对象的属性,也就是调用JavaBean对象的setter方法,其语法如下:
<jsp:setProperty name="beanInstanceName" property="propertyName" [ value="{string | <%= expression %>}" | param="parameterName" ] | property="*" />
-
name属性是必不可少的,用于指定JavaBean实例对象的名称,其值应与<jsp:useBean>标签的id属性相同。
-
property属性是必不可少的,用于指定JavaBean实例对象的属性名。
-
value属性是可选的,它用于指定JavaBean实例对象的某个属性的值,value属性的设置值可以是一个字符串,也可以是一个表达式。如果是value属性的设置值是字符串,那么它将自动转换成所要设置的JavaBean属性的类型;如果是表达式,则表达式的结果类型与所要设置的JavaBean属性的类型一致(不一致则报错)。
-
param属性是可选的,它用于将请求参数的值赋给JavaBean实例对象的某个属性。如果当前请求消息中没有param属性所指定的请求参数,该标签不会将null赋给JavaBean属性,所设置的JavaBean属性仍将等于其原来的初始值,value和param属性不能同时使用。
-
property="*",这种形式用于对JavaBean实例对象多个属性进行赋值,它表示将请求消息中的参数逐一与JavaBean实例对象中的属性进行比较,如果找到同名的属性,则将该参数赋给该属性,不存在则不会被赋值。
注意:如果param属性和value属性都没有设置,且property="prppertyName",它等效于param属性的设置值与property属性值相同的情况
3、<jsp:getProperty>标签
该标签用于读取JavaBean对象的属性,也就是调用JavaBean对象的getter方法,然后将读取的属性值转换成字符串后插入进输出的响应正文中,其使用语法如下:
<jsp:getProperty name="beanInstanceName" property="PropertyName" />
其中,name属性用于指定JavaBean实例对象的名称,其值应与<jsp:useBean>标签的id属性值相同,property属 性用于指定JavaBean实例对象的属性名,如果一个JavaBean实例对象的某个属性的值为null,则该标签输出该属性的结果将是内容为null 的字符串。