1.采用ServletContext读取,读取配置文件的realpath,然后通过文件流读取出来。
String path = "/WEB-INF/jdbc_connection.properties"; //读取WEB-INF中的配置文件
String realPath = getServletContext().getRealPath(path);//getServletContext()相当于http://localhost/demo05
//所以后面的path只需要以应用demo/开头具体的部署目录路径即可,如上面的/web-in…
/*优点*/:可以读取任意的配置文件包括xml和properties。
/*缺点*/:不能在servlet外面应用读取配置信息。2.采用ResourceBundle类读取配置信息 /*获取指定配置文件中所以的数据*/
/*优点是*/:可以以完全限定类名的方式加载资源后,直接的读取出来,且可以在非Web应用中读取资源文件
/*缺点*/:只能加载类classes下面的资源文件且只能读取.properties文件
3.采用ClassLoader方式进行读取配置信息 /*获取的是classes的根路径下的文件*/
/*优点是*/:可以在非Web应用中读取配置资源信息,可以读取任意的资源文件信息
/*缺点*/:只能加载类classes下面的资源文件。4.Class.getResouceAsStream
//Class.getResourceAsStream(String path)path 不以 ‘/’ 开头(相对路径)时默认是从此类所在的包下取资源,以 ‘/’ 开头则是从 ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
//Class.getClassLoader.getResourceAsStream(String path) : 默认则是从ClassPath根下获取,path不能以 ‘/’ 开头,最终是由 ClassLoader 获取资源
//classpath 就是存放 class 文件的 地方 ,javase项目 classpath 就是bin目录,javaee项目 classpath 就是classes 目录Class.getResource /*file:/E:/MyEclipseCode/JavaSEReview/bin/com/javaSE/config/ */
Class.getClassLoader.getResource /* file:/E:/MyEclipseCode/JavaSEReview/bin/ */
这两个getResource()是使用当前ClassLoader加载资源(即资源在 Class path中),这样资源和class直接打在jar包中,避免文件路径问题.
两者不同是Class的getResource()方法是 /*从当前.class 文件路径查找资源*/,ClassLoader则是从 /*jar包根目录查找*/.
简陋的理解是, Class.getResource查找范围更深入,有包名
Class.getClassLoader.getResource没有包名 只到bin目录下内省(Java语言对JavaBean类属性、事件的一种缺省处理方法)
内省可以看作一种特殊的反射,只能操作javabean类的反射
简单方式实现内省
PropertyDescriptor propDesc=new PropertyDescriptor(userName,UserInfo.class)
1.创建 PropertyDescriptor 实例对象 需要的参数(操作哪个属性,操作哪个JavaBean),得到的就是一个属性对象
2.得到该属性对应的get和set方法
3.执行相应方法,传参赋值(set)或得到返回值(get)
复杂方式实现内省(Introspector类)
将JavaBean中的属性封装起来进行操作。在程序把一个类当做JavaBean来看,就是调用Introspector.getBeanInfo()方法
得到的BeanInfo对象封装了把这个类当做JavaBean看的结果信息,即属性的信息
getPropertyDescriptors(),获得所有属性的描述,遍历PropertyDescriptor[],如果某个PropertyDescriptor即属性的名字和我们需要操作的属性的name相同
操作这个PropertyDescriptor 就可以了,参考简单内省使用BeanUtils工具包操作JavaBean
1.BeanUtils.getProperty(bean,"age"); //操作哪个bean 得到哪个属性
2.BeanUtils.setProperty(bean,"age","20"); //操作哪个bean 操作哪个属性 操作的值是多少
注:/*因为在web应用中,通常是字符串传递数据,所以这里BeanUtils帮我们做,比如这里的age属性是int类型,set 和 get都帮我们转成String再得到 或 赋值*
注:如果在一个Bean中有Date类型的属性 Date birthday = new Date(); 而Date类有一个set/getTime方法,即birthday对象有一个time属性
在BeanUtils中,可以这样操作time属性,BeanUtils.getProperty(bean,"birthday.time")
3.Bean和Map的转化
注: /*java7新特性Map map = {name:"xzk",age:18};
BeanUtils.setProperty(map,"name","xuzekun");
*/
4.PropertyUtils
PropertyUtils 和 BeanUtils的区别 ;不会进行数据类型的转换,即age属性为int类型,BeanUtils.setProperty(bean,"age",20);,这里给的就是int