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

          同事代碼:
           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"//配置文件中配置的二級聯(lián)動的二級控件的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("--請選擇--");
          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,都沒有問題,后來一步一步調(diào)試才發(fā)現(xiàn),原來是數(shù)據(jù)類型的問題,同事傳入的是List<Integer> values,而SelectItem構(gòu)造函數(shù)支持的是鍵值都為String的參數(shù),數(shù)據(jù)類型不對導(dǎo)致了這一個奇怪的現(xiàn)象,但后臺沒有異常和出錯信息讓人很納悶,解決方法就是只要改變值列表為List<String>就可以了。

          ---------------------------------------------------------
          專注移動開發(fā)

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

          評論:
          # re: [JSF]手動初始化選擇控件 頁面所有action均失效的問題 2009-11-19 01:12 | huliqing
          感覺很久沒有看到關(guān)于JSF的文章了呢,呵呵!  回復(fù)  更多評論
            
          # re: [JSF]手動初始化選擇控件 頁面所有action均失效的問題 2009-11-19 08:39 | TiGERTiAN
          @huliqing
          可能用的不多吧,開發(fā)了幾個項(xiàng)目,感覺jsf還是有些不方便的地方,不過小項(xiàng)目練練手還是不錯的,呵呵。  回復(fù)  更多評論
            
          主站蜘蛛池模板: 三台县| 长岭县| 新余市| 平潭县| 庆云县| 怀集县| 班玛县| 瑞昌市| 嵊州市| 英德市| 旬阳县| 观塘区| 阳朔县| 潢川县| 宁陕县| 仪陇县| 田东县| 五大连池市| 无极县| 龙陵县| 谷城县| 夏邑县| 兴隆县| 泸州市| 青阳县| 西和县| 浦北县| 乌兰浩特市| 沁水县| 措美县| 朝阳市| 桂平市| 三河市| 五河县| 濮阳市| 攀枝花市| 哈密市| 孝义市| 三明市| 仙居县| 宜春市|