怎么在Java中使用BeanUtils組件?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)是網(wǎng)站建設(shè)專(zhuān)家,致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營(yíng)銷(xiāo),專(zhuān)業(yè)領(lǐng)域包括成都網(wǎng)站建設(shè)、做網(wǎng)站、電商網(wǎng)站制作開(kāi)發(fā)、小程序定制開(kāi)發(fā)、微信營(yíng)銷(xiāo)、系統(tǒng)平臺(tái)開(kāi)發(fā),與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開(kāi)發(fā)公司不同,我們的整合解決方案結(jié)合了恒基網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷(xiāo)的理念,并將策略和執(zhí)行緊密結(jié)合,且不斷評(píng)估并優(yōu)化我們的方案,為客戶提供全方位的互聯(lián)網(wǎng)品牌整合方案!
BeanUtils是Apache commens組件里面的成員,由Apache提供的一套開(kāi)源api,用于簡(jiǎn)化對(duì)javaBean的操作,能夠?qū)绢?lèi)型自動(dòng)轉(zhuǎn)換。
BeanUtils組件是用于簡(jiǎn)化javaBean的操作,那么什么是javaBean呢?簡(jiǎn)單來(lái)說(shuō),javaBean實(shí)質(zhì)就是java類(lèi),只不過(guò)是遵循了某種規(guī)范的java類(lèi)。
必須具有一個(gè)無(wú)參的構(gòu)造方法
屬性必須私有化
私有化的屬性必須通過(guò)public類(lèi)型的方法來(lái)暴露,也就是說(shuō)要出現(xiàn)setXXX()、getXXX()或者isXXX()的方法
下載BeanUtils
http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi,下載好組件,再到項(xiàng)目里面引入jar文件。
commons-beanutils-1.9.3.jar
commons-logging-1.2.jar
注意:當(dāng)缺少日志jar包,會(huì)出現(xiàn)如下的報(bào)錯(cuò)情況。
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
logging組件的下載地址:http://commons.apache.org/proper/commons-logging/download_logging.cgi
public class Student { private String name; private String id; private int age; private String sex; private Date d; public Student() { super(); } public Date getD() { return d; } public void setD(Date d) { this.d = d; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Student [name=" + name + ", id=" + id + ", age=" + age + ", sex=" + sex + ", d=" + d + "]"; } }
對(duì)象的拷貝,BeanUtils.copyProperties(Object dest,Object orig)
對(duì)象屬性的拷貝,BeanUtils.copyProperties(Object bean,String name,Object value)或者BeanUtils.setProperty(Object bean,String name,Object value)
map數(shù)據(jù)封裝到Javabean,populate(Object bean, Map
實(shí)例
對(duì)象的拷貝
@Test public void test() throws Exception { //創(chuàng)建對(duì)象 Student s=new Student(); /** * 組件對(duì)JavaBean的操作 * bean:javaBean對(duì)象 * name:對(duì)象的屬性名稱(chēng) * value:對(duì)象的屬性值 */ //1.實(shí)現(xiàn)對(duì)象的屬性拷貝, 對(duì)于基本數(shù)據(jù)類(lèi)型,會(huì)自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換 BeanUtils.copyProperty(s, "id","2018100712"); //2.實(shí)現(xiàn)對(duì)象之間的拷貝:Object dest<---Object orig Student s2=new Student(); BeanUtils.copyProperties(s2, s); System.out.println(s2); }
對(duì)象屬性的拷貝
@Test public void test() throws Exception { //創(chuàng)建對(duì)象 Student s=new Student(); /*一般的操作 s.setId("1221212"); s.setName("老王"); System.out.println(s); */ //1.實(shí)現(xiàn)對(duì)象的屬性拷貝, 對(duì)于基本數(shù)據(jù)類(lèi)型,會(huì)自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換 BeanUtils.copyProperty(s, "id","2018100712"); System.out.println(s) }
map數(shù)據(jù)封裝到j(luò)avaBean
注意:要map中的數(shù)據(jù)封裝到JavaBean中去,需要map中的key與JavaBean里面的私有化的屬性要相匹配
@Test public void test() throws Exception { //創(chuàng)建對(duì)象 Student s2=new Student(); //1.map的數(shù)據(jù)拷貝到對(duì)象中去 Mapmap = new HashMap (); map.put("id","12233"); map.put("name","老王"); map.put("sex","男"); BeanUtils.populate(s2, map); System.out.println(s2); }
當(dāng)javaBean中出現(xiàn)非基本類(lèi)型數(shù)據(jù)的私有化屬性,并且需要對(duì)該數(shù)據(jù)進(jìn)行封裝時(shí),就要去注冊(cè)該數(shù)據(jù)類(lèi)型的類(lèi)型轉(zhuǎn)換器了,不如就會(huì)出現(xiàn)錯(cuò)誤,比如該Student對(duì)象中的日期類(lèi)型。
日期類(lèi)型轉(zhuǎn)換出錯(cuò):org.apache.commons.beanutils.converters.DateConverter toDate 警告: DateConverter does not support default String to 'Date' conversion,可以看出工具類(lèi)converters在轉(zhuǎn)換的時(shí)候出現(xiàn)了錯(cuò)誤,為此我們可以去查看該類(lèi),以便我們接下來(lái)去實(shí)現(xiàn)類(lèi)型轉(zhuǎn)換。
在解壓出來(lái)的BeanUtils文件下的apidoc目錄中的index.html里面可以找到該類(lèi)的說(shuō)明,會(huì)發(fā)現(xiàn)它是一個(gè)接口,有很多的實(shí)現(xiàn)類(lèi),我們可以使用里面的實(shí)現(xiàn)類(lèi)來(lái)做日期類(lèi)型的轉(zhuǎn)換或者說(shuō)我們可以自己去注冊(cè)個(gè)類(lèi)型轉(zhuǎn)換器。
去復(fù)寫(xiě)ConvertUtils里面的register(Converter converter, Class> clazz)方法
@Test public void test2() throws Exception { //假設(shè)網(wǎng)頁(yè)表單提交過(guò)來(lái)的數(shù)據(jù) String name="老王"; String id="121212"; String date="2018-10-11"; Student s=new Student(); //1.自定義:注冊(cè)日期類(lèi)型轉(zhuǎn)換器去復(fù)寫(xiě)ConvertUtils里面的register(Converter converter, Class> clazz)方法 ConvertUtils.register(new Converter() { //修改第三方j(luò)ar引入方法的參數(shù)時(shí)候,可以關(guān)聯(lián)源碼,ctrl選擇該類(lèi),點(diǎn)進(jìn)去,選擇Attach source--->external file @Override public Object convert(Class type, Object value) { //判斷 if (value ==null ||"".equals(value.toString().trim())){ return null; } if (type !=Date.class){ return null; } try { //字符串轉(zhuǎn)換為日期 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); return sdf.parse(value.toString()); } catch (Exception e) { throw new RuntimeException(e); } } },Date.class); //把表單的數(shù)據(jù)封裝到對(duì)象中去 BeanUtils.copyProperty(s, "name",name); BeanUtils.copyProperty(s, "id",id); BeanUtils.copyProperty(s, "d",date); System.out.println(s); }
@Test public void test3() throws Exception { //利用組件提供的日期類(lèi)型轉(zhuǎn)換器,提供一個(gè)實(shí)現(xiàn)類(lèi) //假設(shè)表單的數(shù)據(jù) String name="老王"; String id="121212"; //當(dāng)日期字符串出現(xiàn)空字符串或者出現(xiàn)空格的情況,會(huì)報(bào)錯(cuò)org.apache.commons.beanutils.ConversionException String date="2018-09-12"; Student s=new Student(); ConvertUtils.register(new DateLocaleConverter(), Date.class); //把表單的數(shù)據(jù)封裝到對(duì)象中去 BeanUtils.copyProperty(s, "name",name); BeanUtils.copyProperty(s, "id",id); BeanUtils.copyProperty(s, "d",date); System.out.println(s); }
注意:當(dāng)日期字符串是空字符串或者存在空格的時(shí)候,會(huì)報(bào)錯(cuò)!
獲取表單提交的數(shù)據(jù)并封裝到j(luò)avabean中去,request.getParameterMap()獲取所有的參數(shù)并存儲(chǔ)到Map中去,并利用BeanUtils里面的populate(Object bean, Map
1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>注冊(cè)
jsp顯示的結(jié)果:
2.servlet
package cn.tan.servlet; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils; import cn.tan.entry.Student; public class GetDataServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); //獲取所有參數(shù) Mapmap = request.getParameterMap(); Student s=new Student(); try { BeanUtils.populate(s, map); //測(cè)試,輸出封裝的結(jié)果 System.out.println(s); } catch (Exception e) { throw new RuntimeException(e); } } }
輸出結(jié)果:Student [name=老王, age=0, password=11111, phone=13232174361]
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。