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
          文章不錯,格式可以稍微調整一下.  回復  更多評論
            
          主站蜘蛛池模板: 咸阳市| 独山县| 固阳县| 乌审旗| 太康县| 象州县| 邛崃市| 丹棱县| 焦作市| 封丘县| 商都县| 福泉市| 珠海市| 新巴尔虎左旗| 乐业县| 敦化市| 弥勒县| 高阳县| 栾川县| 宁夏| 罗定市| 霸州市| 乳山市| 浠水县| 商南县| 印江| 新昌县| 荣成市| 钦州市| 尖扎县| 哈巴河县| 宜丰县| 克山县| 南昌市| 延吉市| 香港 | 花莲市| 揭东县| 长汀县| 丹东市| 彰武县|