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 閱讀(1213) 評論(2)  編輯  收藏 所屬分類: j2ee

          FeedBack:
          # re: Web開發中使用反射為Bean賦值
          2007-09-22 00:05 | 千里冰封
          反射用得好的話,是很靈活的  回復  更多評論
            
          # re: Web開發中使用反射為Bean賦值
          2007-09-22 07:28 | sitinspring
          文章不錯,格式可以稍微調整一下.  回復  更多評論
            
          主站蜘蛛池模板: 盱眙县| 甘南县| 南和县| 永泰县| 兴安盟| 建水县| 松溪县| 咸阳市| 贡觉县| 赤水市| 峨眉山市| 比如县| 涪陵区| 上林县| 安远县| 东港市| 黔西| 璧山县| 南靖县| 广灵县| 汽车| 周口市| 北辰区| 泰安市| 藁城市| 永宁县| 平潭县| 营山县| 海安县| 玉林市| 深泽县| 饶河县| 唐河县| 那曲县| 客服| 本溪| 抚宁县| 宁安市| 江源县| 军事| 昌平区|