2014-02-12 46 views
0

問題sessionScope的HashMap和複選框

我有嚴重的問題(也許它更多的理解問題?)其中sessionScope只是不希望與我合作?這是事情:

  • 我的網站有很多checboxes。當單擊一個時,ajax調用用於將checbox信息存儲到sessionScope hashmap中。這工作。
  • 如果您取消選中複選框,則會再次執行ajax調用,這次它會從sessionScrope hashmap中刪除條目。這工作。
  • 檢查和取消選中作爲魅力,因爲我在每個ajax調用後列出hashmap,以查看調試信息。

現在......如果我用複選框刷新我的主站點,另一個javascript會採用sessionScope hashmap並檢查存儲在sessionScope hashmap中的複選框。很自我解釋,對嗎?

那麼,我刷新網站後,它看起來像頁面採用PREVIOUS sessionScope HashMap(意思是在我刷新頁面之前)。但是,它並沒有在這裏結束。第二次刷新後,它顯示正確的結果。第三次刷新後,它顯示之前的HashMap狀態,因此它保持不變。 :|

我在這裏錯過了什麼嗎?而且,只要我刷新,HashMap現在是從以前的狀態,而不寫任何東西,只是讀它。

這怎麼可能?

請幫我理解這件事情,因爲我不知道是怎麼回事......

最好的問候,

格雷戈爾

UPDATE(代碼):

複選框頁面:

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" 
    xmlns:xc="http://www.ibm.com/xsp/custom"> 

    <xp:this.resources> 
     <xp:styleSheet href="/gama.css"></xp:styleSheet> 
     <xp:styleSheet 
      href="#{javascript:ROOT_PATH}/js/jquery-ui/css/smoothness/jquery-ui-1.10.3.custom.min.css"> 
     </xp:styleSheet> 
     <xp:script src="/global.jss" clientSide="false"></xp:script> 
     <xp:script src="#{javascript:ROOT_PATH}/js/jquery-2.0.3.min.js" 
      clientSide="true"> 
     </xp:script> 
     <xp:script 
      src="#{javascript:ROOT_PATH}/js/jquery-ui/js/jquery-ui-1.10.3.custom.min.js" 
      clientSide="true"> 
     </xp:script> 
     <xp:script src="#{javascript:ROOT_PATH}/gama.js" 
      clientSide="true"> 
     </xp:script> 
    </xp:this.resources> 


    <xp:this.data> 

     <xp:dominoView var="view1" databaseName="***HIDDEN***.nsf" 
      viewName="dflt"> 
     </xp:dominoView> 
    </xp:this.data> 

    <xp:table style="width:80.0%" border="1"> 
     <xp:tr> 
      <xp:td 
       style="width:100.0px;border-bottom: 1px solid #e8e8e8;" valign="top" 
       styleClass="xspPanelViewColumnHeader"> 
       <xp:br></xp:br> 
       10.5.* 
      </xp:td> 
      <xp:td valign="top" 
       style="border-bottom: 1px solid #e8e8e8;width:auto"> 
       <xp:checkBox text="10.5.33" id="checkBox3"></xp:checkBox> 
       <xp:checkBox text="10.5.34" id="checkBox4"></xp:checkBox> 
       <xp:checkBox text="10.5.35" id="checkBox5"></xp:checkBox> 
       <xp:checkBox text="10.5.38" id="checkBox6"></xp:checkBox> 
       <xp:checkBox text="10.5.39" id="checkBox7"></xp:checkBox> 
       <xp:checkBox text="10.5.40" id="checkBox8"></xp:checkBox> 
       <xp:br></xp:br> 
       <xp:checkBox text="10.5.49" id="checkBox9"></xp:checkBox> 
       <xp:checkBox text="10.5.50" id="checkBox10"></xp:checkBox> 
       <xp:checkBox text="10.5.51" id="checkBox11"></xp:checkBox> 
       <xp:checkBox text="10.5.54" id="checkBox12"></xp:checkBox> 
       <xp:checkBox text="10.5.55" id="checkBox13"></xp:checkBox> 
       <xp:checkBox text="10.5.56" id="checkBox14"></xp:checkBox> 
      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td styleClass="xspPanelViewColumnHeader" valign="top" 
       style="border-bottom: 1px solid #e8e8e8;"> 
       10.6.* 
      </xp:td> 
      <xp:td style="border-bottom: 1px solid #e8e8e8;"> 
       <xp:checkBox text="10.6.32" id="checkBox15"></xp:checkBox> 

      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td styleClass="xspPanelViewColumnHeader" 
       style="border-bottom: 1px solid #e8e8e8;"> 
       192.* 
      </xp:td> 
      <xp:td style="border-bottom: 1px solid #e8e8e8;"> 

      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td styleClass="xspPanelViewColumnHeader" 
       style="border-bottom: 1px solid #e8e8e8;"> 
       193.* 
      </xp:td> 
      <xp:td style="border-bottom: 1px solid #e8e8e8;"> 

      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td styleClass="xspPanelViewColumnHeader" 
       style="border-bottom: 1px solid #e8e8e8;"> 
       10.21.* 
      </xp:td> 
      <xp:td style="border-bottom: 1px solid #e8e8e8;"> 


       <xp:checkBox text="10.21.8" id="checkBox2"></xp:checkBox> 
       <xp:checkBox text="10.21.12" id="checkBox1"></xp:checkBox> 
      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td styleClass="xspPanelViewColumnHeader" valign="top"> 
       172.24.* 
      </xp:td> 
      <xp:td> 

      </xp:td> 
     </xp:tr> 
    </xp:table> 
    <xp:br></xp:br> 


    <div id="container"></div> 



    <xp:eventHandler event="onClientLoad" submit="true" 
     refreshMode="norefresh"> 
     <xp:this.action><![CDATA[#{javascript: 

     // GET INFO FROM NETKEYS SESSIONSCOPE AND SAVE IT TO JSON FORMAT 
     sessionScope.netKeys = (sessionScope.netKeys || new java.util.HashMap()); 
     var netKeysJSON:com.ibm.commons.util.io.json.JsonJavaObject = 
      new com.ibm.commons.util.io.json.JsonJavaObject(); 

     var arr_key = sessionScope.netKeys.keySet(); 
     //print ("Printing netKeys"); 
     for (x in arr_key) { 
      print(x +" > "+ sessionScope.netKeys[x]); 
      netKeysJSON.put(x, sessionScope.netKeys[x]); 
     } 
     sessionScope.netKeysJSON = ""; 
     sessionScope.netKeysJSON = netKeysJSON.toString(); 


     }]]></xp:this.action> 
     <xp:this.script><![CDATA[ 

     // READ ALL JSON ENTRIES AND CHECK SPECIFIC CHECKBOXES! 
     myVar = '#{javascript:sessionScope.get("netKeysJSON")}'; 

     //print("Printing JSON"); 
     if (myVar.length > 0) { 

      var arr = $.parseJSON(myVar); 

      for(key in arr) { 
       console.log(key +" >> "+ arr[key]); 

       //$("label[for='"+ key +"']").remove(); 
       $("input[id='"+ key +"']").prop('checked', true); 
       loadNetsInfo(arr[key], key, true); 
      } 

     } 

]]></xp:this.script> 
    </xp:eventHandler> 
</xp:view> 

AJAX頁面:

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" rendered="false"> 


    <xp:this.afterRenderResponse><![CDATA[#{javascript: 
    var writer = facesContext.getResponseWriter(); 
    sessionScope.netKeys = (sessionScope.netKeys || new java.util.HashMap()); 

    var act = param.get("act"); 
    var ip = param.get("ip"); 
    var id = param.get("id"); 

    /** 
    * problem! 
    **/ 
    if (ip == null || ip.length == 0 || 
     id == null || id.length == 0 || 
     act == null || act.length == 0) 
    { 
     writer.write("ERROR: No parameters specified."); 
     writer.endDocument(); 
     return false; 
    } 

    // NO PROBLEM! 

    // REMOVE 
    if (act == "rem") { 
     sessionScope.netKeys.remove(id); 
     print("Removed "+ id +" from netKeys"); 
    } 

    // LIST ALL 
    else if (act == "list") { 
    print("List of all items in HashMap ("+ sessionScope.netKeys.size() +")"); 
     var arr_key = sessionScope.netKeys.keySet(); 
     for (x in arr_key) { 
      print(x +" > "+ sessionScope.netKeys[x]); 
      //netKeysJSON.put(x, sessionScope.netKeys[x]); 
     } 
    } 

    // WIPE ALL 
    else if (act == "wipe") { 
     sessionScope.netKeys = null; 
     sessionScope.remove("netKeys"); 
     print("Array netKeys wiped."); 
    } 

    // ADD + VIEW 
    else if (act == "view") { 
     var output = "<table style=\"display: inline-table; width: 150px;\" id=\"subnet_"+ ip +"\" border='1'><tr><td colspan=\"2\"><b>"+ ip +"</b></td></tr>"; 

     sessionScope.netKeys.put(id, ip); 
     //writer.write("*** "+ sessionScope.netKeys.get(id)); 

     // start getting info now... 

     var db:NotesDatabase = session.getDatabase("", "***HIDDEN***.nsf"); 
     var doc:NotesDocument = null; 


     //////////////// 
     // subnet info 
     ////////////////   
     //var formula:string = "Subject=\"" + requestScope.query + "\""; 
     var formula:string = "Form = \"SubnetInfo\" & subnet = \""+ ip +"\""; 
     var dc:NotesDocumentCollection = db.search(formula); 
     //print(formula); 

     if (dc.getCount() > 0) { 
      doc = dc.getFirstDocument(); 
      var desc = doc.getMIMEEntity("description").getContentAsText(); 
      output += "<tr><td colspan=\"2\">"+ desc +"</td></tr>"; 
     } 

     else { 
      print ("ID "+ id +" & IP "+ ip +" doesn't have any info. Removing entry."); 
      sessionScope.netKeys.remove(id); 
     } 

     //////////////// 
     // ip's 
     //////////////// 
     var formula:string = "Form = \"IP\" & Net = \""+ ip +"\""; 
     dc = db.search(formula); 
     //print("dc count: "+ dc.getCount()); 

     doc = dc.getFirstDocument(); 

     while (doc != null) { 
      var docURL = "NetsSingle.xsp?action=editDocument&documentId=" + doc.getNoteID(); 
      //print(docURL); 
      output += "<tr><td><a href=\""+ docURL +"\">"+ doc.getItemValueInteger("IP") +"</a></td><td>"+ ((doc.getItemValueString("inUseFor").length == 0) ? "&nbsp" : doc.getItemValueString("inUseFor")) +"</td></tr>"; 

      doc = dc.getNextDocument(); 
     } 


     output += "</table>"; 
     writer.write(output); 

    } // end: ADD + VIEW 


writer.endDocument(); 
}]]></xp:this.afterRenderResponse> 

</xp:view> 

AJAX的函數調用(即運行的JavaScript選中/取消選中複選框時):

function loadNetsInfo(ip, id, add) { 
    var url = "_netsGetInfo.xsp?act="+ ((add == true) ? "view" : "rem") +"&ip="+ ip +"&id="+ id; 

    //alert(url); 

    $.ajax({ 
     url: url, 
     cache: false, 
     success: function(result){ 

     if (add == true) { 
      $("#container").append(result); 
     } 
     else { 
      $("[id='subnet_"+ ip +"']").remove(); 
     } 

    }}); 
} 

SOLUTION

由於@stwissel他回答我的問題的建議,他是我所做的一切,確定了一切。與此同時,我還優化並替換了JavaScript,這固定了代碼過程!

faces-config.xml(通過Package Explorer打開)。注意,我試圖創建自己的類(可以擴展HashMap),但是我不需要它,所以唯一合乎邏輯和簡單的方法就是添加HashMap類型的會話作用域託管bean。

<managed-bean> 
    <managed-bean-name>checkBoxStatus</managed-bean-name> 
    <managed-bean-class>java.util.HashMap</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> 

在我的主網頁,所有複選框被現在託管bean處理,看上去像是:

<xp:checkBox text="10.5.33" id="checkBox3" value="#{checkBoxStatus['10.5.33']}"></xp:checkBox> 

所以此值是真還是假,這意味着檢查與否。所以HashMap的樣子

checkBoxStatus['10.5.33'] = true; 
checkBoxStatus['10.1.31'] = true; 
checkBoxStatus['192.168.1'] = false; 
checkBoxStatus['10.6.207'] = true; 

上面的代碼只需選中或取消選中的複選框,這取決於我們在面形成豆。

現在,而不是創建從會話數組JSON字符串,然後使用Ajax調用,我只是通過我的複選框的循環,他們的ID開始/使用複選框結束從服務器recieveing信息:

<xp:this.script><![CDATA[ 
// GO THROUGH ALL CHECKED ELEMENTS, CALL _netsGetInfo 
$("input[id*='checkBox']:checked").each(function(index) { 
     var id = $(this).attr('id'); 
     var ip = $("label[for='"+ id +"']").text(); 
     var ip_clean = ip.replace(/\./g, "_"); 

     console.log(index + ": " + id +", "+ ip +", "+ ip_clean); 
     loadNetsInfo(ip, id, true); 
}); 
]]></xp:this.script> 

的_netsGetInfo.xsp不像以前那樣管理任何會話HashMap。

案例關閉,一切正常!

非常感謝stwissel和stackoverflow社區。 IBM Developerworks社區可悲地根本沒有幫助。

+0

如果我們真的能夠看到你正在運行的代碼 - 這很可能是問題出在那裏。 – Krease

+0

@Chris我已經用代碼更新了我的條目。感謝您的迅速回復。 – gregor

回答

2

不推薦在更改複選框的情況下運行服務器往返。這是我會做的:將你的複選框綁定到一個託管bean。例如,將其稱爲checkboxstatus。然後你的複選框有值=「#{checkboxstatus ['someid']}」綁定將確保值得到正確更新。 然後,您可以決定每個箱子的更改是否發回,或者您只需將其發送回用戶想要執行的操作。 這個bean可以是一個默認的HashMap