zhyiwww
          用平實的筆,記錄編程路上的點點滴滴………
          posts - 536,comments - 394,trackbacks - 0
          ?

          我們在Web開發中,可能經常會從表單中取值,然后封裝成一個bean的時候。

          可能你也是這樣做的:

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

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

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

          或者

          U.set……

          u.set……

          等等

          如果字段很多的話,可能前面就要很多的各這樣的過程。也許你也會覺得很是麻煩,又沒有好的辦法。

          我們可以使用反射來實現,也許可以減輕一點您的負擔。

          代碼如下:

          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();

          ???}

          ??}

          ??我們也可以把這個部分封裝起來成一個類,實現從request到一個bean的注入。

          上面的方法有一個缺點,由于我們使用的Field來實現的,所以,能取得的字段一定要聲明成public,如果是private的,就不能取到了。

          測試結果如下:

          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

          解決上面的問題,我們可以使用另外一個方法:

          ?

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

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

          就這一個方法的不同就可以實現和上面的不同的結果,上面的

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

          可以能取public的字段,但是

          getDeclaredField(pn);

          同時可以取到private字段的值。

          注意:

          上面的功能要能實現,要保證form的字段和bean定義的字段的完全一致。

          希望自己的一點小小的體會能對您起到一點幫助作用。



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

          FeedBack:
          # re: Web開發中使用反射為Bean賦值
          2007-09-22 00:05 | 千里冰封
          反射用得好的話,是很靈活的  回復  更多評論
            
          # re: Web開發中使用反射為Bean賦值
          2007-09-22 07:28 | sitinspring
          文章不錯,格式可以稍微調整一下.  回復  更多評論
            
          主站蜘蛛池模板: 建昌县| 永泰县| 峨眉山市| 介休市| 河池市| 秦皇岛市| 江阴市| 遵义市| 林周县| 剑阁县| 长宁县| 泰顺县| 扎赉特旗| 望奎县| 镇沅| 筠连县| 泰宁县| 葵青区| 永川市| 承德市| 镇安县| 桐乡市| 灵山县| 定日县| 新巴尔虎右旗| 龙江县| 桂平市| 佛坪县| 抚松县| 井冈山市| 全州县| 邯郸市| 乐清市| 普陀区| 都昌县| 枞阳县| 巴彦淖尔市| 阜平县| 海林市| 东丰县| 永德县|