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

          同事代碼:
           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"//配置文件中配置的二級聯動的二級控件的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的相關代碼:
           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    }

          檢查了半天,發現只要不執行initSelectValues,都沒有問題,后來一步一步調試才發現,原來是數據類型的問題,同事傳入的是List<Integer> values,而SelectItem構造函數支持的是鍵值都為String的參數,數據類型不對導致了這一個奇怪的現象,但后臺沒有異常和出錯信息讓人很納悶,解決方法就是只要改變值列表為List<String>就可以了。

          ---------------------------------------------------------
          專注移動開發

          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
          感覺很久沒有看到關于JSF的文章了呢,呵呵!  回復  更多評論
            
          # re: [JSF]手動初始化選擇控件 頁面所有action均失效的問題 2009-11-19 08:39 | TiGERTiAN
          @huliqing
          可能用的不多吧,開發了幾個項目,感覺jsf還是有些不方便的地方,不過小項目練練手還是不錯的,呵呵。  回復  更多評論
            
          主站蜘蛛池模板: 青河县| 广水市| 安多县| 北安市| 乐业县| 毕节市| 泰顺县| 安吉县| 开封县| 隆子县| 睢宁县| 建阳市| 武宣县| 荥经县| 北流市| 广安市| 香格里拉县| 綦江县| 蕲春县| 海丰县| 茂名市| 西峡县| 台安县| 积石山| 裕民县| 襄樊市| 和平区| 中西区| 屏山县| 怀仁县| 乌鲁木齐县| 通海县| 万载县| 黎平县| 台南市| 涟水县| 山东省| 枣阳市| 上蔡县| 巨野县| 湘阴县|