zhyiwww
          用平實(shí)的筆,記錄編程路上的點(diǎn)點(diǎn)滴滴………
          posts - 536,comments - 394,trackbacks - 0
          ?

          我們?cè)赪eb開(kāi)發(fā)中,可能經(jīng)常會(huì)從表單中取值,然后封裝成一個(gè)bean的時(shí)候。

          可能你也是這樣做的:

          String?uname?=?(String)request.getParameter("uname");

          String?upass?=?(String)request.getParameter("upass");

          User?u?=?new?User(uname,upass);

          或者

          U.set……

          u.set……

          等等

          如果字段很多的話,可能前面就要很多的各這樣的過(guò)程。也許你也會(huì)覺(jué)得很是麻煩,又沒(méi)有好的辦法。

          我們可以使用反射來(lái)實(shí)現(xiàn),也許可以減輕一點(diǎn)您的負(fù)擔(dān)。

          代碼如下:

          User?u?=?new?User();

          ??

          ??Enumeration?m?=?request.getParameterNames();

          ??while(m.hasMoreElements()){

          ???String??pn?=?(String)m.nextElement();

          ???out.println(pn?+?"?---?");

          ???String??pv?=?(String)request.getParameter(pn);

          ???out.println(?pv?+?"<br>");

          ???

          ???Class?c?=?u.getClass();???

          ???out.println("?class?is?:?"?+?c?+?"<br>");

          ???

          ???try?{

          ???????

          ????Field?f?=?c.getField(pn);

          ????

          ????out.println("field?is?:?"?+?f?+?"<br>");

          ????f.set(u,?pv);

          ????

          ????out.println("?user?name?is?:?"?+?u.getUname()?+?"<br>");

          ????out.println("?user?pass?is?:?"?+?u.getUpass()?+?"<br>");

          ????

          ???}?catch?(SecurityException?e)?{

          ????//?TODO?Auto-generated?catch?block

          ????e.printStackTrace();

          ???}?catch?(NoSuchFieldException?e)?{

          ????//?TODO?Auto-generated?catch?block

          ????e.printStackTrace();

          ???}?catch?(IllegalArgumentException?e)?{

          ????//?TODO?Auto-generated?catch?block

          ????e.printStackTrace();

          ???}?catch?(IllegalAccessException?e)?{

          ????//?TODO?Auto-generated?catch?block

          ????e.printStackTrace();

          ???}

          ??}

          ??我們也可以把這個(gè)部分封裝起來(lái)成一個(gè)類,實(shí)現(xiàn)從request到一個(gè)bean的注入。

          上面的方法有一個(gè)缺點(diǎn),由于我們使用的Field來(lái)實(shí)現(xiàn)的,所以,能取得的字段一定要聲明成public,如果是private的,就不能取到了。

          測(cè)試結(jié)果如下:

          uname?---?zywewqeqwe

          class?is?:?class?org.zy.demo.sd.bean.User

          private?field?is?:?private?java.lang.String?org.zy.demo.sd.bean.User.uname

          upass?---?zywqeqweqweqw

          class?is?:?class?org.zy.demo.sd.bean.User

          private?field?is?:?private?java.lang.String?org.zy.demo.sd.bean.User.upass

          解決上面的問(wèn)題,我們可以使用另外一個(gè)方法:

          ?

          ????Field?f?=?c.getDeclaredField(pn);

          ????out.println("?private?field?is?:?"?+?f?+?"<br>");

          就這一個(gè)方法的不同就可以實(shí)現(xiàn)和上面的不同的結(jié)果,上面的

          ?Field?f?=?c.getField(pn);

          可以能取public的字段,但是

          getDeclaredField(pn);

          同時(shí)可以取到private字段的值。

          注意:

          上面的功能要能實(shí)現(xiàn),要保證form的字段和bean定義的字段的完全一致。

          希望自己的一點(diǎn)小小的體會(huì)能對(duì)您起到一點(diǎn)幫助作用。



          |----------------------------------------------------------------------------------------|
                                     版權(quán)聲明  版權(quán)所有 @zhyiwww
                      引用請(qǐng)注明來(lái)源 http://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2007-09-21 18:08 zhyiwww 閱讀(1203) 評(píng)論(2)  編輯  收藏 所屬分類: j2ee

          FeedBack:
          # re: Web開(kāi)發(fā)中使用反射為Bean賦值
          2007-09-22 00:05 | 千里冰封
          反射用得好的話,是很靈活的  回復(fù)  更多評(píng)論
            
          # re: Web開(kāi)發(fā)中使用反射為Bean賦值
          2007-09-22 07:28 | sitinspring
          文章不錯(cuò),格式可以稍微調(diào)整一下.  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 玉环县| 彭泽县| 仲巴县| 湖南省| 新津县| 沁水县| 信丰县| 华安县| 当涂县| 呼和浩特市| 西贡区| 托克托县| 承德市| 顺平县| 金秀| 永德县| 贵定县| 云霄县| 新疆| 台南县| 恩施市| 灵寿县| 罗源县| 思茅市| 阿荣旗| 始兴县| 绿春县| 成安县| 绥滨县| 卫辉市| 平顶山市| 阜新| 汉沽区| 乌拉特后旗| 隆安县| 高州市| 逊克县| 黄骅市| 化隆| 万州区| 宝丰县|