您的位置:首页 > 编程语言 > Java开发

JavaBean

2015-10-04 19:00 507 查看
一、初识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 的字符串。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: