(31)基础加强&javabean

1…认识javabean

 

Javabean它主要用于对JavaBean进行操作,JavaBean是一种特殊的Java类,这个类里面的某些方法的名称符合某种命名规则(有些方法的名称要按某种规则来起名),如果一个Java类中的一些方法名称符合某种命名规则,则可以把它当作JavaBean来使用

 

(1)

JavaBean:

 

比如有个类person,如果他里面有些方法的名称是以get和set打头,那么这个类就可以称之为javabean,,javabean的get和set方法是给外界去操作的,所以这些方法的访问权限是public

public class Person {

       privateint x;   //定义一个私有的变量

 

       publicint getAge() {

              returnx;  //返回类里面的一个变量

       }

 

       publicvoid setAge(int age) {

              this.x= age;`  把参数赋值给类里面的一个变量

       }

      

}

外界只能看到我的公有方法,看不见private 的 x,,他看到你类里面有个公有的getAge()方法,那么他就认为你类里面有个age属性,,

 

如果把一个java类当成一个javabean来看,那么这个javabean的属性,不是java类的属性,,javabean的属性是根据这个get和set方法的名称来推断出来的,而不是根据getAge() 方法里面的成员变量的名称x推断出来的,比如getAge() 就推断出类里面有age属性,,,,现在把这个Person当成一个javabean看,那么这个类里面就有个age属性不是x,,,如果把这个Person当成一个javabean来操作,那么就设置age属性,不能设置x,,因为对于外界来说,外界根本看不见x,,,就是我使用etAge() 你就给我age,,

 

总结:javabean的属性是根据这个get和set方法的名称来推断出来的,他有个特点:getAge()和setAge去掉get和set后剩下的就是javabean的属性名Age,在应用这个属性名Age时要把Age的第一个字母A改成小写a,就是age,改成小写时有个前提条件:如果第二个字母是小写的,则把第一个字母变成小写的,,如果第二个字母是大写的,那么第一个字母就保持原样(setCPU-->CPU),,,比如javabean里面有个方法gettime()那么他的javabean的属性名就是time,因为time的第二个字母i是小写的,所以第一个字母也必须是小写的t

setTime-->这个javabean里面就有个time属性 ,t不要大写,因为Time的第二个字母i是小写的,

 

(2)

符合某种命名规则:

 

比如我们要获取类里面的age属性,,那么获取age属性的方法就必须是getAge(),,一看到这个方法就知道他是返回这个对象的age属性,,同样他还有个setAge(int age)方法设置age属性,,这些getAge()和setAge(int age)命名很特殊要么是get开头要么是set开头,这就是方法命名符合某种特定的规则,这种规则就是方法的名称以get或者set开头,符合这种特殊规则的类就是JavaBean

 

(3)

一个JavaBean可以当做普通Java类来使用吗?

可以的,他也是个java类,可以new对象

 

(4)

一个普通Java类可以当做JavaBean来使用吗?

不一定,,我要看这个类里面有没有get和set方法,只要你有这样的get和set方法我就可以把你当做JavaBean来操作,即使你类里面有get和set方法,我也可以不把你当JavaBean来操作,看我心情,,我把你当做JavaBean来操作,我肯定是要用一套JavaBean的操作方式来操作你,不把你当JavaBean来操作,我就是用普通类的方式来操作你

 

 

 

2...

 

内省-->了解JavaBean

 

内省;就是对你内部进行检查,了解更多的底层细节

 

(1)

 

JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

 

(2)

 

如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称叫什么好呢?JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,至于你把它存到哪个变量上,用管吗?如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的

 

       setId()的属性名?id

       isLast()的属性名?last

       setCPU的属性名是什么??CPU

       getUPS的属性名是什么??UPS

 

总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。

 

 

(3)

 

一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和应用JavaBean!好处如下:

 

       在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地!

 

       JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。如果要你自己去通过getX方法来访问私有的x,怎么做,有一定难度吧?用内省这套api操作JavaBean比用普通类的        方式更方便。

 

 

 

3…用内省操作javabean

 

把这个类变成一个javabean,,怎么变呢

 

就是让别人访问这个x时不是直接访问x,而是使用getx和setx,,y同理,,,就要为这2个变量生成set和get方法,看代码2

 

代码;先创建一个javabean类

 

public class ReflectPoint {

       privateDate birthday = new Date();

      

       privateint x;

       privateint y;  

      

      

       publicReflectPoint(int x, int y) {

              super();

              this.x= x;

              this.y= y;

       }

      

       publicint getX() {

              returnx;

       }

 

 

       publicvoid setX(int x) {

              this.x= x;

       }

 

 

       publicint getY() {

              returny;

       }

 

       publicvoid setY(int y) {

              this.y= y;

       }

 

}

 

代码:单独写个类IntroSpectorTest使用内省的方式来读取这个javabean(ReflectPoint) 对象的x属性,,IntroSpectorTest要对这个ReflectPoint对象当成一个javabean来进行操作

public class IntroSpectorTest {

 

       //单独写个类IntroSpectorTest使用内省的方式来读取这个javabean(ReflectPoint) 对象的x属性,

       publicstatic void main(String[] args) throws Exception {

              //TODO Auto-generated method stub

              //IntroSpectorTest要对这个ReflectPoint对象当成一个javabean来进行操作

              ReflectPointpt1 = new ReflectPoint(3,5);

             

              //得到这个属性名对应的get方法,,这里定义一个属性名x,获得这个x属性的值,

              //这时你不知道ReflectPoint里面有个属性叫x,因为那个成员变量是私有的叫什么名字你看不见,你只是知道有个方法叫getX(),

              StringpropertyName = "x";

             

              //怎么操作x呢就是"x"-->"X"(这里不一定变成X,还得看"x"的第二个字母是不是小写的,如果这个"x"有第二个字母

              //而且第二个字母是小写的,就要把第一个字母变成大写的,如果不是就不变(第二个字母是大写的第一个字母就不变),,)-->"getX"(得到方法名)

              //-->MethodGetX(使用反射得到MethodGetX)-->

             

              //上面的"x"-->"X"-->"getX"-->MethodGetX-->复杂,那么下面采用内省的方式来操作,,

             

              //把propertyName当成一个属性,PropertyDescriptor是属性描述符,他对属性进行描述,第一个参数是属性名,就是你要获取哪个属性

              //第二个参数:你把哪一个java类当成javabean来看,你就传入哪个类,,把pt1.getClass()这个类当成javabean来看,

              //之后从这个javabean身上获取属性propertyName,,pt就代表了这个javabean身上的属性propertyName

              PropertyDescriptorpt=new PropertyDescriptor(propertyName, pt1.getClass());

             

              //javabean的属性是由get和set方法组和出来的,,,上面得到了javabean的属性就可以得到这个属性的get和set方法

              //javabean的属性有只读(只能读取他的值,就是他只有get())或只写或可读写,

             

              //getReadMethod()得到属性propertyName的get方法,这里就得到这个属性propertyName的只读(get)方法

              MethodmethodGetX= pt.getReadMethod();

             

              //方法调用invoke方法,在pt1对象身上调用这个方法,调用这个方法时get()不接收参数,,返回值是Object类型的

              //get()方法是有返回值的,所以要定义retVal接收返回值

              ObjectretVal= methodGetX.invoke(pt1, null);

             

              //上面的代码就读取出来了ReflectPoint类里面x属性的值,,上面的代码就是使用内省的api得到x属性的值,他省略了"x"-->"X"-->"getX",如果把它当做javabean来操作,你要取某个属性,一定是通过get方法来获取,你要得到这个属性名对应的get方法是很麻烦的("x"-->"X"-->"getX"),,现在使用内省的api得到这个属性名的get方法就很简单了

              System.out.println(retVal);

 

              //对这个属性设置一个值,,   getWriteMethod()得到set方法     ,以javabean的形式设置属性值

              PropertyDescriptorpt2=new PropertyDescriptor(propertyName, pt1.getClass());

              MethodmethodSetX= pt2.getWriteMethod();

              //set()方法没有返回值的,就不需要定义变量接收返回值了,set(int a)接收参数,,这里就(set)设置值进去了

              methodSetX.invoke(pt1,7);

             

              //设置值后就获取属性的值,,,现在我不把pt1当成javabean来使用,当成普通的对象来用

              System.out.println(pt1.getX());

       }

}

 

4…Beanutils工具类操作javabean

 

Beanutils:这个工具类是专门对javabean进行操作的,由于对javabean的属性进行set和get操作这个需求广泛,使用的频率很高,所以就提供一个工具类Beanutils对javabean的属性进行set和get操作,提供了专门针对javabean进行操作的工具类Beanutils

 

使用Beanutils工具包设置和读取javabean的属性,,别人的类是以jar包的形式提供给我们的,,不能直接在bulidpach里添加Beanutils的jar包,这样加完后我的机器上d盘指定的目录下有这个包,但是我把这个项目发给别人了,别人的机器d盘指定的目录下没有这个包,所以就把这个包放在我项目的内部,,,我把项目发给你了包也跟着一起过去了,,就在项目里面单独建个目录存放Beanutils工具包,,这个Beanutils工具包虽然在我的项目内部了,,但是没有把这个Beanutils工具包加到buildpath里去,所以得把这个包配置到buildpath里去

 

代码1:

 

public class IntroSpectorTest2 {

 

       publicstatic void main(String[] args) throws Exception{

              //TODO Auto-generated method stub

              ReflectPointpt1 = new ReflectPoint(3,5);

              StringpropertyName = "x";

             

              //对pt1对象身上的属性propertyName进行获取,对哪个对象身上的某个属性进行获取,,获取对象身上的某个属性,相当于get()

             

              ObjectretVal = getPorperty(pt1, propertyName);

              System.out.println(retVal);

                           

              Objectvalue=7;

              //接收3个参数,设置哪个对象的哪个属性,并将那个属性设置为具体的值,一共3个参数

              //设置属性propertyName的值

              setPorperty(pt1,propertyName, value);

             

              //指定对哪个javabean进行使用,,,指定使用这个javabean的哪个属性,,

              //这里getProperty()是获得对象的propertyName属性,,这里打印了propertyName属性的值为7

              System.out.println(BeanUtils.getProperty(pt1,propertyName));

             

              //设置属性值后再打印属性值

              System.out.println(pt1.getX());

             

       }

 

分析代码:

返回属性的类型是String,我们在这个javabean身上进行操作时 ,这个javabean的x属性的类型是int,但是我们使用BeanUtils去操作时,他设置的时候是以string类型"8"设置进去的,他返回的额时候又是以string返回的,,为什么设置时不使用int设置,而是使用string,,,;因为:在web开发中我们通过浏览器填写的age年龄数据9,传给服务器是字符串9,他是按照9那个符号传的,,设置了"9"后就把"9"交给javabean里面的int age,那就得把"9"转换成int9,再把这个int9设置到javabean的age里,,BeanUtils可以自动进行类型转换,目标是int,传进来的是string.他会自动把string转换为int,再把这个int数字设置到javabean的age,,,在web开发中,传入的数据就是字符串,返回的也是字符串,因为要把返回来的数据以字符串的形式显示在网页,,,

 

结论;

可以看到BeanUtils的好处:

(1)

BeanUtils把set和get属性的值都是当做字符串来操作的,实际上在javabean里面属性的类型又不是字符串,,这就涉及到了类型转换,,他可以自动完成类型转换,,

 

(2)

BeanUtils支持属性的级联操作(birthday.time)..也就是可以支持属性面,可以一级级的点下去

 

 

代码:级联操作

 

              //设置pt1对象里面的属性birthday ,,,birthday是Date类型,Date对象里面有个time属性,这里就等于为Date对象里面的time属性赋值

              //因为date类里面有个setTime()方法符合javabean身上set方法的结构,可以把date类当成一个javabean来看,所以date类里面就有个time属性

              //birthday属性是个复合属性不是个基本属性,这个属性birthday的类型是对象,所以birthday里面就还有属性Time,,1000是毫秒值

             

              //这里为pt1对象身上的对象birthday的time属性赋值

              BeanUtils.setProperty(pt1,"birthday.time", "1000");

             

              //获取pt1对象身上的对象birthday的time属性值

              System.out.println(BeanUtils.getProperty(pt1,"birthday.time"));

 

(3)

BeanUtils不仅可以操作javabean也可以操作map,,map和javabean很类似,,map的key就相当于javabean里面的属性,,map和javabean可以进行相互转换,,BeanUtils提供了转换的方式

 

 

 

 

(4)…pertyUtils.

 

 

              //设置pt1对象里面的属性birthday ,,,birthday是Date类型,Date对象里面有个time属性,这里就等于为Date对象里面的time属性赋值

              //因为date类里面有个setTime()方法符合javabean身上set方法的结构,可以把date类当成一个javabean来看,所以date类里面就有个time属性

              //birthday属性是个复合属性不是个基本属性,这个属性birthday的类型是对象,所以birthday里面就还有属性Time,,1000是毫秒值

             

              //这里为pt1对象身上的对象birthday的time属性赋值

              BeanUtils.setProperty(pt1,"birthday.time", "1000");

             

              //获取pt1对象身上的对象birthday的time属性值

              System.out.println(BeanUtils.getProperty(pt1,"birthday.time"));

             

              //PropertyUtils也可以设置属性

              PropertyUtils.setProperty(pt1,"x", "9");

             

              //获取属性值,,getProperty()返回的属性值类型是整数类型Integer,,返回属性值时也是按照属性本身的类型返回

              System.out.println(PropertyUtils.getProperty(pt1,"x").getClass().getName());

 

结论:BeanUtils是以字符串的形式对javabean进行操作,,而PropertyUtils是以javabean里面那个属性本身的类型来进行操作的,如果你不想进行类型转换或者这个BeanUtils进行类型转换时出现错误,就直接使用PropertyUtils,,,如果你想要他帮你进行类型转换就使用BeanUtils

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值