1. 程式人生 > >回撥函式及返回Json的三種方法

回撥函式及返回Json的三種方法

回撥函式及返回Json的三種方法

1.回撥函式:

onreadystatechange 事件

當請求被髮送到伺服器時,我們需要執行一些基於響應的任務。

每當 readyState 改變時,就會觸發 onreadystatechange 事件。

readyState 屬性存有 XMLHttpRequest 的狀態資訊。

下面是 XMLHttpRequest 物件的三個重要的屬性:

屬性

描述

onreadystatechange

儲存函式(或函式名),每當 readyState 屬性改變時,就會呼叫該函式。

readyState

存有 XMLHttpRequest 的狀態。從 0 到 4 發生變化。

· 0: 請求未初始化(沒有呼叫send方法)

· 1: 伺服器連線已建立(socket已連線)

· 2: 請求已接收(獲取到了引數,沒有執行action方法)

· 3: 請求處理中(已經在執行action方法,未執行完)

· 4: 請求已完成,且響應已就緒(已經響應並且能獲取到最終的資料)

status

200: "OK"(響應的狀態)

404: 未找到頁面(未找到頁面)

onreadystatechange 事件中,我們規定當伺服器響應已做好被處理的準備時所執行的任務。

readyState 等於 4 且狀態為 200 時,表示響應已就緒:

xmlhttp.onreadystatechange=function()

  {

  if (xmlhttp.readyState==4 && xmlhttp.status==200)

    {

    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

    }

  }

2.返回Json的三種方法

第一種:

@Autowired
MyFoodDaoImpl mdi;
/**
 * 原始的輸出json方式
 * OutPutStream os;
 * os.write(通過第三方json-lib轉換json字串.getByte())
 * @param foodname
 * @param out
 * @return
 * @throws IOException
 */
@RequestMapping(value="/queryFood",method={RequestMethod.GET,RequestMethod.POST})
public String queryFood(String foodname,OutputStream out) throws IOException{
List<Map<String, Object>> list=mdi.queryAllFood(foodname);
JSONArray arry=JSONArray.fromObject(list);
String jsonStr=arry.toString();
out.write(jsonStr.getBytes("UTF-8"));
return null;
}


第二種:

/**
 * 直接返回 字元陣列 +必須寫@ResponseBody
 * 減少流的輸出動作程式碼
 * out.write(jsonStr.getBytes("UTF-8"));
 * @param foodname
 * @return
 * @throws IOException
 */
@ResponseBody
@RequestMapping(value="/queryFoodReturn",method={RequestMethod.GET})
public byte[] queryFoodReturn(String foodname) throws IOException{
List<Map<String, Object>> list=mdi.queryAllFood(foodname);
JSONArray arry=JSONArray.fromObject(list);
String jsonStr=arry.toString();
System.out.println(jsonStr.getBytes("UTF-8"));
return jsonStr.getBytes("UTF-8");
}


第三種:

@ResponseBody
	@RequestMapping(value="/queryFoodList",method={RequestMethod.GET})
	public List<Map<String, Object>> queryFoodList(String foodname) throws IOException{
		List<Map<String, Object>> list=mdi.queryAllFood(foodname);
		return list;
	}

配置訊息轉換器

<mvc:annotation-driven validator="localValidatorFactoryBean">
		<mvc:message-converters>
		<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter">
			<property name="supportedMediaTypes">
			<list>
				<value>text/html</value>
				<value>application/x-www-form-urlencoded</value>
			</list>
			</property>
		</bean>
		<!-- 配置返回對應解析成json的訊息轉換器 -->
			<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
				<property name="supportedMediaTypes">
					<list>
						<value>text/html</value>
						<value>application/x-www-form-urlencoded</value>
					</list>
				</property>
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>
<!-- 新增jacson的json解析庫    配置訊息轉換器 -->
  	<dependency>
	  <groupId>com.fasterxml.jackson.core</groupId>
	  <artifactId>jackson-core</artifactId>
	  <version>2.6.0</version>
	</dependency>
	<dependency>
	  <groupId>org.codehaus.jackson</groupId>
	  <artifactId>jackson-core-asl</artifactId>
	  <version>1.9.12</version>
	</dependency>
	<dependency>
	  <groupId>com.fasterxml.jackson.core</groupId>
	  <artifactId>jackson-annotations</artifactId>
	  <version>2.6.0</version>
	</dependency>
	<dependency>
	  <groupId>com.fasterxml.jackson.core</groupId>
	  <artifactId>jackson-databind</artifactId>
	  <version>2.6.0</version>
	</dependency>
	<dependency>
	  <groupId>org.codehaus.jackson</groupId>
	  <artifactId>jackson-mapper-asl</artifactId>
	  <version>1.9.12</version>
	</dependency>