1. 程式人生 > >jQuery中ajax的使用

jQuery中ajax的使用

java 下常見的json類庫都有Gson,JSON_lib 和 jackson等,但 jackson相對來說比較高效,在專案中主要也是使用jackson進行json和Java物件轉換;

那麼什麼是jackson呢  ?

  1):Jackson是一個簡單基於Java應用庫,Jackson可以輕鬆的將Java物件轉換成json物件    和xml文件,同樣也可以將json、xml轉換成Java物件

     1.1):Java物件轉成json字串

package com.damei.entity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Temp1 {

	public static void main(String[] args) throws JsonProcessingException {
		/*
		 * ObjectMapper類是Jackson庫的主要類。它提供一些功能將轉換成Java物件匹配JSON結構,
		 */
		ObjectMapper oMapper = new ObjectMapper();
		
		//json物件
		Student student1 = new Student("s001","黃");
		Student student2 = new Student("s002","黃圓");
		/*
		 * oMapper.writeValueAsString將Java物件轉成json字串
		 */
		System.out.println(oMapper.writeValueAsString(student1));
		
		//json陣列
		List<Student> listStu = new ArrayList<Student>();
		
		listStu.add(student1);
		listStu.add(student2);
		
		String writeValueAsString = oMapper.writeValueAsString(listStu);
		
		System.out.println(writeValueAsString);
		
		
		//json混合
		Map<String, Object> map = new HashMap<>();
		
		map.put("hello",6);
		
		map.put("studentS", listStu);
		
		String writeValueAsString2 = oMapper.writeValueAsString(map);
		
		System.out.println(writeValueAsString2);
	}
}

d

1.2):javaBean 與 map 集合轉換成json字串是一樣的   

package com.damei.entity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * javaBean 與 map 集合轉換成json字串是一樣的
 * @author Administrator
 *
 */
public class Temp3 {

	public static void main(String[] args) throws JsonProcessingException {
		//物件
		Map<String, Object> map1 = new HashMap<>();
		
		map1.put("sid","s001");
		
		map1.put("sname", "胡");
		
		ObjectMapper mapper = new ObjectMapper();
		
		System.out.println(mapper.writeValueAsString(map1));
		
		Map<String, Object> map2 = new HashMap<>();
		 
        map2.put("sid","s002");
		
		map2.put("sname", "胡2");
		
		//陣列
		List<Map<String,Object>> list1 = new ArrayList<>();
		
		list1.add(map1);
		
		list1.add(map2);
		
		System.out.println(mapper.writeValueAsString(list1));
		
		//混合
		Map<String, Object> map3 = new HashMap<>();
		
		map3.put("hello", 521);
		
		map3.put("Student", list1);
		
		System.out.println(mapper.writeValueAsString(map3));
	}
}

cc

1.3):講解 json 雙向綁值 死迴圈     

package com.damei.entity;

import java.util.HashSet;
import java.util.Set;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * 講解 json 雙向綁值 死迴圈     
 * @author Administrator
 *
 */
public class Temp2 {

	public static void main(String[] args) throws JsonProcessingException {
		Student student1 = new Student("s001","胡");
		
		Student student2 = new Student("s002","H Y Y");
		
		Teacher teacher1 = new Teacher("t001", "嗯哈1", null);
		
		Teacher teacher2 = new Teacher("t002", "嗯哼2", null);
		
		Set<Teacher> teachers = new HashSet<>();
		
		teachers.add(teacher1);
		
		teachers.add(teacher2);
		
		student1.setSetT(teachers);    //一個學生裝著兩個老師
		
		Set<Student> students = new HashSet<>();
		
		students.add(student1);
		
		students.add(student2);
		
		teacher2.setSetS(students);    //一個老師裡有兩個學生(兩邊互相呼叫會進行死迴圈)


		ObjectMapper oMapper = new ObjectMapper();
		
		System.out.println(oMapper.writeValueAsString(student1));  //輸出時出現死迴圈問題
		
	}
}

z

解決方案:    1): 將雙向繫結改成單向繫結   (將彼此之間的關係交予一方維護)

  2):用 @JsonIgnore/程式控制一個屬性 

z

 jQuery的ajax請求(與後臺進行互動)

首先我們寫一個JsonBasedao來寫那個dao方法  一個查詢方法  然後在dao方法繼承JsonBasedao 來進行對應的SQL語句處理  再通過servlet配置呼叫  之後就通過jsp頁面訪問


			public List<Map<String, Object>> foreach(ResultSet rs) throws InstantiationException, IllegalAccessException, SecurityException, IllegalArgumentException, SQLException{
			/*
			 * 建立一個實體類的實列
			 * 給建立的實體類屬性賦值
			 * 將新增完成的實體類加到list集合裡面去
			 */
			List<Map<String, Object>> list=new ArrayList<>();
			//獲取原資料
			ResultSetMetaData metaData = rs.getMetaData();
			//獲取列
			int columnCount = metaData.getColumnCount();
			Map<String, Object> map = null;
			while(rs.next()) {
				map = new HashMap<>();
				for (int i = 1; i < columnCount; i++) {
					//拿到 資料庫裡面每個列名下的不同值
					map.put(metaData.getColumnName(i), rs.getObject(i));
				}
				//將map集合裡面的值加到list容器裡去
				list.add(map);
			}
			//返回list
			return list;
		}
public class JsonUtitls {

	/** 用來處理json資料
	 * 在這裡面拿到我們所需要用到的查詢維度   用於sql語句拼接
	 * @param pareMap   獲取從jsp頁面傳遞到後臺的引數集合
	 * @param key    值     
	 * @return
	 */
	public static String getPareMap(Map<String,String[]> pareMap,String key) {
		if(pareMap != null && pareMap.size()>0) {
			String[] values = pareMap.get(key);
			if(values != null && values.length>0) {
				String value = Arrays.toString(values);
				return value.substring(1, value.length()-1);
			}
			return "";
		}
		return "";
	}

public class RegionDao extends RegionBaesDao{

	/**
	 * 用來查詢方法
	 * @throws SQLException 
	 * @throws InstantiationException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 */
	public List<Map<String, Object>> findAll(Map<String,String[]> pareMap,PageBean pageBean) throws IllegalArgumentException, IllegalAccessException, InstantiationException, SQLException{
		String id = JsonUtitls.getPareMap(pareMap, "ID");
		String sql = "select * from ch_region where true";
		if(StringUtils.isBlank(id)) {
			sql += " and parent_id=7459";
		}else {
			sql += " and parent_id="+id;
		}
		return super.ExecuteQuery(sql, null);
	}
	

jsp頁面可直接呼叫自己寫的js裡面Ajax程式碼就能直接獲取

 自己寫的一個function程式入口 然後呼叫Ajax直接去掉那個url重新整理 當點選一個值會進行區域性重新整理 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="${pageContext.request.contextPath}/easy/jquery.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/easy/ajax.js"></script>
<title>Insert title here</title>
</head>
<body>
<div>
<!-- 傳一個全限類名id過去 -->
<input type="hidden" id="ctx" value="${pageContext.request.contextPath}"/>
	
	<div>
		收貨地址&nbsp;&nbsp;
		<select id="province">
			<option selected="selected">---請選擇省份---</option>
		</select>&nbsp;&nbsp;
		<select id="city">
			<option selected="selected">---請選擇城市---</option>
		</select>&nbsp;&nbsp;
		<select id="county">
			<option selected="selected">---請選擇縣區---</option>
		</select>
	</div>
</div>
</body>
</html>
$(function(){
	var c = $("#ctx").val();  //獲取頁面傳過來的隱藏id
	
	$.ajax({
		url:c+"/regionServlet",   //獲取到servlet裡面方法物件
	    success:function(data){   //請求成功後的回撥函式
	    	for(index in data){   //遍歷每一個值  
//	    		console.log(data[index]);
	    		$("#province ").append("<option value='"+data[index].ID+"'>"+data[index].REGION_NAME+"</option>");
	    	}
	    },
	    dataType:"json"         //把型別變成json型別物件object

	});
	
	$("#province").change(function(){     //獲取省份的id並且加上change事件
		$("option:gt(0)","#city").remove();   //當執行改變他的值的時候其他的要清空上次的內容 不然會疊加
		$("option:gt(0)","#county").remove();  //屬於這個option裡第一位後面的全部移除
		$.ajax({                                   //再發一次ajax請求過去拿到這個id的所有option
			url:c+"/regionServlet?ID="+this.value,
		    success:function(data){
		    	for(index in data){
//		    		console.log(data[index]);
		    		$("#city ").append("<option value='"+data[index].ID+"'>"+data[index].REGION_NAME+"</option>");
		    	}
		    },
		    dataType:"json"
		});
	});
	
	$("#city").change(function(){
		$("option:gt(0)","#county").remove();
		
		$.ajax({
			url:c+"/regionServlet?ID="+this.value,
		    success:function(data){
		    	for(index in data){
		    		console.log(data[index]);
		    		$("#county").append("<option value='"+data[index].PARENT_ID+"'>"+data[index].REGION_NAME+"</option>");
		    	}
		    },
		    dataType:"json"
		});
	});
	
})