怎么在Java中使用BeanUtils组件
怎么在Java中使用BeanUtils组件?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
BeanUtils
BeanUtils是Apache commens组件里面的成员,由Apache提供的一套开源api,用于简化对javaBean的操作,能够对基本类型自动转换。
JavaBean
BeanUtils组件是用于简化javaBean的操作,那么什么是javaBean呢?简单来说,javaBean实质就是java类,只不过是遵循了某种规范的java类。
javaBean的特点:
必须具有一个无参的构造方法
属性必须私有化
私有化的属性必须通过public类型的方法来暴露,也就是说要出现setXXX()、getXXX()或者isXXX()的方法
下载BeanUtils
http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi,下载好组件,再到项目里面引入jar文件。
导入核心包
commons-beanutils-1.9.3.jar
commons-logging-1.2.jar
注意:当缺少日志jar包,会出现如下的报错情况。
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
logging组件的下载地址:http://commons.apache.org/proper/commons-logging/download_logging.cgi
javaBean实例
publicclassStudent{ privateStringname; privateStringid; privateintage; privateStringsex; privateDated; publicStudent(){ super(); } publicDategetD(){ returnd; } publicvoidsetD(Dated){ this.d=d; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetId(){ returnid; } publicvoidsetId(Stringid){ this.id=id; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } publicStringgetSex(){ returnsex; } publicvoidsetSex(Stringsex){ this.sex=sex; } @Override publicStringtoString(){ return"Student[name="+name+",id="+id+",age="+age +",sex="+sex+",d="+d+"]"; } }
BeanUtils用法
对象的拷贝,BeanUtils.copyProperties(Object dest,Object orig)
对象属性的拷贝,BeanUtils.copyProperties(Object bean,String name,Object value)或者BeanUtils.setProperty(Object bean,String name,Object value)
map数据封装到Javabean,populate(Object bean, Map<String,? extends Object> properties)
实例
对象的拷贝
@Test publicvoidtest()throwsException{ //创建对象 Students=newStudent(); /** *组件对JavaBean的操作 *bean:javaBean对象 *name:对象的属性名称 *value:对象的属性值 */ //1.实现对象的属性拷贝,对于基本数据类型,会自动进行类型转换 BeanUtils.copyProperty(s,"id","2018100712"); //2.实现对象之间的拷贝:Objectdest<---Objectorig Students2=newStudent(); BeanUtils.copyProperties(s2,s); System.out.println(s2); }
对象属性的拷贝
@Test publicvoidtest()throwsException{ //创建对象 Students=newStudent(); /*一般的操作 s.setId("1221212"); s.setName("老王"); System.out.println(s); */ //1.实现对象的属性拷贝,对于基本数据类型,会自动进行类型转换 BeanUtils.copyProperty(s,"id","2018100712"); System.out.println(s) }
map数据封装到javaBean
注意:要map中的数据封装到JavaBean中去,需要map中的key与JavaBean里面的私有化的属性要相匹配
@Test publicvoidtest()throwsException{ //创建对象 Students2=newStudent(); //1.map的数据拷贝到对象中去 Map<String,Object>map=newHashMap<String,Object>(); map.put("id","12233"); map.put("name","老王"); map.put("sex","男"); BeanUtils.populate(s2,map); System.out.println(s2); }
类型转换器
当javaBean中出现非基本类型数据的私有化属性,并且需要对该数据进行封装时,就要去注册该数据类型的类型转换器了,不如就会出现错误,比如该Student对象中的日期类型。
日期类型转换出错:org.apache.commons.beanutils.converters.DateConverter toDate 警告: DateConverter does not support default String to 'Date' conversion,可以看出工具类converters在转换的时候出现了错误,为此我们可以去查看该类,以便我们接下来去实现类型转换。
converter
在解压出来的BeanUtils文件下的apidoc目录中的index.html里面可以找到该类的说明,会发现它是一个接口,有很多的实现类,我们可以使用里面的实现类来做日期类型的转换或者说我们可以自己去注册个类型转换器。
自定义类型转换器
去复写ConvertUtils里面的register(Converter converter, Class<?> clazz)方法
@Test publicvoidtest2()throwsException{ //假设网页表单提交过来的数据 Stringname="老王"; Stringid="121212"; Stringdate="2018-10-11"; Students=newStudent(); //1.自定义:注册日期类型转换器去复写ConvertUtils里面的register(Converterconverter,Class<?>clazz)方法 ConvertUtils.register(newConverter(){ //修改第三方jar引入方法的参数时候,可以关联源码,ctrl选择该类,点进去,选择Attachsource--->externalfile @Override publicObjectconvert(Classtype,Objectvalue){ //判断 if(value==null||"".equals(value.toString().trim())){ returnnull; } if(type!=Date.class){ returnnull; } try{ //字符串转换为日期 SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd"); returnsdf.parse(value.toString()); }catch(Exceptione){ thrownewRuntimeException(e); } } },Date.class); //把表单的数据封装到对象中去 BeanUtils.copyProperty(s,"name",name); BeanUtils.copyProperty(s,"id",id); BeanUtils.copyProperty(s,"d",date); System.out.println(s); }
使用工具类提供的类型转换器
@Test publicvoidtest3()throwsException{ //利用组件提供的日期类型转换器,提供一个实现类 //假设表单的数据 Stringname="老王"; Stringid="121212"; //当日期字符串出现空字符串或者出现空格的情况,会报错org.apache.commons.beanutils.ConversionException Stringdate="2018-09-12"; Students=newStudent(); ConvertUtils.register(newDateLocaleConverter(),Date.class); //把表单的数据封装到对象中去 BeanUtils.copyProperty(s,"name",name); BeanUtils.copyProperty(s,"id",id); BeanUtils.copyProperty(s,"d",date); System.out.println(s); }
注意:当日期字符串是空字符串或者存在空格的时候,会报错!
BeanUtils在servlet的使用
获取表单提交的数据并封装到javabean中去,request.getParameterMap()获取所有的参数并存储到Map中去,并利用BeanUtils里面的populate(Object bean, Map<String,? extends Object> properties),封装到对象中去,简化了很多的操作!
1.jsp
<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%> <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"> <html> <head> <title>注册</title> </head> <body> <formaction="registe.do"method="post"> 用户名称:<inputtype="text"name="name"><br> 密 码:<inputtype="password"name="password"><br> 联系方式:<inputtype="text"name="phone"><br> <inputtype="submit"value="提交"> </form> </body> </html>
jsp显示的结果:
2.servlet
packagecn.tan.servlet; importjava.io.IOException; importjava.lang.reflect.InvocationTargetException; importjava.util.Map; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.apache.commons.beanutils.BeanUtils; importcn.tan.entry.Student; publicclassGetDataServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doPost(request,response); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ request.setCharacterEncoding("utf-8"); //获取所有参数 Map<String,String[]>map=request.getParameterMap(); Students=newStudent(); try{ BeanUtils.populate(s,map); //测试,输出封装的结果 System.out.println(s); }catch(Exceptione){ thrownewRuntimeException(e); } } }
输出结果:Student [name=老王, age=0, password=11111, phone=13232174361]
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注恰卡编程网行业资讯频道,感谢您对恰卡编程网的支持。