需要完成的任務:
主要是把JSP頁面上圖片ID傳給服務器端,服務器讀取cookie看是否有username,如果有則根據ID讀取MongoDB數據庫,讀出圖片URL,再存放到mysql中的collection數據庫中,實現了收藏功能。
第一步:就是使用ajax實現前后台的交互。
jsp頁面代碼:
<a id="1" class="bsc" onclick="collect(this.id)"></a>
js代碼:
<script>
function collect(id) { //var newwin=window.open()
var str=document.getElementById(id).src; var arr=str.split("/"); //切片 //alert(arr[5]);
var re = /\d+/g; // 每次匹配至少一個數字 且全局匹配 如果不是全局匹配,當找到數字123,它就會停止了。就只會彈出123.加上全局匹配,就會從開始到結束一直去搜索符合規則的。如果沒有加號,匹配的結果就是1,2,3,5,4,3,3,8,7,9並不是我們想要的,有了加號,每次匹配的數字就是至少一個了。
var num = arr[5].match(re); //取圖片名稱,再用正則表達式匹配數字
num = num[0]; alert(num);
//以上是實現獲取圖片ID的功能;
//判斷瀏覽器 if(window.ActiveXObject){ myAjaxObject = new ActiveXObject("Microsoft XMLHTP"); }else{ myAjaxObject = new XMLHttpRequest(); }
/*
1.open() 方法的 url 參數是服務器上文件的地址:該文件可以是任何類型的文件,比如 .txt 和 .xml,或者服務器腳本文件,
比如 .asp 和 .php (在傳回響應之前,能夠在服務器上執行任務),這里我是請求的是action,並把你想傳送的數據放在后面,具體見代碼。
2. 與 POST 相比,GET 更簡單也更快,並且在大部分情況下都能用。
然而,在以下情況中,請使用 POST 請求:
- 無法使用緩存文件(更新服務器上的文件或數據庫)
- 向服務器發送大量數據(POST 沒有數據量限制)
- 發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠
3.true還是false,true是表示異步請求,異步請求就是,請求完服務器,可以不用只等待服務器響應,可以去執行其他操作,直到收到服務器響應。
4.send()將請求發送到服務器
*/ myAjaxObject.open("post","collect.action?date="+num,true); myAjaxObject.onreadystatechange = actionResponse; //看下面函數 myAjaxObject.send(); } //獲取服務器響應
/*
responseText 獲得字符串形式的響應數據。
還有其他屬性,自行查找
這里我只測試讀取一個數據,多數據可以循環讀取
*/ function actionResponse(){ if(myAjaxObject.readyState==4){ if(myAjaxObject.status==200){ var returnJSONString = myAjaxObject.responseText; var returnJSON = JSON.parse(returnJSONString); var showString = ""; /*for(var i=0;i<returnJSON.length;i++){ showString = }*/ showString = returnJSON[0]; alert(showString); } } }
</script>
structs.xml代碼:
<action name="collect" class="action.collection" method="collect">
后台action代碼:
package action; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class collection extends ActionSupport{ public String collect() throws IOException{
//發送數據 List listString = new ArrayList(); listString.add("zx"); JSONArray json = JSONArray.fromObject(listString); System.out.println(json.toString()); ServletActionContext.getResponse().setContentType("text/html"); ServletActionContext.getResponse().setCharacterEncoding("utf-8"); ServletActionContext.getResponse().getWriter().printf(json.toString()); ServletActionContext.getResponse().getWriter().flush(); ServletActionContext.getResponse().getWriter().close();
//接收數據 String num = ServletActionContext.getRequest().getParameter("date");
System.out.println(num); return null; } }
以上代碼實現了簡單的數據接收發送。以上的后台發送的數據類型是list中存放String,根據自己需要。可以list中存放Bean,Map中存放字符串或Bean發送。
同理,前台傳送數據類型也可以根據需要改變類型
例如:
var info={
num:"data1",
num2:"data2",
}
完事了。接下來我要去實現讀取cookie數據,判斷用戶是否處於登錄狀態,希望對你有幫助,有錯誤或改進的地方歡迎指正。