我有嚴重的問題(也許它更多的理解問題?)其中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) ? " " : 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社區可悲地根本沒有幫助。
如果我們真的能夠看到你正在運行的代碼 - 這很可能是問題出在那裏。 – Krease
@Chris我已經用代碼更新了我的條目。感謝您的迅速回復。 – gregor