隨筆-348  評(píng)論-598  文章-0  trackbacks-0
          最近寫(xiě)了一個(gè)JSF的動(dòng)態(tài)控件生成框架給項(xiàng)目組使用。昨天有個(gè)同事在使用的過(guò)程中遇到一個(gè)問(wèn)題,就是我生成的帶AjaxSupport的動(dòng)態(tài)控件在調(diào)用他自己寫(xiě)的方法之后出現(xiàn)了整個(gè)頁(yè)面的action均無(wú)效的情況,現(xiàn)象就是,兩個(gè)級(jí)聯(lián)下拉,當(dāng)?shù)匾粋€(gè)下拉選項(xiàng)改變時(shí),觸發(fā)他寫(xiě)的方法,他改變第二個(gè)下拉,但是當(dāng)重復(fù)該操作之后就無(wú)效了,也沒(méi)有錯(cuò)誤和異常,代碼如下:

          同事代碼:
           1 public void bignessDangeValueChangeListener(ActionEvent e) {
           2         //System.out.println(e.getComponent().getParent().getChildCount());
           3         org.ajax4jsf.component.html.HtmlAjaxSupport ajaxSupport = (org.ajax4jsf.component.html.HtmlAjaxSupport)e.getComponent();
           4         HtmlSelectOneMenu parent = (HtmlSelectOneMenu)ajaxSupport.getParent();
           5         Short value = (Short)parent.getValue();
           6         String[] idDetails = parent.getId().split("_");
           7         StringBuffer controlId = new StringBuffer();
           8         controlId.append(idDetails[0]);
           9         if (WebUtil.PROPS_FILE_NAME_TRASH_DISCHARGE.equals(idDetails[0])) {
          10             idDetails[1]="hazardousSubstance"//配置文件中配置的二級(jí)聯(lián)動(dòng)的二級(jí)控件的name字段
          11         }
          12         
          13         for (int i = 1;i < idDetails.length;i++){
          14             controlId.append("_").append(idDetails[i]);
          15         }
          16         
          17         ajaxSupport.setReRender(controlId.toString());
          18         
          19         List<BignessDangerInfo> list = Common.getBignessDangerInfoByObjType(value);
          20         List<String> labelList = new ArrayList<String>();
          21         List<Integer> valueList = new ArrayList<Integer>();
          22         for(BignessDangerInfo bdi : list) {
          23             labelList.add(bdi.getObjectName());
          24             valueList.add(String.valueOf(bdi.getRecuid()));
          25         }
          26         
          27 
          28         
          29         if(value == 1 || value == 2 || value == 3 || value == 4) {
          30             DynamicControlFactory.initSelectValues(e, idDetails[1], labelList, valueList);
          31         }  else {
          32             List<List<String>> listClear = new ArrayList<List<String>>();
          33             List<String> temp1 = new ArrayList<String>();
          34             List<String> temp2 = new ArrayList<String>();
          35             temp1.add("-1");
          36             temp2.add("--請(qǐng)選擇--");
          37             listClear.add(temp1);
          38             listClear.add(temp2);
          39             DynamicControlFactory.initSelectValues(e, idDetails[1], listClear.get(1), listClear.get(0));
          40         }
          41     }

          initSelectValues的相關(guān)代碼:
           1public static void initSelectValues(ActionEvent e, String col, List<String> labels, List<String> values)
           2    {
           3        try {
           4
           5            String[] parms = e.getComponent().getParent().getId().split("_");
           6            DynamicControlObject dco = getControlObjects().get(parms[0]);
           7            
           8            List<String> colList = dco.getColNameList();
           9            String prefix = dco.getFormName() + ":" + parms[0];
          10            
          11            Map cos = new HashMap();
          12            String rowIdx = parms[parms.length - 1];
          13
          14            initSelectOneComponent(findComponent(prefix + "_" + col + "_1" + "_"
          15                    + rowIdx),  values, labels, true);
          16        }
           catch (Exception ex) {
          17            ex.printStackTrace();
          18        }

          19    }

           1public static void initSelectOneComponent(UIComponent component,
           2            List<String> values, List<String> labels, boolean clearBefore) {
           3        try {
           4
           5            if (component == null || values == null || labels == null
           6                    )
           7                return;
           8
           9            if (!isMultiValue(component))
          10                return;
          11
          12            Object optionKey = null;
          13            String optionLabel = null;
          14            ArrayList optionsList = null;
          15
          16            UISelectItems items = new UISelectItems();
          17            optionsList = new ArrayList(values.size());
          18            for (int i = 0; i < values.size(); i++{
          19                optionKey = values.get(i);
          20                optionLabel = (String)labels.get(i);
          21                SelectItem item = new SelectItem(optionKey, optionLabel);
          22                optionsList.add(item);
          23            }

          24            items.setValue(optionsList);
          25            if(clearBefore)
          26            {
          27                List list = component.getChildren();
          28                Object obj = null;
          29                for(int i = 0;i < list.size(); i ++)
          30                {
          31                    if(list.get(i) instanceof UISelectItems )
          32                    {
          33                        obj = list.get(i);
          34                        break;
          35                    }

          36                }

          37                if(obj != null)
          38                    list.remove(obj);
          39            }

          40                
          41            component.getChildren().add(items);
          42        }
           catch (Exception e) {
          43            e.printStackTrace();
          44        }

          45
          46    }

          檢查了半天,發(fā)現(xiàn)只要不執(zhí)行initSelectValues,都沒(méi)有問(wèn)題,后來(lái)一步一步調(diào)試才發(fā)現(xiàn),原來(lái)是數(shù)據(jù)類(lèi)型的問(wèn)題,同事傳入的是List<Integer> values,而SelectItem構(gòu)造函數(shù)支持的是鍵值都為String的參數(shù),數(shù)據(jù)類(lèi)型不對(duì)導(dǎo)致了這一個(gè)奇怪的現(xiàn)象,但后臺(tái)沒(méi)有異常和出錯(cuò)信息讓人很納悶,解決方法就是只要改變值列表為L(zhǎng)ist<String>就可以了。

          ---------------------------------------------------------
          專(zhuān)注移動(dòng)開(kāi)發(fā)

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2009-11-18 09:02 TiGERTiAN 閱讀(1526) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): JavaJSF

          評(píng)論:
          # re: [JSF]手動(dòng)初始化選擇控件 頁(yè)面所有action均失效的問(wèn)題 2009-11-19 01:12 | huliqing
          感覺(jué)很久沒(méi)有看到關(guān)于JSF的文章了呢,呵呵!  回復(fù)  更多評(píng)論
            
          # re: [JSF]手動(dòng)初始化選擇控件 頁(yè)面所有action均失效的問(wèn)題 2009-11-19 08:39 | TiGERTiAN
          @huliqing
          可能用的不多吧,開(kāi)發(fā)了幾個(gè)項(xiàng)目,感覺(jué)jsf還是有些不方便的地方,不過(guò)小項(xiàng)目練練手還是不錯(cuò)的,呵呵。  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 茌平县| 漳州市| 昌都县| 南丹县| 阳曲县| 札达县| 南溪县| 兰考县| 青岛市| 庆安县| 资阳市| 时尚| 庄河市| 塔河县| 遂川县| 新巴尔虎左旗| 西和县| 忻州市| 龙门县| 望谟县| 纳雍县| 长寿区| 昌宁县| 昭平县| 郑州市| 萝北县| 大安市| 集安市| 乾安县| 延川县| 电白县| 台州市| 微博| 班戈县| 晋江市| 瓮安县| 集贤县| 罗城| 增城市| 宜川县| 乐都县|